MySQL 8.0高可用集群架构实战笔记
1. InnoDB Cluster概述
InnoDB Cluster是MySQL官方实现高可用+读写分离的架构方案,包含三大核心组件:
- MySQL Group Replication (MGR):主从同步高可用方案
- MySQL Shell:集群管理工具
- MySQL Router:业务流量入口,实现读写分离
官方文档:https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-innodb-cluster.html
2. 集群架构设计
典型的一主两从架构:
- 1个Primary节点(读写)
- 2个Secondary节点(只读)
- 数据通过组复制从主节点同步到从节点
3. 环境准备
3.1 容器化部署
bash
# 创建专用网络
docker network create --driver bridge --subnet 172.19.0.0/24 --gateway 172.19.0.1 mgr-network
# 创建数据目录
mkdir -p /mysql/mgr/node{1..3}/{data,conf,log}
3.2 关键配置项(以node1为例)
ini
[mysqld]
server_id=1
gtid_mode=ON
log-bin=mysql-bin
binlog_transaction_dependency_tracking=WRITESET
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
4. 集群搭建步骤
4.1 初始化检查
javascript
dba.checkInstanceConfiguration('root@mgr-node1:3306')
dba.configureInstance('root@mgr-node1:3306')
4.2 创建集群
javascript
var cluster = dba.createCluster('myCluster');
cluster.addInstance('root@mgr-node2:3306');
cluster.addInstance('root@mgr-node3:3306');
4.3 验证集群状态
javascript
cluster.status();
正常状态应显示:
"status": "OK",
"statusText": "Cluster is ONLINE and can tolerate up to ONE failure."
5. 故障转移测试
5.1 主节点切换
javascript
cluster.setPrimaryInstance('mgr-node2:3306')
5.2 节点恢复
javascript
cluster.rejoinInstance("root@mgr-node1:3306")
6. MySQL Router配置
bash
# 安装Router
wget https://downloads.mysql.com/archives/get/p/41/file/mysql-router-community-8.0.27-1.el7.x86_64.rpm
rpm -ivh mysql-router-*.rpm
# 启动路由
mysqlrouter &
端口说明:
- 6446:读写端口
- 6447:只读端口
7. InnoDB ReplicaSet方案
适用于主从复制场景,相比集群方案限制更多:
- 无自动故障转移
- 可能丢失部分数据
- 需要手动处理不一致情况
搭建命令:
javascript
var rs = dba.createReplicaSet("myrs");
rs.addInstance('root@rs-node2:3306');
8. 常用管理命令
功能 | 命令 |
---|---|
检查实例 | dba.checkInstanceConfiguration() |
添加节点 | cluster.addInstance() |
删除节点 | cluster.removeInstance() |
解散集群 | cluster.dissolve() |
切换主节点 | cluster.setPrimaryInstance() |
9. 注意事项
-
所有表必须包含主键,否则报错:
sqlERROR 3098 (HY000): The table does not comply with the requirements by an external plugin.
-
节点权重配置影响选举:
javascriptcluster.setInstanceOption('mgr-node1:3306', 'memberWeight', 80)