MySQL 组复制
MySQL 组复制(Group Replication)是 MySQL 提供的一种高可用性和容错性的复制解决方案,首次作为插件引入是在 MySQL 5.7 版本中。具体支持的版本如下:
-
MySQL 5.7
- 组复制在 MySQL 5.7.14 中以 Beta 版形式引入,作为一个可选插件。
- 需要手动安装和配置插件(
group_replication.so
或group_replication.dll
)。 - 支持单主模式(Single-Primary Mode)和多主模式(Multi-Primary Mode),但功能相对基础,稳定性在早期版本中可能不如后续版本。
-
MySQL 8.0
- 从 MySQL 8.0 开始,组复制插件默认包含在发行版中,无需单独下载。
- 改进了性能、稳定性和功能,例如支持 IPv6、通信协议优化(如消息压缩和分片)。
- MySQL 8.0.17 引入了对补丁版本(Patch Version)的兼容性检查,使得组内成员版本管理更严格。
- 当前最新版本(截至 2025 年 4 月 2 日)是 MySQL 8.0 的某个子版本,建议使用最新的 GA(生产就绪)版本以获得最佳支持。
-
MySQL 8.4
- MySQL 8.4 是最新的长期支持版本(LTS),继续支持组复制,并在此基础上优化了高可用性和管理功能。
- 建议在生产环境中使用此版本,因为它包含了最新的修复和改进。
版本兼容性注意事项:
- 组复制推荐所有组成员运行相同的主版本(如全为 8.0 或全为 8.4),以确保最佳兼容性和性能。
- 在升级过程中,可以临时混合不同版本(如 8.0.16 和 8.0.17),但新版本成员可能以只读模式加入,直到所有成员升级到同一版本。
- 不支持从较新版本向较旧版本复制(例如,从 8.0 到 5.7)。
如何入门 MySQL 组复制
以下是入门 MySQL 组复制的基本步骤,假设你使用的是 MySQL 8.0 或 8.4,并在一组三台服务器上进行配置(最低推荐数量为 3,以确保多数派仲裁)。
1. 环境准备
- 硬件要求:至少 3 台服务器,建议网络延迟低、带宽充足。
- 软件要求:安装 MySQL 8.0 或 8.4(确保组复制插件已包含)。
- 网络要求:支持 IPv4(8.0.14 起支持 IPv6),确保服务器间双向通信畅通。
2. 检查插件
登录 MySQL,确认组复制插件是否可用:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM information_schema.PLUGINS WHERE PLUGIN_NAME = 'group_replication';
如果未安装,可手动安装:
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
3. 配置 MySQL 实例
编辑每台服务器的 MySQL 配置文件(通常是 /etc/my.cnf
或 /etc/mysql/my.cnf
),添加以下内容:
[mysqld]
# 唯一服务器 ID
server_id = 1 # 每台服务器需不同,例如 1、2、3
# 启用二进制日志
log_bin = mysql-bin
# 记录从节点更新
log_slave_updates = ON
# 使用 InnoDB 引擎
default_storage_engine = InnoDB
# 组复制相关配置
group_replication_group_name = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # 使用 uuidgen 生成唯一 UUID
group_replication_local_address = "192.168.1.1:33061" # 本地 IP 和端口,每台不同
group_replication_group_seeds = "192.168.1.1:33061,192.168.1.2:33061,192.168.1.3:33061" # 所有成员地址
group_replication_bootstrap_group = OFF # 仅在第一台启动时设为 ON
group_replication_single_primary_mode = ON # 单主模式,设为 OFF 则为多主模式
transaction_write_set_extraction = XXHASH64 # 事务写集提取算法
binlog_checksum = NONE # 关闭校验和以避免兼容性问题
注意:
- 每台服务器的
server_id
和group_replication_local_address
必须唯一。 group_replication_group_name
在所有服务器上保持一致。
4. 创建复制用户
在每台服务器上创建用于组复制的用户:
SET SQL_LOG_BIN = 0; # 避免用户创建被复制
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
SET SQL_LOG_BIN = 1;
5. 启动组复制
-
第一台服务器(引导节点):
- 设置引导组:
SET GLOBAL group_replication_bootstrap_group = ON;
- 启动组复制:
START GROUP_REPLICATION;
- 关闭引导模式:
SET GLOBAL group_replication_bootstrap_group = OFF;
- 设置引导组:
-
其他服务器:
直接启动组复制:START GROUP_REPLICATION;
6. 验证组状态
检查组成员状态:
SELECT MEMBER_ID, MEMBER_HOST, MEMBER_STATE FROM performance_schema.replication_group_members;
MEMBER_STATE
为ONLINE
表示正常运行。- 在单主模式下,可通过以下命令查看主节点:
SELECT * FROM performance_schema.replication_group_members WHERE MEMBER_ROLE = 'PRIMARY';
7. 测试复制
在主节点上创建数据库和表,插入数据,检查其他节点是否同步:
CREATE DATABASE test_db;
USE test_db;
CREATE TABLE test_table (id INT PRIMARY KEY, name VARCHAR(50));
INSERT INTO test_table VALUES (1, 'Test');
8. 最佳实践
- 监控:定期检查
performance_schema.replication_group_members
表。 - 备份:使用
mysqldump
或Percona XtraBackup
定期备份数据。 - 升级:逐步升级所有成员至相同版本,避免混合版本运行太久。
资源推荐
- 官方文档:MySQL 8.0 Reference Manual - Group Replication(https://dev.mysql.com/doc/refman/8.0/en/group-replication.html)
- 教程:DigitalOcean 的 MySQL 组复制配置指南(适用于 Ubuntu 等系统)。
通过以上步骤,你可以快速入门 MySQL 组复制并搭建一个高可用数据库集群!