MySQL MGR集群实践
1、MGR说明
MGR全称MySQL Group Replication(Mysql组复制),是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案。MGR提供了高可用、高扩展、高可靠的MySQL集群服务。在MGR出现之前,用户常见的MySQL高可用方式,无论怎么变化架构,本质就是Master-Slave架构。MySQL 5.7版本开始支持无损半同步复制(lossless semi-syncreplication),从而进一步提示数据复制的强一致性。
2、MySQL 复制机制
- MySQL异步复制
master事务的提交不需要经过slave的确认,slave是否接收到master的binlog,master并不care。slave接收到master binlog后先写relay log,最后异步地去执行relay log中的sql应用到自身。由于master的提交不需要确保slave relay log是否被正确接受,当slave接受master binlog失败或者relay log应用失败,master无法感知。
- MySQL半同步复制
基于传统异步存在的缺陷,mysql在5.5版本推出半同步复制。可以说半同步复制是传统异步复制的改进,在master事务的commit之前,必须确保一个slave收到relay log并且响应给master以后,才能进行事务的commit。但是slave对于relay log的应用仍然是异步进行的。
- MySQL组复制(MGR)
由若干个节点共同组成一个复制组,一个事务的提交,必须经过组内大多数节点(N 2 + 1)决议并通过,才能得以提交。如上图所示,由3个节点组成一个复制组,Consensus层为一致性协议层,在事务提交过程中,发生组间通讯,由2个节点决议(certify)通过这个事务,事务才能够最终得以提交并响应。引入组复制,主要是为了解决传统异步复制和半同步复制可能产生数据不一致的问题。组复制依靠分布式一致性协议(Paxos协议的变体),实现了分布式下数据的最终一致性,提供了真正的数据高可用方案。
3、MySQL组复制的特性和限制
-
高一致性,基于原生复制及paxos协议的组复制技术,并以插件的方式提供,提供一致数据安全保证;
-
高容错性,只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制;
-
高扩展性,节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息;
-
高灵活性,有单主模式和多主模式,单主模式下,会自动选主,所有更新操作都在主上进行;多主模式下,所有server都可以同时处理更新操作。
4、集群配置实践
这里以ubuntu20 和 mysql 8.0.30为例进行说明
准备三台服务器分别更改hostname
hostnamectl set-hostname master
hostnamectl set-hostname slave1
hostnamectl set-hostname slave2
sudo vi /etc/hosts 在每台服务器中添加其他节点
10.0.16.15 master
10.0.16.5 slave1
10.0.4.13 slave2
sudo vi /etc/mysql/my.cnf 配置文件分别修改master、slave1、slave2
[mysqld]
#为了只启用InnoDB,因为这个模式只支持InnoDB。防止后面自己坑自己,这条可以不写
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
# 唯一标识,组内的节点一定要 保持不一样
server_id=9
#开启 Replication with Global Transaction Identifiers模式
gtid_mode=ON
#只允许执行可以使用GTID安全记录的语句
enforce_gtid_consistency=ON
#禁用二进制的写检查
binlog_checksum=NONE
#这个为了防止修改主机名导致 复制出问题,XXXX自己填啥都可以,主机名不改这条可以不写.
#主机名改了,/etc/hosts 你的主机名和ip映射也要改。
relay-log=XXXX-relay-bin
#安装插件,写配置文件里,省的手动命令行忘记了
plugin_load_add='group_replication.so'
#组名,组内节点都一样
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
#是否随服务器启动而自动启动组复制,不建议直接启动,有时数据出问题,需要人为干预后,才能启动
group_replication_start_on_boot=off
#本地MGR的IP地址和端口,host:port,是MGR的端口,不是数据库的端口
group_replication_local_address= "master:33061"
#组内成员
group_replication_group_seeds= "master:33061,slave1:33061,slave2:33061"
#开启引导模式,添加组成员,用于第一次搭建MGR或重建MGR的时候使用,只需要在集群内的其中一台开启即可
group_replication_bootstrap_group=off
#显示指定使用IP
report-host = master
保存后重启数据库
systemctl mysql.service restart
mysql -uroot -p 连接主节点执行
#关闭主从同步
set sql_log_bin=0;
#创建同步用户
create user 'sroot'@'%' identified by '123123';
grant REPLICATION SLAVE on *.* to 'sroot'@'%';
flush privileges;
#开启主从同步
set sql_log_bin=1;
#连接组集群
CHANGE MASTER TO MASTER_USER='sroot', MASTER_PASSWORD='123123' FOR CHANNEL 'group_replication_recovery';
reset master;
#开启组引导
SET GLOBAL group_replication_bootstrap_group=ON;
start group_replication;
#关闭组引导
SET GLOBAL group_replication_bootstrap_group=OFF;
#添加组 白名单
set global group_replication_ip_whitelist = '10.0.16.15,10.0.16.5,10.0.4.13';
#查询组 集群成员
SELECT * FROM performance_schema.replication_group_members;
两个从节点执行
#关闭主从同步
set sql_log_bin=0;
#创建同步用户
create user 'sroot'@'%' identified by '123123';
grant REPLICATION SLAVE on *.* to 'sroot'@'%';
flush privileges;
#开启主从同步
set sql_log_bin=1;
#连接组集群
CHANGE MASTER TO MASTER_USER='sroot', MASTER_PASSWORD='123123' FOR CHANNEL 'group_replication_recovery';
reset master;
start group_replication;
#添加组 白名单
set global group_replication_ip_whitelist = '10.0.16.15,10.0.16.5,10.0.4.13';
#查询组 集群成员
SELECT * FROM performance_schema.replication_group_members;
最终的集群节点应该是
+---------------------------+--------------------------------------+-------------+-------------+------------
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT |MEMBER_STATE
+---------------------------+--------------------------------------+-------------+-------------+------------
| group_replication_applier | 34e29dd3-3982-11ed-8c21-525400437289 | slave1 | 3306 | ONLINE
| group_replication_applier | bbc888df-3981-11ed-b41d-525400cd46a7 | master | 3306 | ONLINE
| group_replication_applier | ee4029d2-3adf-11ed-bfeb-5254006888b3 | slave2 | 3306 | ONLINE
+---------------------------+--------------------------------------+-------------+-------------+------------
单机模式下默认只能在主节点写,从节点读
5、参考资料
https://blog.csdn.net/qq_15328161/article/details/106323494
https://blog.csdn.net/xiaowang_test/article/details/119421992
http://wangshengzhuang.com/2017/05/07/%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9B%B8%E5%85%B3/MySQL/Group%20Replication/MySQL%20Group%20Replication%20%E9%83%A8%E7%BD%B2%E4%B8%AD%E9%81%87%E5%88%B0%E7%9A%84%E9%94%99%E8%AF%AF/