扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
MySQL Group Replication(下简称:MGR)是MySQL官方推出的一种基于Paxos协议的状态机复制。在MGR出现之前,用户常见的MySQL高可用方式,无论怎么变化架构,本质就是Master-Slave架构。MySQL 5.7版本开始支持无损半同步复制(lossless semi-sync replication),从而进一步提示数据复制的强一致性
创新互联是一家专业提供承德企业网站建设,专注与成都网站设计、网站制作、H5技术、小程序制作等业务。10年已为承德众多企业、政府机构等服务。创新互联专业网站制作公司优惠进行中。
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在5.5版本推出半同步复制。可以说半同步复制是传统异步复制的改进,在master事务的commit之前,必须确保一个slave收到relay log并且响应给master以后,才能进行事务的commit。但是slave对于relay log的应用仍然是异步进行的,原理如下图所示:
基于传统异步复制和半同步复制的缺陷——数据的一致性问题无法保证,MySQL官方在5.7.17版本正式推出组复制(MySQL Group Replication,简称MGR)。
由若干个节点共同组成一个复制组,一个事务的提交,必须经过组内大多数节点(N / 2 + 1)决议并通过,才能得以提交。如上图所示,由3个节点组成一个复制组,Consensus层为一致性协议层,在事务提交过程中,发生组间通讯,由2个节点决议(certify)通过这个事务,事务才能够最终得以提交并响应。
引入组复制,主要是为了解决传统异步复制和半同步复制可能产生数据不一致的问题。组复制依靠分布式一致性协议(Paxos协议的变体),实现了分布式下数据的最终一致性,提供了真正的数据高可用方案(是否真正高可用还有待商榷)。其提供的多写方案,给我们实现多活方案带来了希望。
特性优点:
1、高一致性,基于原生复制及paxos协议的组复制技术,并以插件的方式提供,提供一致数据安全保证;
2、高容错性,只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制;
3、高扩展性,节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息;
4、高灵活性,有单主模式和多主模式,单主模式下,会自动选主,所有更新操作都在主上进行;多主模式下,所有server都可以同时处理更新操作。
限制:(具体可参考官方文档说明:https://dev.mysql.com/doc/refman/5.7/en/group-replication-requirements-and-limitations.html)
1、仅支持InnoDB表,并且每张表一定要有一个主键,用于做write set的冲突检测;
2、必须打开GTID特性,二进制日志格式必须设置为ROW,用于选主与write set
3、COMMIT可能会导致失败,类似于快照事务隔离级别的失败场景
4、目前一个MGR集群最多支持9个节点
5、不支持外键于save point特性,无法做全局间的约束检测与部分事务回滚
6、二进制日志不支持binlog event checksum
搭建参照的官方文档:
官方文档:https://dev.mysql.com/doc/refman/5.7/en/group-replication.html
单主节点搭建地址:https://dev.mysql.com/doc/refman/5.7/en/group-replication-deploying-in-single-primary-mode.html
多主节点搭建基本和单主步骤一样,只需要配置文件my.cnf额外添加,本文以下示例为单主节点搭建,多主节点搭建亦相差无几
loose-group_replication_single_primary_mode=FALSE
loose-group_replication_enforce_update_everywhere_checks= TRUE
主机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 |
权重:新主选举时的优先级参照,越大,优先级越高
在三台数据库服务器上都设置:
192.168.142.48 dbtest1
192.168.142.49 dbtest2
192.168.142.50 dbtest3
配置文件介绍参照官方文档:https://dev.mysql.com/doc/refman/5.7/en/group-replication-configuring-instances.html
# 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
手动搭建或者自动化脚本分别在三台主机上配置mysql实例,这里可参考MySQL单实例搭建的方法,不在赘述
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;
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;
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';
例如原有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;
例如原有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、复制账号权限
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流