MySQL集群高可用架构之组复制 (MGR)
MySQL集群高可用架构之组复制 (MGR)
MGR是MySQL官方推出的高可用与高扩展集群解决方案。
MGR提供单主和多主两种模式,不仅实现了数据同步,更通过组协调机制保证事务一致性:所有成员必须对事务的全局顺序达成共识,每个节点独立但一致地决定提交或回滚。该系统具备内置脑裂保护——一旦发生网络分区导致无法达成多数共识,集群将暂停服务直至网络恢复,避免数据冲突。
底层依赖组通信系统(GCS)实现故障检测、成员管理和可靠的消息传递,为MGR提供基础通信保障。
1、组复制流程
首先我们将多个节点共同组成一个复制组,在执行读写(RW)事务的时候,需要通过一致性协议层(Consensus 层)的同意,也就是读写事务想要进行提交,必须要经过组里“大多数人”(对应 Node 节点)的同意,大多数指的是同意的节点数量需要大于 (N/2+1),这样才可以进行提交,而不是原发起方一个说了算。而针对只读(RO)事务则不需要经过组内同意,直接 提交 即可 。
2、组复制单主和多主模式
single-primary mode(单写或单主模式)
单写模式 group 内只有一台节点可写可读,其他节点只可以读。当主服务器失败时,会自动选择新的主服务器。
multi-primary mode(多写或多主模式)
组内的所有机器都是 primary 节点,同时可以进行读写操作,并且数据是最终一致的。
3、实现mysql组复制-单主模式
3.1 环境说明
主机名 | ip | 操作系统版本 | mysql版本 |
---|---|---|---|
master | 192.168.194.163 | rhel7.9 | mysql8.0.40 |
rep1 | 192.168.194.164 | rhel7.9 | mysql8.0.40 |
rep2 | 192.168.194.165 | rhel7.9 | mysql8.0.40 |
3.2 所有主机、库的设置
# 三个主机均需要配置hosts文件的解析,如果不配置域名解析则需要在/etc/my.cnf中加一条配置skip-name-resolve
[root@node1 ~]# vim /etc/hosts
192.168.194.163 master
192.168.194.164 rep1
192.168.194.165 rep2# 修改所有库的配置文件
[root@master ~]# vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log_timestamps=SYSTEM
# 设置日志时间和本地时间保持一致server_id=163
# 设置各自库的唯一标识disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
# 组复制,数据必须存储在 InnoDB 事务存储引擎中
gtid_mode=ON
#组复制要开启gtid
enforce_gtid_consistency=ON
log_bin=binlog
#默认开启
log_slave_updates=ON
#默认开启
binlog_format=ROW
#默认开启
transaction_write_set_extraction=XXHASH64
#默认开启,组复制使用此信息在所有组成员上进行冲突检测
plugin_load_add='group_replication.so'
#将组复制插件添加到服务器启动时加载的插件列表中
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
#告诉插件它正在加入或创建的组名为“aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa”
group_replication_start_on_boot=off
#插件在服务器启动时不自动启动操作,使用手动启动插件group_replication_local_address= "192.168.168.128:33061"
# 写各自库对应主机的IP
# 与其它主机通信时使用的网络地址和端口group_replication_group_seeds= "192.168.194.163:33061,192.168.194.164:33061,192.168.194.165:33061"
#设置组成员的主机名和端口
group_replication_bootstrap_group=off
#指示插件是否启动该组,在首次引导组时在一个服务器上启用
group_replication_ip_whitelist="192.168.194.0/24,127.0.0.1/8"
#仅允许白名单内的 IP 加入复制组
group_replication_recovery_use_ssl=on
#caching_sha2_password插件要求安全传输密码,开启主从之间的连接使用SSL/TLS # 重启服务
[root@master ~]#systemctl restart mysqld# 在所有的库中使用sql语句添加复制账号并授予权限
SET SQL_LOG_BIN=0;
CREATE USER rp@'%' IDENTIFIED BY '123';
GRANT REPLICATION SLAVE ON *.* TO rp@'%';
GRANT CONNECTION_ADMIN ON *.* TO rp@'%';
GRANT BACKUP_ADMIN ON *.* TO rp@'%';
GRANT GROUP_REPLICATION_STREAM ON *.* TO rp@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE REPLICATION SOURCE TO SOURCE_USER='rp', SOURCE_PASSWORD='123' FOR CHANNEL 'group_replication_recovery';
3.3 master的配置
# 查看是否有group_replication插件
mysql> show plugins;
| group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | GPL |
# 启动MGR集群
# 使用当前服务器作为引导服务器启动一个新的群组复制过程或者恢复一个已经存在的群组
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION USER='rp',PASSWORD='123';
SET GLOBAL group_replication_bootstrap_group=OFF;
# 查看组信息
mysql> SELECT * FROM performance_schema.replication_group_members;
3.4 从上的配置
# 开启组复制
mysql> START GROUP_REPLICATION USER='rp', PASSWORD='123';
# 查看组信息
mysql> SELECT * FROM performance_schema.replication_group_members;
3.5 检测
#测试主节点宕机
mysql> stop GROUP_REPLICATION;
#从库节点查看,发现仅剩2个节点,并且自动选举出主节点
mysql> SELECT * FROM performance_schema.replication_group_members;
4、实现mysql组复制-多主模式
修改所有库的配置文件,添加如下内容
[root@master ~]# vim /etc/my.cnf.d/mysql-server.cnf
#关闭单master模式
loose-group_replication_single_primary_mode=off
#多主一致性检查
loose-group_replication_enforce_update_everywhere_checks=ON# 重启服务
[root@master ~]#systemctl restart mysqld
#在其中一台主机里面执行以下mysql命令
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
#在另外两台主机里面执行以下mysql命令,开启组复制
mysql> START GROUP_REPLICATION;
mysql> SELECT * FROM performance_schema.replication_group_members;