以多主模式优雅进行MGR复制搭建

张甦 2018-01-26 17:03:01
作者介绍

张甦,极数学院创始人之一,近10年互联网线上处理及培训经验,专注于MySQL数据库,对MongoDB、Redis等NoSQL数据库以及Hadoop生态圈相关技术有深入研究。曾就职于数据库服务公司,某大型电商平台,及汽车类网站等大型互联网公司。麾下学员遍布各大企业。今年三月将出版《MySQL王者晋级之路》一书。 

 

在阅读本文之前,请大家回忆一下,在搭建MySQL复制的时候,你是否还在执行备份恢复,从库进行change master to的操作?

 

如果是,那你可就真的落后了。

 

本章将会介绍MySQL官方推荐的一款高可用集群方案MySQL Group Replication,简称:MGR(组复制)。它是官方推出的一种基于Paxos协议的状态机复制,彻底解决了基于传统的异步复制和半同步复制中数据一致性问题无法保证的情况,也让MySQL数据库涉及的领域更广,打开互联网金融行业的大门。

 

2016年12月 MySQL Group Replication推出了第一个GA版本发布在MySQL5.7.17中。但目前将其直接投入到生产环境中使用的风险还是比较大,建议等其成熟之后再真正投入使用。

 

如今,MySQL8.0版本即将与我们见面,再加上官方逐渐成熟的高可用集群 Group Replication方案,到时候谁还是我们MySQL的对手?全都不在了!MySQL数据库就是作者的信仰,爱你无怨无悔。

 

 

一、MGR组复制原理

 

首先我们来谈谈什么叫做组复制。

 

组复制是一种可用于实现容错系统的技术。复制组是一个通过消息传递相互交互的Server集群。复制组由多个Server成员组成,如下图的Master1、Master2、Master3,所有成员独立完成各自的事务。

 

 

当客户端发起一个更新事务时,该事务先在本地执行,执行完成之后就要发起对事务的提交操作。在还没有真正提交之前,需要将产生的复制写集广播出去,复制到其它成员。如果冲突检测成功,组内决定该事务可以提交,其它成员可以应用,否则就回滚。

 

最终,所有组内成员以相同的顺序接收同一组事务。因此组内成员以相同的顺序应用相同的修改,保证组内数据强一致性。

 

 

二、MGR组复制模式

 

组复制可以在两种模式下运行:

 

  • 单主模式下组复制具有自动选主功能,每次只有一个 Server成员接受更新,其它成员只提供读服务。

  • 多主模式下,所有的Server 成员都可以同时接受更新,没有主从之分,成员角色是完全对等的。

 

组复制默认情况下是单主模式,我们可以通过设置参数,让其变成多主模式。

 

 

group_replication_single_primary_mode=off

 

本章的实战部分就是以多主模式进行MGR复制的搭建。

 

 

三、MGR特性介绍

 

 

MGR的特性在于:

  • 完成了真正的多节点读写的集群方案;

  • 基于原生复制及Paxos协议的组复制技术,并以插件的方式提供,实现了数据的强一致性;

  • 由于是多节点读写,Failover切换变得更加简单;

  • 增加删除节点,自动完成同步数据和更新组内信息的操作,扩展性增强。

 

虽然在MGR的多主模式下有不能支持串行隔离级别和不支持外键级联操作的限制条件,且目前MySQL版本中存在由于对DDL语句操作无法实现回滚,导致MGR无法对DDL语句做数据冲突检验,以致DDL语句在MGR中并发执行存在隐患的情况。但这些都不能阻挡MGR的发布所带来的开创新时代的意义。

 

 

四、MGR搭建实战演练

 

 

环境介绍:

这里我们准备三个节点,数据库版本使用MySQL5.7.17。

 

 

实战第1步:

在三个节点上执行安装MySQL5.7操作。(安装过程省略)

 

实战第2步:

在三个节点上分别设置hostname和IP地址的映射关系

 

 

实战第3步:

在三个节点上分别创建复制账号,命令如下:

 

 

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.56.%' IDENTIFIED BY '123456';

 

实战第4步:

在三个节点上分别安装GR插件,命令如下

 

 

INSTALL PLUGIN group_replication SONAME 'group_replication.so';

 

组件安装完成之后,展示结果:

 

 

实战第5步:

在三个节点分别配置各自的集群参数文件,配置完成之后重启数据库。

 

192.168.56.101参数文件配置展示:(剩下两个节点同理)

 

 

# Group Replication

server_id = 1013306

gtid_mode = ON

enforce_gtid_consistency = ON

master_info_repository = TABLE

relay_log_info_repository = TABLE

binlog_checksum = NONE

log_slave_updates = ON

log_bin = binlog

binlog_format= ROW

transaction_write_set_extraction = XXHASH64

loose-group_replication_group_name = '1f2cee29-f9a2-11e7-8cbb-08002783b39d'

loose-group_replication_start_on_boot = off

loose-group_replication_local_address = 'node2:33061'

loose-group_replication_group_seeds ='node2:33061,node3:33062,proxysql:33063'

loose-group_replication_bootstrap_group = off

loose-group_replication_single_primary_mode=off

loose-group_replication_enforce_update_everywhere_checks=true

 

重点参数详解

 

  • MGR一定要开启GTID功能gtid_mode = ON,enforce_gtid_consistency = ON

  • MGR在当前MySQL版本中,必须要设置binlog_checksum=none,并且binlog_format=row

  • MGR需要多源复制功能,所以需要将主从库之间的信息记录到表中。设置master_info_repository = TABLE和relay_log_info_repository = TABLE

  • MGR中开启主键信息采集功能:

    transaction_write_set_extraction= XXHASH64

  • MGR中需要设置组的名字,该group_replication_group_name是通过select uuid()来生成的。

  • MGR中本地成员的地址由该参数group_replication_local_address决定,本例中当前节点是node2。后面的端口是每个节点都需要一个独立的TCP端口号,节点之间通过这个端口号进行通信。

  • MGR中其他成员的地址由这个参数group_replication_group_seeds决定

  • MGR采取多主模式时,需要让该参数:

    group_replication_single_primary_mode=off(默认是单主模式)。

  • 于此同时,还需要将该参数:group_replication_enforce_update_everywhere_checks=true,目的则是为了做多主模式限制检测。

 

注:加载到参数文件里面,需要在每个参数的前面加loose。

 

  • 这里再强调一个参数:group_replication_auto_increment_increment

    该参数代表自增属性,默认值为7。我们要保证每个成员的该值相同,并且建议该参数的设置尽量比组内成员的个数大一些,方便后期集群的扩展。

 

实战第6步:

在192.168.56.101上启动首个节点的MGR集群服务。命令如下:

 

CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';

 

注:MGR需要该异步复制通道,实现新节点加入集群自动从其他节点复制数据的目的,不需要手工指定从哪个节点复制,master_host和master_port信息。都是自动完成。

 

 

SET GLOBAL group_replication_bootstrap_group = ON;

 

注:执行初始化操作,只有首个节点需要这一步操作。

 

 

START GROUP_REPLICATION;

 

启动成功之后,查看节点状态信息。命令如下:

 

 

 

SELECT * FROM performance_schema.replication_group_members;

 

关闭初始化操作 命令如下:

 

 

 

SET GLOBAL group_replication_bootstrap_group = off;

 

注:replication_group_members表中MEMBER_STATE字段状态为ONLINE,再执行关闭初始化命令。

 

 

实战第7步:

在192.168.56.102上面启动第二个节点的MGR集群服务。命令如下:

 

 

 

CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';

START GROUP_REPLICATION;

 

启动成功之后,查看节点状态信息。命令如下:

 

 

SELECT * FROM performance_schema.replication_group_members;

 

 

实战第8步:

在192.168.56.103上面启动第三个节点的MGR集群服务。命令如下:

 

 

 

CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';

START GROUP_REPLICATION;

 

启动成功之后,查看节点状态信息。命令如下:

 

 

 SELECT * FROM performance_schema.replication_group_members;

 

 

可见启动成功之后,三个成员的状态都online,证明已经开始正常工作了。如此,就真正实现了多节点的读写操作。

 

活动预告