1. 介绍
MGR(MySQL Group Replication)是MySQL官方在MySQL 5.7.17版本中以插件形式推出的主从复制高可用技术,它基于原生的主从复制,将各节点归入到一个组中,通过组内节点的通信协商(组通信协议基于Paxos算法),实现数据的强一致性、故障探测、冲突检测、节点加组、节点离组等等功能。
1.1 工作模式
组复制以单主模式或多主模式运行。通过group_replication_single_primary_mode=[ON|OFF] 变量指定工作模式。 组内所有成员都必须运行相同得工作模式。 ON表示单主模式,这是默认模式,OFF表示多主模式。
单主模式:从复制组中众多个MySQL节点中自动选举一个master节点,只有master节点可以写,其他节点自动设置为read only。当master节点故障时,会自动选举一个新的master节点,选举成功后,它将设置为可写,其他slave将指向这个新的master。
多主模式:复制组中的任何一个节点都可以写,因此没有master和slave的概念,只要突然故障的节点数量不太多,这个多主模型就能继续可用。
1.2 单主模式主要选主算法
1)第一个考虑因素通过成员运行的MySQL Server软件版本(补丁版本)进行排序
2)第二个因素依据每个成员的权重group_replication_member_weigth参数控制,【5.7.20引入变量】默认为50
3)第三个因素UUID的词典顺序(变量server_uuid控制),UUID最低的成员被选为新主
1.3 容错
MySQL组复制使用Paxos分布式算法来提供节点间的分布式协调。正因如此,它要求组中大多数节点在线才能达到法定票数,从而对一个决策做出一致的决定。
大多数指的是N/2+1(N是组中目前节点总数),例如目前组中有5个节点,则需要3个节点才能达到大多数的要求。所以,允许出现故障的节点数量如下图:
2. 实验环境搭建
2.1 单主模式
1)配置复制账号
# 全新环境 -- set password=password('root'); create user 'sync'@'192.168.10.%' identified by 'sync'; grant replication slave on *.* to 'sync'@'192.168.10.%'; flush privileges; # 线上环境新增账号 SET SQL_LOG_BIN=0; CREATE USER sync@'192.168.10.%' IDENTIFIED BY 'sync'; GRANT REPLICATION SLAVE ON *.* TO sync@'192.168.10.%'; FLUSH PRIVILEGES; SET SQL_LOG_BIN=1; select user,host,authentication_string from mysql.user;
2)参数文件配置
# GTID gtid_mode=on enforce-gtid-consistency=on binlog_gtid_simple_recovery=1 binlog_checksum=NONE log-slave-updates=on master_info_repository=TABLE relay_log_info_repository=TABLE # MGR 复制 transaction_write_set_extraction = XXHASH64 loose-group_replication_group_name = '32078389-702d-11ea-95da-000c2960a1c6' loose-group_replication_ip_whitelist = '127.0.0.1/24,192.168.10.0/24' loose-group_replication_start_on_boot = OFF loose-group_replication_local_address = '192.168.10.181:33061' # 替换本地服务器IP及通讯端口 loose-group_replication_group_seeds = '192.168.10.181:33061,192.168.10.181:33062,192.168.10.181:33063' loose-group_replication_bootstrap_group = OFF loose-group_replication_single_primary_mode = true loose-group_replication_enforce_update_everywhere_checks = false loose-group_replication_member_weight=50 # mysql 5.7.20才开始支持该选项 权重:新主选举时的优先级参照,越大,优先级越高 group_replication_flow_control_mode='DISABLED' # 建议关闭流控
3)安装插件
# 动态安装插件 INSTALL PLUGIN group_replication SONAME 'group_replication.so'; show plugins; # 配置文件加载插件 group_replication=group_replication.so plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so;group_replication=group_replication.so"
4)配置组成员
# mysql 3308 -- 首个实例 #1 查看当前的group replication相关参数是否配置有误 show global variables like 'group%'; #2 配置MGR -- 开启分布式复制 CHANGE MASTER TO MASTER_USER='sync', MASTER_PASSWORD='sync' FOR CHANNEL 'group_replication_recovery'; #3 # 设置group_replication_bootstrap_group为ON是为了标示以后加入集群的服务器以这台服务器为基准,以后加入的就不需要设置 SET GLOBAL group_replication_bootstrap_group=ON; #4 启动MGR start group_replication; #5 关闭 group_replication_bootstrap_group SET GLOBAL group_replication_bootstrap_group=OFF; #6 #检测组是否创建并已加入新成员 select * from performance_schema.replication_group_members; # 其它实例配置 #1 查看当前的group replication相关参数是否配置有误 show global variables like 'group%'; #2 配置MGR -- 开启分布式复制 CHANGE MASTER TO MASTER_USER='sync', MASTER_PASSWORD='sync' FOR CHANNEL 'group_replication_recovery'; #3 启动MGR 注意:# 这里不再需要开启group_replication_bootstrap_group,由于复制组已经被创建了,只需要将第二个节点添加进去即可 start group_replication; #4 #检测组是否创建并已加入新成员 select * from performance_schema.replication_group_members;
5)监控
# 相关状态查看
# 1、当前组成员列表
select * from performance_schema.replication_group_members;
# 2、当前节点详细日志应用信息
select * from performance_schema.replication_group_member_stats;
# 3、当前复制渠道连接信息
select * from performance_schema.replication_connection_status;
# 4、当前复制渠道应用信息
select * from performance_schema.replication_applier_status;
# 5、当前主master (单主模式)
select a.variable_value,b.member_host,b.member_port,member_state
from performance_schema.global_status a ,performance_schema.replication_group_members b
where a.variable_value=b.member_id and variable_name= 'group_replication_primary_member';
SHOW STATUS LIKE 'group_replication_primary_member';
select b.member_host the_master,a.variable_value master_uuid
from performance_schema.global_status a
join performance_schema.replication_group_members b
on a.variable_value = b.member_id
where variable_name='group_replication_primary_member';
# 可用性监控
selecct member_state from replication_group_members where member_id=@@server_uuid;
# 延迟
select (SELECT Received_transaction_set FROM performance_schema.replication_connection_status WHERE Channel_name = 'group_replication_applier') - (select @@global.gtid_executed);
-- 远程节点GTID
SELECT Received_transaction_set FROM performance_schema.replication_connection_status WHERE Channel_name = 'group_replication_applier';
-- 本地节点 GTID
select @@global.gtid_executed;
# 当前节点是否可以写
select * from performance_schema.global_variables where variable_name in ('read_only', 'super_read_only');
2.2 多主模式
# 多主模式和单主模式配置方式一样,只需将修改或增加以下参数后配置组成员 loose-group_replication_single_primary_mode=FALSE loose-group_replication_enforce_update_everywhere_checks = TRUE
3. 工作模式切换
3.1 单主切换成多主模式
# 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节点执行 (比如这里选择在3308端口实例): SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF; 3) 然后在其他的MGR节点执行 (这里指3309和3310端口实例上执行): START GROUP_REPLICATION; 4) 查看MGR组信息 (在任意一个MGR节点上都可以查看) SELECT * FROM performance_schema.replication_group_members;
3.2 多主切换单主模式
# 多主切回单主模式 1) 停止组复制(在所有MGR节点上执行): stop group_replication; set global group_replication_enforce_update_everywhere_checks=OFF; set global group_replication_single_primary_mode=ON; 2) 选择一个节点作为主节点, 在主节点上执行 (这里选择3308端口作为主) SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF; 3) 在其他剩余的节点, 也就是从库节点上执行 (这里从库节点指的就是3309和3310): START GROUP_REPLICATION; 4) 查看MGR组信息 (在任意一个MGR节点上都可以查看) SELECT * FROM performance_schema.replication_group_members;
4. 参数调优
slave_parallel_type -> LOGICAL_CLOCK # 增强sql_thread 并行数量 slave_parallel_workers -> 2~8 # 流控(flow control) 在MGR中如果节点落后集群中其它成员太多,就会发起让其它节点等他完成在做的控制,这个叫流控。 当启用: group_replication_flow_control_mode=QUOTA 是表示启用流控。 流控默认通过两个参数控制: group_replication_flow_control_applier_threshold (默认: 25000) group_replication_flow_control_certifier_threshold (默认: 25000) 默认延迟在25000个GTID时,会对整个集群Block住写操作 # 建议关闭流控 set global group_replication_flow_control_mode='DISABLED';