作者公众号,欢迎一起交流。
1 背景
MySQL Group Replication(简称MGR)是MySQL官方于2016年12月12日推出的一款高可用与高扩展的解决方案,它提供了高可用、高扩展、高可靠的MySQL集群服务,具有以下特点:
- 强一致性:基于原生复制和paxos协议,保证数据传输的一致性和原子性
- 高容错性:只要大多数节点没有出现故障,集群就可对外提供服务
- 高扩展性:节点的加入和移除都是自动的,不需要人为过多干预
- 高灵活性:具有单主模式和多主模式,单主模式在主宕机后自动选主,多主模式多节点写入
实验环境若无特殊说明,MySQL数据库版本均为8.0.27
2 组复制插件架构
MySQL MGR是一个MySQL插件,构建在现有MySQL复制基础架构上。MGR插件包括一组用于Capture、Apply和Lifecycle的API,用于控制插件如何与MySQL服务器进行交互。通过接口可以让信息在服务器和插件之间流转,而且这些接口将MySQL服务器核心从组复制插件隔离出来。从服务器到插件这个方向,会有如服务器启动、服务器恢复、服务器准备接受连接和服务器即将提交事务的事件的通知,而在另一个方向,即插件到服务器这个方向,插件指示服务器执行如提交或终止正在进行的事务,或在Relaylog中对事务排队这样的操作。
再往下一层是一组组件,包括Capture、Applier和Recovery,当通知路由到这些组件时会做出相应的响应。其中,Capture组件负责追踪正在执行事务的上下文信息,Applier组件负责在数据库上执行远程事务,Recover组件管理分布式恢复。
继续往下看,复制协议模块包含复制协议的特定逻辑,它处理冲突检测,接收事务并将其传播到组。
最后两层是组通信系统(GCS)API,以及基于Paxos的组通信引擎的实现。
3 配置要求和限制
组复制的使用需要满足如下要求:
- InnoDB存储引擎
- 每个表必须有显式主键
- 网络性能要求低延时、高带宽
- server_id要唯一
- 开启GTID
- 事务隔离级别建议使用RC
- 不建议使用外键级联约束
- 组成员最大数目为9
4 单主模式部署
4.1 部署环境
Hostname |
IP |
Server ID |
Port |
node1 |
192.168.56.201 |
201 |
3306 |
node2 |
192.168.56.202 |
202 |
3306 |
node3 |
192.168.56.203 |
203 |
3306 |
4.2 安装部署
4.2.1 安装MySQL数据库软件
1)分别在节点node1、node2和node3的/etc/hosts文件增加如下配置:
192.168.56.201 node1 node1.com.cn
192.168.56.202 node2 node2.com.cn
192.168.56.203 node3 node3.com.cn
2)分别在节点node1、node2和node3关闭防火墙:
查看防火墙状态:
systemctl status firewalld
关闭防火墙:
systemctl stop firewalld
禁用防火墙启动:
systemctl disable firewalld
3)安装MySQL数据库,参照【MySQL 8.0 数据库安装部署】分别在节点node1、node2和node3安装MySQL数据库软件。
4.2.2 安装主节点node1
1)配置组复制,在原有的配置文件/etc/my.cnf中增加如下配置信息:
disabled_storage_engines = "MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid_mode = ON
enforce_gtid_consistency = ON
binlog_checksum = CRC32
plugin_load_add = 'group_replication.so'
group_replication_group_name = "0b15d45f-6e29-11ec-99b3-08002790c7d5"
group_replication_start_on_boot = off
group_replication_local_address = "node1:33061"
group_replication_group_seeds = "node1:33061,node2:33061,node3:33061"
group_replication_bootstrap_group = off
2)重启MySQL服务器实例使配置生效:
[root@node1 ~]# service mysql.server restart
Shutting down MySQL.... SUCCESS!
Starting MySQL....... SUCCESS!
3)连接MySQL服务器创建分布式恢复用户并授予权限,若使用Clone操作,需授予对应的权限:
mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
mysql> create u