MGR复制

一、什么是MGR复制

1、概述

MGR(MySQL Group Replication),MySQL复制组。

它是基于现有MySQL复制架构,基于Paxos协议来实现的一个MySQL复制插件,最早出现在MySQL5.7版本中。

Paxos协议是一种分布式的一致性算法,其主要是为了解决多个节点并发操作数据时,如何保证在读写过程中数据一致性的问题。

Paxos协议要求在主从集群中大多数节点都同意的情况下,数据才能被更新。

MGR是一种不同于异步复制的多master复制集群。MGR支持客户端通过多个主同时来修改数据,虽然目前MySQL官方并不建议使用这种方式,但以后可能也会成为一个发展方向。

在MGR中,没有slave角色,只有master角色,MGR集群由多个master组成,这点和percona社区推出的PXC集群非常类似。

2、什么是复制组

实际上,复制组就是一组彼此之间可以通过消息通讯,来保持数据一致性的MySQL服务器。

在复制组中,每一台MySQL服务器都可以独立的完成数据的更新,也就是说在MGR中,可以实现多个主同时对数据进行修改,在这点上,是不同于异步复制的主从复制集群的。

3、MGR复制架构图
(1)单主模式

(2)多主模式

4、MGR架构需要的资源

当前MGR架构中,最多可以支持9台服务器。

集群大小 投票数 允许宕机的数量
3 2 1
4 3 1
5 3 2
6 4 2
7 4 3
8 5 3
9 5 4

当MGR集群中有三台服务器,那必须有两台服务器投票认可,事务才能执行。

 

二、MGR复制架构的优点

1、group replication 组内成员间基本无延迟

2、支持多写模式,读写服务高可用

3、数据强一致,可以保证不丢失事务

 

三、MGR复制架构的缺点

1、只支持InnoDB存储引擎的表,并且每个表上必须有一个主键

2、单主模式下很难确认下一个primary

3、只能用在gtid模式的复制形式下,且日志格式必须为row

 

四、MGR集群的使用场景

1、对主从延迟十分敏感的应用场景

2、希望可以对读写提供高可用的场景

3、希望可以保证数据强一致的场景

 

五、部署MGR集群

1、MGR集群配置步骤

(1)在每个节点中安装group_replication插件

(2)在第一个实例上建立复制用户,MGR中都会使用这个账号进行数据同步

(3)配置第一个MGR复制组中的实例,初始化MGR组

(4)将其他节点实例加入组

2、实际配置
名称 IP MySQL版本 端口号
v2 192.168.78.102 5.7 3306
v3 192.168.78.103 5.7 3306
v4 192.168.78.104 5.7 3306

(1)关闭防火墙、selinux

(2)在每个节点配置域名和ip的映射

# 在每个节点都编辑 /etc/hosts 文件,添加下面代码
vi /etc/hosts

192.168.78.102 v2
192.168.78.103 v3
192.168.78.104 v4

(3)修改配置文件,添加必要配置(如果是docker安装的,则在/etc/mysql/mysql.conf.d/mysqld.cnf)

log_bin=mysql-bin
binlog_format=ROW
binlog_rows_query_log_events=ON
log_slave_updates=ON

gtid_mode=ON
enforce-gtid-consistency=ON
transaction_write_set_extraction=XXHASH64
master_info_repository=table
relay_log_info_repository=table
binlog_checksum=none

server-id=102

说明:transaction_write_set_extraction=XXHASH64是设置加密算法,用于MySQL MGR验证事务有冲突的一个加密算法,必须设置为该值

修改完配置后,需要重启MySQL。

(4)在每个节点安装group_replication插件

mysql> install plugin group_replication soname 'group_replication.so';
Query OK, 0 rows affected (0.01 sec)

(5)在v2上建立复制账号

mysql> create user replication@'192.168.78.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

(6)在v2上给该用户授权

mysql> grant replication slave  on *.* to replication@'192.168.78.%';
Query OK, 0 rows affected (0.00 sec)

(7)在v2上修改MySQL配置文件,配置组名称

# 配置组名称 `group_replication_group_name`,该参数值格式应该为uuid,我们也可以使用select uuid(); 来生成一个填到这里
loose_group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"

# 配置服务ip
loose_group_replication_local_address = 192.168.78.102:33061

# 初始化组复制集群,完成初始化后应该设置为OFF
loose_group_replication_bootstrap_group=ON

说明:loose_ 前缀表示若Group Replication plugin未加载,mysql server仍继续启动

(8)初始化组复制

start group_replication

(9)关闭组复制初始化参数

# 编辑MySQL配置文件,将group_replication_bootstrap_group改为OFF
group_replication_bootstrap_group=OFF

(10)编辑v3、v4上的MySQL配置文件

relay_log=mysql-relay-bin

plugin-load=group_replication.so
group_replication=FORCE_PLUS_PERMANENT
loose_group_replication_start_on_boot=OFF
loose_group_replication_bootstrap_group=OFF
loose_group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"

# 这里分别填写v3和v4的IP
group_replication_local_address="192.168.78.103:33061"

group_replication_group_seeds="192.168.78.102:33061"

(11)分别在v3、v4上执行下面命令,加入v2创建的组

mysql> change master to master_user='replication',master_password='123456' for channel 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.02 sec)

(12)分别在v3、v4上执行下面命令,启动组同步

start group_replication

(13)查看节点状态

select * from replication_group_members \G

注:如果是使用docker通过docker pull、docker run创建的MySQL,想要搭建该集群,则需要通过docker swarm先将几个主机构成一个docker集群,然后再为创建的每个MySQL容器指定网络,这样,才可以使用运行MGR集群。

否则指定group_replication_local_address为docker主机的ip是不行的,会报类似这样的错误 There is no local IP address matching the one configured for the local node (192.168.78.102:33061).'

关于docker swarm的使用可以查看文章:https://www.haveyb.com/article/953