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');
原文地址:https://www.cnblogs.com/taoyuxuan/p/11585655.html