zoukankan      html  css  js  c++  java
  • mysql8搭建innodb_cluster集群

    mysql版本 : mysql8
    集群所需最少实例 : 三台

    服务器IP及主机名:
    10.10.10.10 test10
    10.10.10.11 test11
    10.10.10.12 test12

    集群管理工具 : mysql-shell / mysql-route


    • 添加hosts记录(添加集群以及数据同步通过主机名交互数据)
    cat >> /etc/hosts << EOF
    10.10.10.10 mysql10 test10
    10.10.10.11 mysql11 test11
    10.10.10.12 mysql12 test12
    EOF
    
    • 修改mysql配置项(添加集群以及组复制设置)
    ###修改配置,允许组建集群
    performance_schema = 1
    server_id = 10
    gtid_mode = on
    enforce_gtid_consistency = 1
    
    ###配置组复制设置
    cat >> /usr/local/mysql/etc/my.cnf << EOF
    ####innodb clust
    transaction_write_set_extraction = XXHASH64
    loose-group_replication_group_name ="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
    loose-group_replication_start_on_boot = off
    loose-group_replication_local_address = "10.10.10.10:33306"
    loose-group_replication_group_seeds = "10.10.10.10:33306,10.10.10.11:33306,10.10.10.12:33306"
    loose-group_replication_bootstrap_group = off
    loose-group_replication_ip_whitelist = "10.10.10.0/24"
    #loose-group_replication_single_primary_mode = on
    EOF
    

    根据不同服务器设备不同的配置项{server_id , loose-group_replication_local_address}
    loose-group_replication_single_primary_mode = on 单主模式, off 多主模式

    • 创建集群所需账户(三台主机)
    mysql -uroot -p123456
     
    set sql_log_bin=0;
    CREATE USER 'cluster'@'10.10.10.%' IDENTIFIED BY '123456';
    GRANT ALL PRIVILEGES ON *.* TO 'cluster'@'10.10.10.%' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    set sql_log_bin=1;
    

    停用binlog日志创建用户
    因为该账户需要创建其他集群所需账户,所以需要赋予管理权限WITH GRANT OPTION
    需要加强权限策略,建议查询具体权限要求。

    • 管理机上安装集群管理工具
    rpm -ivh mysql-router*
    rpm -ivh mysql-shell*
    
    • 设置mysql集群
    ###配置各服务器为集群模式
    shell.connect('cluster@mysql10:3306');
    dba.configureLocalInstance();
     
    shell.connect('cluster@mysql11:3306');
    dba.configureLocalInstance();
     
    shell.connect('cluster@mysql12:3306');
    dba.configureLocalInstance();
     
    #######################################
     
    ###创建集群组,并将添加示例进集群组
    shell.connect('cluster@mysql10:3306');
    var cluster = dba.createCluster('sqlcluster');
    #将另外两台实例添加至集群中
    cluster.addInstance('cluster@mysql11:3306');
    cluster.addInstance('cluster@mysql12:3306');
    cluster.status();         #查看集群状态
    
    • 设置集群路由
    mysqlrouter --bootstrap cluster@mysql10:3306 --user=cluster
    
    • 查看集群状态
    #无权查看集群状态
    dba.getCluster();     #查看创建的集群
    cluster=dba.getCluster();    #获取当前集群
    cluster.status();         #查看集群状态
    
    • 查询节点名称()
    mysql -uroot -p123456
     
    > SELECT clusters.cluster_id,clusters.cluster_name from mysql_innodb_cluster_metadata.clusters
    
    节点状态 状态描述
    ONLINE 节点状态正常。
    OFFLINE 实例在运行,但没有加入任何Cluster。
    RECOVERING 实例已加入Cluster,正在同步数据。
    ERROR 同步数据发生异常。
    UNREACHABLE 与其他节点通讯中断,可能是网络问题,可能是节点crash。
    MISSING 节点已加入集群,但未启动group replication
    集群状态 状态描述
    OK 所有节点处于online状态,有冗余节点。
    OK_PARTIAL 有节点不可用,但仍有冗余节点。
    OK_NO_TOLERANCE 有足够的online节点,但没有冗余,例如:两个节点的Cluster,其中一个挂了,集群就不可用了。
    NO_QUORUM 节点处于online状态,但达不到法定节点数,此状态下Cluster无法写入,只能读取。
    UNKNOWN 不是online或recovering状态,尝试连接其他实例查看状态。
    UNAVAILABLE 组内节点全是offline状态,但实例在运行,可能实例刚重启还没加入Cluster。


    mysqlsh常用命令 (mysqlsh的JS语法)

    dba.checkInstanceConfiguration("root@hostname:3306")     #检查节点配置实例,用于加入cluster之前
     
    dba.rebootClusterFromCompleteOutage('myCluster');        #重启
     
    dba.dropMetadataSchema();                                #删除schema
     
    var cluster = dba.getCluster('myCluster')                #获取当前集群
     
    cluster.checkInstanceState("root@hostname:3306")         #检查cluster里节点状态
     
    cluster.rejoinInstance("root@hostname:3306")             #重新加入节点,我本地测试的时候发现rejoin一直无效,每次是delete后
     
    addcluster.dissolve({force:true})                       #删除集群
     
    cluster.addInstance("root@hostname:3306")                #增加节点
     
    cluster.removeInstance("root@hostname:3306")             #删除节点
     
    cluster.removeInstance('root@host:3306',{force:true})    #强制删除节点
     
    cluster.dissolve({force:true})                           #解散集群
     
    cluster.describe();                                      #集群描述
    


    常见故障处理

    • 节点服务器重启后未加入集群(重新加入集群)(多出现主节点)

    现象 : "status": "(MISSING)"
    执行cluster.rejoinInstance

    shell.connect('cluster@mysql10:3306');
    cluster=dba.getCluster();
    cluster.rejoinInstance("root@mysql12:3306")
    
    • 集群中所有服务器重启,所有节点都offline,直接获取集群信息失败

    查询数据库SELECT * FROM performance_schema.replication_group_members;
    仅显示单机 'MEMBER_STATE' = 'offline'
    使用SELECT clusters.cluster_id,clusters.cluster_name from mysql_innodb_cluster_metadata.clusters活着集群名称
    执行rebootClusterFromCompleteOutage命令,恢复集群

    shell.connect('cluster@mysql10:3306');
    dba.rebootClusterFromCompleteOutage('sqlcluster');
    
  • 相关阅读:
    set, bag, list, map的语义
    ExtJs 自定义Vtype验证
    详解.NET中的动态编译技术
    IL汇编语言介绍(译)
    C# 文件操作相关
    邮件系统
    关于Nhibernate中的多数据库支持
    .NET中 用C#操纵IIS
    ExtJS日期格式
    完全详解使用Resource实现多语言的支持
  • 原文地址:https://www.cnblogs.com/taoyuxuan/p/11585655.html
Copyright © 2011-2022 走看看