1. MGR介绍
MySQL Group Replication(下简称:MGR)是MySQL官方推出的一种基于Paxos协议的状态机复制。在MGR出现之前,用户常见的MySQL高可用方式,无论怎么变化架构,本质就是Master-Slave架构。MySQL 5.7版本开始支持无损半同步复制(lossless semi-sync replication),从而进一步提示数据复制的强一致性
1.1 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无法感知
1.2 MySQL半同步复制
基于传统异步存在的缺陷,mysql在5.5版本推出半同步复制。可以说半同步复制是传统异步复制的改进,在master事务的commit之前,必须确保一个slave收到relay log并且响应给master以后,才能进行事务的commit。但是slave对于relay log的应用仍然是异步进行的,原理如下图所示:
1.3 MySQL组复制(MGR)
基于传统异步复制和半同步复制的缺陷——数据的一致性问题无法保证,MySQL官方在5.7.17版本正式推出组复制(MySQL Group Replication,简称MGR)。
由若干个节点共同组成一个复制组,一个事务的提交,必须经过组内大多数节点(N / 2 + 1)决议并通过,才能得以提交。如上图所示,由3个节点组成一个复制组,Consensus层为一致性协议层,在事务提交过程中,发生组间通讯,由2个节点决议(certify)通过这个事务,事务才能够最终得以提交并响应。
引入组复制,主要是为了解决传统异步复制和半同步复制可能产生数据不一致的问题。组复制依靠分布式一致性协议(Paxos协议的变体),实现了分布式下数据的最终一致性,提供了真正的数据高可用方案(是否真正高可用还有待商榷)。其提供的多写方案,给我们实现多活方案带来了希望。
1.4 MySQL组复制的特性和限制
特性优点:
1、高一致性,基于原生复制及paxos协议的组复制技术,并以插件的方式提供,提供一致数据安全保证;
2、高容错性,只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制;
3、高扩展性,节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息;
4、高灵活性,有单主模式和多主模式,单主模式下,会自动选主,所有更新操作都在主上进行;多主模式下,所有server都可以同时处理更新操作。
1、仅支持InnoDB表,并且每张表一定要有一个主键,用于做write set的冲突检测;
2、必须打开GTID特性,二进制日志格式必须设置为ROW,用于选主与write set
3、COMMIT可能会导致失败,类似于快照事务隔离级别的失败场景
4、目前一个MGR集群最多支持9个节点
5、不支持外键于save point特性,无法做全局间的约束检测与部分事务回滚
6、二进制日志不支持binlog event checksum
2. MGR搭建
loose-group_replication_single_primary_mode=FALSE
loose-group_replication_enforce_update_everywhere_checks= TRUE
2.1 机器分布
主机ip
安装服务
权重
192.168.142.48
mysql server 5.7.18
50
192.168.142.49
mysql server 5.7.18
40
192.168.142.50
mysql server 5.7.18
30
权重:新主选举时的优先级参照,越大,优先级越高
2.2 创建hostname和ip的映射
在三台数据库服务器上都设置:
192.168.142.48 dbtest1
192.168.142.49 dbtest2
192.168.142.50 dbtest3
2.3 需要额外说明的是配置文件my.cnf额外配置
# Replication Framework
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
log_bin=binlog
binlog_format=ROW
log_slave_updates=ON
binlog_checksum=NONE
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "192.168.142.48:33061"
loose-group_replication_group_seeds= "192.168.142.48:33061,192.168.142.49:33061,192.168.142.50:33061"
loose-group_replication_bootstrap_group=off
loose-group_replication_member_weight=50
2.4 创建数据库实例
手动搭建或者自动化脚本分别在三台主机上配置mysql实例,这里可参考MySQL单实例搭建的方法,不在赘述
2.5 第一个节点配置
1、设置复制账号权限
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
2、指定恢复渠道channel
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
3、安装插件plugin和查看
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
show plugins;
4、开启组复制
# 设置group_replication_bootstrap_group为ON是为了标示以后加入集群的服务器以这台服务器为基准,以后加入的就不需要设置
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
5、查看mgr的状态
# 查询表performance_schema.replication_group_members
select * from performance_schema.replication_group_members;
2.6 第二个节点配置和第三个节点配置
1、设置复制账号权限
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
2、指定恢复渠道channel
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
3、安装插件plugin和查看
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
show plugins;
4、开启组复制
# 这里不再需要开启group_replication_bootstrap_group,由于复制组已经被创建了,只需要将第二个节点添加进去即可
START GROUP_REPLICATION;
5、查看mgr的状态
# 查询表performance_schema.replication_group_members
select * from performance_schema.replication_group_members;
3. 观察相关状态和切换
1、切换
STOP GROUP_REPLICATION;会根据权重重新选择新的主master
START GROUP_REPLICATION;新加入后作为从服务器slave
2、相关状态查看
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';
4. MGR动态新增和删除节点
4.1 动态新增节点配置
例如原有192.168.142.48,192.168.142.49,192.168.142.50组成MGR的基础上动态新增节点192.168.142.51
1、创建hostname和ip的映射
在四台数据库服务器上都设置:
192.168.142.48 dbtest1
192.168.142.49 dbtest2
192.168.142.50 dbtest3
192.168.142.51 dbtest4
2、192.168.142.51的my.cnf配置文件和上面my.cnf保持一致,额外修改的如下
loose-group_replication_local_address= "192.168.142.51:33061"
loose-group_replication_group_seeds= "192.168.142.48:33061,192.168.142.49:33061,192.168.142.50:33061,192.168.142.51:33061"
3、创建数据库实例
手动搭建或者自动化脚本分别在三台主机上配置mysql实例,这里可参考MySQL单实例搭建的方法,不在赘述
4、设置复制账号权限
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
5、指定恢复渠道channel
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
6、安装插件plugin和查看
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
show plugins;
7、集群中已存在的节点配置修改group_replication_group_seeds的值
1、分别在192.168.142.48,192.168.142.49,192.168.142.50对应节点服务器配置参数
set global group_replication_group_seeds="192.168.142.48:33061,192.168.142.49:33061,192.168.142.50:33061,192.168.142.51:33061";
2、将对应参数值写入配置文件my.cnf持久化
8、开启组复制
# 这里不再需要开启group_replication_bootstrap_group,由于复制组已经被创建了,只需要将新增节点添加进去即可
START GROUP_REPLICATION;
9、查看mgr的状态
# 查询表performance_schema.replication_group_members
select * from performance_schema.replication_group_members;
4.2 动态删除节点配置
例如原有192.168.142.48,192.168.142.49,192.168.142.50,192.168.142.51组成MGR的基础上动态删除节点192.168.142.51
1、停止192.168.142.51上组复制
STOP GROUP_REPLICATION;
slave关闭后就被移除了组成员
2、集群中剩余的节点配置修改group_replication_group_seeds的值
1、分别在192.168.142.48,192.168.142.49,192.168.142.50对应节点服务器配置参数
set global group_replication_group_seeds="192.168.142.48:33061,192.168.142.49:33061,192.168.142.50:33061";
2、将对应参数值写入配置文件my.cnf持久化
3、彻底清理192.168.142.51节点相关组信息,配置修改group_replication_group_seeds和group_replication_local_address的值
1、在192.168.142.51对应节点服务器配置参数
set global group_replication_group_seeds="";
set global group_replication_local_address="";
2、将对应参数值写入配置文件my.cnf持久化(添加注释)
4、删除插件plugin、复制账号权限