一、什么是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