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');