前言
MySQL Group Replication是一个MySQL Server插件,可用于创建弹性,高可用性,容错复制拓扑。
组复制
组复制是一种可用于实现容错系统的技术。 复制组是一组通过消息传递相互交互的服务器。 通信层提供一组保证,例如原子消息和总订单消息传递。 这些是非常强大的属性,可以转换为非常有用的抽象,可以用来构建更高级的数据库复制解决方案。
MySQL Group Replication构建于此类属性和抽象之上,并实现了多主机更新到处复制协议。 本质上,复制组由多个服务器组成,组中的每个服务器可以独立地执行事务。 但是所有读写(RW)事务只有在得到组的批准后才会提交。 只读(RO)事务在组内不需要协调,因此立即提交。 换句话说,对于任何RW事务,组需要决定它是否提交,因此提交操作不是来自始发服务器的单方面决定。 确切地说,当事务准备好在原始服务器上提交时, 服务器以原子方式广播写入值(已更改的行)和对应的写入集(已更新的行的唯一标识符)。 然后为该交易建立全局总订单。 最终,这意味着所有服务器都以相同的顺序接收相同的事务集。 因此,所有服务器都以相同的顺序应用相同的更改集,因此它们在组内保持一致。
但是,在不同服务器上并发执行的事务之间可能存在冲突。 通过在称为 认证 的过程中检查两个不同和并发事务的写集来检测这种冲突 。 如果在不同服务器上执行的两个并发事务更新同一行,则存在冲突。 解决过程指出,首先订购的事务在所有服务器上提交,而第二个订购的事务在中止,因此在原始服务器上回滚并由组中的其他服务器删除。 这实际上是分布式的第一个提交获胜规则。
MySQL组复制协议
最后,组复制是一种无共享复制方案,其中每个服务器都有自己的整个数据副本。
关于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;
|
添加节点
剩余节点分别执行如下命令,启动组复制即可:
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;
|
常见错误
无法连接端口
原因:
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端口错误
原因:
同一服务器部署多实例,未指明不同实例mysqlx端口,使用默认端口时导致端口重复。可在各实例参数文件中指定mysqlx_port即可
参考
mysql 8.0中文手册
单机多实例mysq 8.0l部署安装 - 东瑜 - 博客园