前言
MySQL Group Replication是一个MySQL Server插件,可用于创建弹性,高可用性,容错复制拓扑。
组复制
组复制是一种可用于实现容错系统的技术。 复制组是一组通过消息传递相互交互的服务器。 通信层提供一组保证,例如原子消息和总订单消息传递。 这些是非常强大的属性,可以转换为非常有用的抽象,可以用来构建更高级的数据库复制解决方案。
MySQL Group Replication构建于此类属性和抽象之上,并实现了多主机更新到处复制协议。 本质上,复制组由多个服务器组成,组中的每个服务器可以独立地执行事务。 但是所有读写(RW)事务只有在得到组的批准后才会提交。 只读(RO)事务在组内不需要协调,因此立即提交。 换句话说,对于任何RW事务,组需要决定它是否提交,因此提交操作不是来自始发服务器的单方面决定。 确切地说,当事务准备好在原始服务器上提交时, 服务器以原子方式广播写入值(已更改的行)和对应的写入集(已更新的行的唯一标识符)。 然后为该交易建立全局总订单。 最终,这意味着所有服务器都以相同的顺序接收相同的事务集。 因此,所有服务器都以相同的顺序应用相同的更改集,因此它们在组内保持一致。
但是,在不同服务器上并发执行的事务之间可能存在冲突。 通过在称为 认证 的过程中检查两个不同和并发事务的写集来检测这种冲突 。 如果在不同服务器上执行的两个并发事务更新同一行,则存在冲突。 解决过程指出,首先订购的事务在所有服务器上提交,而第二个订购的事务在中止,因此在原始服务器上回滚并由组中的其他服务器删除。 这实际上是分布式的第一个提交获胜规则。
MySQL组复制协议
执行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
|
|
创建目录及用户
|
|
初始化组复制实例
|
|
警告
不要
--initialize-insecure
在生产环境中 使用 ,它仅用于简化教程。
组复制设置
每个实例的配置文件需单独设置,需要调整地方可根据组织方式做相应调整,如下为实例mysql1配置文件:
|
|
组复制需要成员之间的网络连接,这意味着每个成员必须能够解析所有其他成员的网络地址。 例如,在本教程中,所有三个实例都在一台机器上运行,因此为了确保成员可以相互联系,您可以在选项文件中添加一行,例如 report_host=127.0.0.1
。
创建组复制所需用户
组复制使用异步复制协议来实现,在将组成员加入组之前同步组成员。 分布式恢复过程依赖于名为的复制通道 group_replication_recovery
,该通道 用于将来自供体成员的事务转移到加入该组的成员。 因此,需要设置具有正确权限的复制用户,以便组复制可以建立直接的成员到成员恢复复制通道。
使用选项文件启动实例
|
|
连接数据库
|
|
创建用户并配置服务器
|
|
启动组复制
配置并启动实例mysql1后,安装组复制插件。 连接到服务器并发出以下命令:
|
|
要启动该组,请指示服务器引导该组,然后启动组复制。 此引导程序应仅由单个服务器完成,该服务器启动组并且只执行一次。 这就是为什么bootstrap配置选项的值未保存在配置文件中的原因。 如果它保存在配置文件中,则在重新启动时,服务器会自动引导具有相同名称的第二个组。
|
|
一旦 START GROUP_REPLICATION 语句返回,则该组复制已启动。 查看当前mgr成员,判断第一个节点是否成功,member_state状态必须是ONLINE:
|
|
添加节点
剩余节点分别执行如下命令,启动组复制即可:
|
|
常见错误
无法连接端口
原因:
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即可