CentOS 7.6单机配置组复制(MySql Group Replication)

前言

MySQL Group Replication是一个MySQL Server插件,可用于创建弹性,高可用性,容错复制拓扑。

组复制

组复制是一种可用于实现容错系统的技术。 复制组是一组通过消息传递相互交互的服务器。 通信层提供一组保证,例如原子消息和总订单消息传递。 这些是非常强大的属性,可以转换为非常有用的抽象,可以用来构建更高级的数据库复制解决方案。

MySQL Group Replication构建于此类属性和抽象之上,并实现了多主机更新到处复制协议。 本质上,复制组由多个服务器组成,组中的每个服务器可以独立地执行事务。 但是所有读写(RW)事务只有在得到组的批准后才会提交。 只读(RO)事务在组内不需要协调,因此立即提交。 换句话说,对于任何RW事务,组需要决定它是否提交,因此提交操作不是来自始发服务器的单方面决定。 确切地说,当事务准备好在原始服务器上提交时, 服务器以原子方式广播写入值(已更改的行)和对应的写入集(已更新的行的唯一标识符)。 然后为该交易建立全局总订单。 最终,这意味着所有服务器都以相同的顺序接收相同的事务集。 因此,所有服务器都以相同的顺序应用相同的更改集,因此它们在组内保持一致。

但是,在不同服务器上并发执行的事务之间可能存在冲突。 通过在称为 认证 的过程中检查两个不同和并发事务的写集来检测这种冲突 。 如果在不同服务器上执行的两个并发事务更新同一行,则存在冲突。 解决过程指出,首先订购的事务在所有服务器上提交,而第二个订购的事务在中止,因此在原始服务器上回滚并由组中的其他服务器删除。 这实际上是分布式的第一个提交获胜规则。

MySQL组复制协议

gr-replication-diagram.png

执行Master 1接收的事务。 然后,Master 1向复制组发送一条消息,该组由其自身,Master 2和Master 3组成。当所有三个成员达成共识时,他们会对该事务进行认证。 然后,Master 1将事务写入其二进制日志,提交它,并向客户端应用程序发送响应。 Masters 2和3将事务写入其中继日志,然后应用它,将其写入二进制日志并提交。

最后,组复制是一种无共享复制方案,其中每个服务器都有自己的整个数据副本。
关于mysql复制可以参考上篇:MySql复制总结 | 57°极客闷骚

安装拓扑

实例 端口 serverID 数据文件
mysql1 3306 1 /data/mysql8.0.18/mysql1
mysql2 3307 2 /data/mysql8.0.18/mysql2
mysql3 3308 3 /data/mysql8.0.18/mysql3

解压linux二进制安装文件

安装文件: mysql-8.0.18-linux-glibc2.12-x86_64.tar.xz

1
2
3
tar -xvJf mysql-8.0.18-linux-glibc2.12-x86_64.tar.xz -C /opt/
mv /opt/mysql-8.0.18-linux-glibc2.12-x86_64 /opt/mysql-8.0.18
ln -s /opt/mysql-8.0.18 /usr/local/mysql

创建目录及用户

1
2
3
4
5
mkdir -p /data/mysql8.0.18/mysql{1,2,3}
groupadd mysql
useradd -g mysql mysql
chown -R mysql:mysql /data/mysql8.0.18/
chmod -R 775 /data/mysql8.0.18/

初始化组复制实例

1
2
3
/opt/mysql-8.0.18/bin/mysqld --initialize-insecure --basedir=/opt/mysql-8.0.18 --datadir=/data/mysql8.0.18/mysql1/
/opt/mysql-8.0.18/bin/mysqld --initialize-insecure --basedir=/opt/mysql-8.0.18 --datadir=/data/mysql8.0.18/mysql2/
/opt/mysql-8.0.18/bin/mysqld --initialize-insecure --basedir=/opt/mysql-8.0.18 --datadir=/data/mysql8.0.18/mysql3/

警告

不要 --initialize-insecure 在生产环境中 使用 ,它仅用于简化教程。

组复制设置

每个实例的配置文件需单独设置,需要调整地方可根据组织方式做相应调整,如下为实例mysql1配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
vim /data/mysql8.0.18/mysql1/my.cnf
[mysqld]
server-id = 1
port = 3306
mysqlx_port = 33060
basedir = /opt/mysql-8.0.18
datadir = /data/mysql8.0.18/mysql1
socket = /data/mysql8.0.18/mysql1/mysql.sock
log-error = /data/mysql8.0.18/mysql1/mysqld.log
pid-file = /data/mysql8.0.18/mysql1/mysqld.pid
log-bin = /data/mysql8.0.18/mysql1/binlog
slow_query_log_file = /data/mysql8.0.18/mysql1/slow.log
default-authentication-plugin = mysql_native_password
disabled_storage_engines ="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid-mode = on
binlog_format = ROW
binlog_checksum = NONE
log_slave_updates = ON
master_info_repository =TABLE
relay_log_info_repository=TABLE
enforce-gtid-consistency = 1
skip_slave_start = 1
#MGR
transaction_write_set_extraction = XXHASH64
group_replication_group_name = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot = off
group_replication_local_address = "127.0.0.1:24901"
group_replication_group_seeds = "127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903"
group_replication_bootstrap_group = off
report_host = 127.0.0.1

组复制需要成员之间的网络连接,这意味着每个成员必须能够解析所有其他成员的网络地址。 例如,在本教程中,所有三个实例都在一台机器上运行,因此为了确保成员可以相互联系,您可以在选项文件中添加一行,例如 report_host=127.0.0.1

创建组复制所需用户

组复制使用异步复制协议来实现,在将组成员加入组之前同步组成员。 分布式恢复过程依赖于名为的复制通道 group_replication_recovery ,该通道 用于将来自供体成员的事务转移到加入该组的成员。 因此,需要设置具有正确权限的复制用户,以便组复制可以建立直接的成员到成员恢复复制通道。

使用选项文件启动实例

1
2
3
/opt/mysql-8.0.18/bin/mysqld --defaults-file=/data/mysql8.0.18/mysql1/my.cnf --user=mysql 2>&1 > /dev/null & // 无提示启动
/opt/mysql-8.0.18/bin/mysqld --defaults-file=/data/mysql8.0.18/mysql1/my.cnf --user=mysql &

连接数据库

1
2
3
/opt/mysql-8.0.18/bin/mysql -uroot -S /data/mysql8.0.18/mysql1/mysql.sock // 无密码连接
/opt/mysql-8.0.18/bin/mysql -uroot -p'xxx' -S /data/mysql8.0.18/mysql1/mysql.sock

创建用户并配置服务器

1
2
3
4
create user rpl_user@'%' identified by 'rpl123';
grant replication slave on *.* to rpl_user@'%';
flush privileges;
change master to master_user='rpl_user',master_password='rpl123' for channel 'group_replication_recovery';

启动组复制

配置并启动实例mysql1后,安装组复制插件。 连接到服务器并发出以下命令:

1
2
install plugin group_replication soname 'group_replication.so';
show plugins;

要启动该组,请指示服务器引导该组,然后启动组复制。 此引导程序应仅由单个服务器完成,该服务器启动组并且只执行一次。 这就是为什么bootstrap配置选项的值未保存在配置文件中的原因。 如果它保存在配置文件中,则在重新启动时,服务器会自动引导具有相同名称的第二个组。

1
2
3
set GLOBAL group_replication_bootstrap_group = on;
start group_replication;
set GLOBAL group_replication_bootstrap_group = off;

一旦 START GROUP_REPLICATION 语句返回,则该组复制已启动。 查看当前mgr成员,判断第一个节点是否成功,member_state状态必须是ONLINE:

1
select * from performance_schema.replication_group_members;

mgr_member_1.png

添加节点

剩余节点分别执行如下命令,启动组复制即可:

1
2
3
4
install plugin group_replication soname 'group_replication.so';
show plugins;
change master to master_user='rpl_user',master_password='rpl123' for channel 'group_replication_recovery';
start group_replication;

mgr_member_3.png

常见错误

无法连接端口

mgr_error_1.png

原因:
loose-group_replication_local_address =”127.0.0.1:3306”
loose-group_replication_group_seeds =”127.0.0.1:3307,127.0.0.1:3306,127.0.0.1:3308”
IP后面不是port,按照官网的例子,24901,24902,24903顺序填写即可

mysqlx端口错误

mgr_error_2.png

原因:
同一服务器部署多实例,未指明不同实例mysqlx端口,使用默认端口时导致端口重复。可在各实例参数文件中指定mysqlx_port即可

参考

mysql 8.0中文手册
单机多实例mysq 8.0l部署安装 - 东瑜 - 博客园