零、简介
MySQL Group Replication(简称MGR)字面意思是mysql组复制的意思,但其实他是一个高可用的集群架构,暂时只支持mysql5.7和mysql8.0版本.
是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案,提供了高可用、高扩展、高可靠的MySQL集群服务.
也是mysql官方基于组复制概念并充分参考MariaDB Galera Cluster和Percona XtraDB Cluster结合而来的新的高可用集群架构.
MySQL Group Replication是建立在基于Paxos的XCom之上的,正因为有了XCom基础设施,保证数据库状态机在节点间的事务一致性,才能在理论和实践中保证数据库系统在不同节点间的事务一致性。
由一般主从复制概念扩展,多个节点共同组成一个数据库集群,事务的提交必须经过半数以上节点同意方可提交,在集群中每个节点上都维护一个数据库状态机,保证节点间事务的一致性。
优点:
高一致性,基于原生复制及paxos协议的组复制技术.
高容错性,有自动检测机制,当出现宕机后,会自动剔除问题节点,其他节点可以正常使用(类似zk集群),当不同节点产生资源争用冲突时,会按照先到先得处理,并且内置了自动化脑裂防护机制.
高扩展性,可随时在线新增和移除节点,会自动同步所有节点上状态,直到新节点和其他节点保持一致,自动维护新的组信息.
高灵活性,直接插件形式安装(5.7.17后自带.so插件),有单主模式和多主模式,单主模式下,只有主库可以读写,其他从库会加上super_read_only状态,只能读取不可写入,出现故障会自动选主.
缺点:
还是太新,不太稳定,暂时性能还略差于PXC,对网络稳定性要求很高,至少是同机房做.
模式:
支持多主模式,但官方推荐单主模式:
多主模式下,客户端可以随机向MySQL节点写入数据
单主模式下,MGR集群会选出primary节点负责写请求,primary节点与其它节点都可以进行读请求处理.
一、安装
1、环境规划
多主模式下最好有三台以上的节点,单主模式则视实际情况而定,不过同个Group最多节点数为9.服务器配置尽量保持一致,因为和PXC一样,也会有"木桶短板效应".
需要特别注意,mysql数据库的服务端口号和MGR的服务端口不是一回事,需要区分开来.
而server-id要区分开来是必须的,单纯做主从复制也要满足这一点了.
2、部署
由于方便我这里直接用docker部署
# 拉取MySQL镜像
docker pull mysql/mysql-server
# 创建专门的网络,连接各个容器
docker network create mysql_mgr docker network ls
# 创建容器
for N in 1 2 3 do docker run -d --name=node$N --net=mysql_mgr --hostname=node$N -v $PWD/d$N:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mypass mysql/mysql-server --server-id=$N --log-bin='mysql-bin-1.log' --enforce-gtid-consistency='ON' --log-slave-updates='ON' --gtid-mode='ON' --transaction-write-set-extraction='XXHASH64' --binlog-checksum='NONE' --master-info-repository='TABLE' --relay-log-info-repository='TABLE' --plugin-load='group_replication.so' --relay-log-recovery='ON' --group-replication-start-on-boot='OFF' --group-replication-group-name='aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' --group-replication-local-address="node$N:33061" --group-replication-group-seeds='node1:33061,node2:33061,node3:33061' --loose-group-replication-single-primary-mode='OFF' # 如果单主模式,则设置为ON --loose-group-replication-enforce-update-everywhere-checks='ON' # 如果单主模式,则设置为OFF done
# 配置首节点,如:创建用户,开启组复制等
docker exec -it node1 mysql -uroot -pmypass -e "SET @@GLOBAL.group_replication_bootstrap_group=1;" -e "create user 'repl'@'%' identified by 'P@ssword1!';" -e "GRANT REPLICATION SLAVE ON *.* TO repl@'%';" -e "flush privileges;" -e "change master to master_user='repl', master_password='P@ssword1!' for channel 'group_replication_recovery';" -e "START GROUP_REPLICATION;" -e "SET @@GLOBAL.group_replication_bootstrap_group=0;" -e "SELECT * FROM performance_schema.replication_group_members;"
# 新增其他节点
for N in 2 3 do docker exec -it node$N mysql -uroot -pmypass -e "change master to master_user='repl', master_password='P@ssword1!' for channel 'group_replication_recovery';" -e "START GROUP_REPLICATION;" done
# 验证集群是否正常
docker exec -it node1 mysql -uroot -pmypass -e "select * from performance_schema.replication_group_members;"
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+ | group_replication_applier | d955da6d-0048-11ea-b7b4-525400f4342d | node1 | 3306 | ONLINE | PRIMARY | 8.0.18 | | group_replication_applier | e050c34f-0048-11ea-917d-52540021fab9 | node2 | 3306 | ONLINE | SECONDARY | 8.0.18 | | group_replication_applier | e6c56347-0048-11ea-9e8b-5254007c241f | node3 | 3306 | ONLINE | SECONDARY | 8.0.18 | +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+ 3 rows in set (0.00 sec)
# 单主切换到多主
###################################################################### # 单主切换到多主 # MGR切换模式需要重新启动组复制,因此需要在所有节点上先关闭组复制, #设置 group_replication_single_primary_mode=OFF 等参数,再启动组复制。 1) 停止组复制(在所有MGR节点上执行): stop group_replication; set global group_replication_single_primary_mode=OFF; set global group_replication_enforce_update_everywhere_checks=ON; 2) 随便选择某个MGR节点执行 (比如这里选择在MGR-node1节点): set global group_replication_recovery_get_public_key=1; SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF; 3) 然后在其他的MGR节点执行 (这里指MGR-node2和MGR-node3节点上执行): set global group_replication_recovery_get_public_key=1; START GROUP_REPLICATION; 4) 查看MGR组信息 (在任意一个MGR节点上都可以查看) SELECT * FROM performance_schema.replication_group_members; # 可以看到所有MGR节点状态都是online,角色都是PRIMARY,MGR多主模式搭建成功。 ##########################################################################
# 多主切换回单主
########################################################################## # 多主切回单主模式 1) 停止组复制(在所有MGR节点上执行): stop group_replication; set global group_replication_single_primary_mode=ON; set global group_replication_enforce_update_everywhere_checks=OFF; 2) 选择一个节点作为主节点, 在主节点上执行 (这里选择MGR-node1节点作为主节点) SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF; 3) 在其他剩余的节点, 也就是从库节点上执行 (这里从库节点指的就是MGR-node2和MGR-node3): START GROUP_REPLICATION; 4) 查看MGR组信息 (在任意一个MGR节点上都可以查看) SELECT * FROM performance_schema.replication_group_members;
##########################################################################
# 注意故障
# 故障注意点: # 单主模式,恢复MGR-node1节点, 恢复后, 需要手动激活下该节点的组复制功能 # 如果节点发生故障, 在恢复后需要重新加入到MGR集群里, 正确的做法是: STOP GROUP_REPLICATION; START GROUP_REPLICATION; # 如果某个节点挂了, 则其他的节点继续进行同步. # 当故障节点恢复后, 只需要手动激活下该节点的组复制功能("START GROUP_REPLICATION;"), # 即可正常加入到MGR组复制集群内并自动同步其他节点数据. # 如果是i/o复制出现异常 # 确定数据无误后 # 查找主库的gtid情况 mysql> show global variables like '%gtid%' ; +----------------------------------------------+-------------------------------------------------------+ | Variable_name | Value | +----------------------------------------------+-------------------------------------------------------+ | binlog_gtid_simple_recovery | ON | | enforce_gtid_consistency | ON | | group_replication_gtid_assignment_block_size | 1000000 | | gtid_executed | 58f6e65e-9309-11e9-9d88-525400184a0a:1-946050:1000003 | | gtid_executed_compression_period | 1000 | | gtid_mode | ON | | gtid_owned | | | gtid_purged | | | session_track_gtids | OFF | +----------------------------------------------+-------------------------------------------------------+ 9 rows in set (0.00 sec) # 在有故障的从库中操作 stop GROUP_REPLICATION; reset master; set global gtid_purged='58f6e65e-9309-11e9-9d88-525400184a0a:1-946055:1000003'; START GROUP_REPLICATION; # 添加白名单网段 stop group_replication; set global group_replication_ip_whitelist="127.0.0.1/32,172.16.60.0/24,172.16.50.0/24,172.16.51.0/24"; start group_replication; show variables like "group_replication_ip_whitelist"; # 一定要注意: 配置白名单前面一定要先关闭 Group Replication, 及先要执行"stop group_replication;"
搭建的时候注意细节,有些参数需要根据自身情况调整下