MySQL-MGR

1. 介绍

    MGR(MySQL Group Replication)是MySQL官方在MySQL 5.7.17版本中以插件形式推出的主从复制高可用技术,它基于原生的主从复制,将各节点归入到一个组中,通过组内节点的通信协商(组通信协议基于Paxos算法),实现数据的强一致性、故障探测、冲突检测、节点加组、节点离组等等功能。

image

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个节点才能达到大多数的要求。所以,允许出现故障的节点数量如下图:

5-1966257287


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;

clipboard


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';
posted @ 2020-03-29 20:24  KuBee  阅读(1072)  评论(0编辑  收藏  举报