0. 参考文章
官方文档:
MySQL :: MySQL 8.0 Reference Manual :: 18.2 Getting Started
博客:
MGR 单主模式部署教程(基于 MySQL 8.0.28) - 墨天轮 (modb.pro)
mysql MGR单主模式的搭建 - 墨天轮 (modb.pro)
MySQL 5.7 基于组复制(MySQL Group Replication) - 运维小结 - 散尽浮华 - 博客园 (cnblogs.com)
1. 前提条件
硬件条件
- 三台同一局域网内具有互通能力的 Linux 服务器
- 也可以在同一台 Linux 机器上开三个 Docker
能力前提
- 会 Mysql 服务端和客户端的安装和使用,会基本的 Mysql 配置
2. 配置过程
2.1 基础环境准备
修改Linux配置文件:
文件路径:/etc/hosts,在其中加入下列三行配置
每行为对应服务器的 IP 地址
和 host name
。
不要照抄这个配置,需要按照后续介绍查询自己每台机器的配置。
host name:
每台服务器/机器/Docker有自己的 host name,具体获取方法可能有区别,我使用的是机器默认的 host name,没有做修改,一般是与你终端上显示的名字相同:
比如我这台服务器的 host name 为 dellr740
IP 地址:
输入以下命令可获取一个列表,其中 192.168 为首的 IP 一般是本机在本地局域网的地址。
ip addr show
网络连接:
需要确保三台机器之间能够通过上述 IP 相互访问,可以在每台机器上 ping 其它两台机器试试。
ping 192.168.1.4
...
2.2 主节点配置
mysql server 配置文件:
主节点参考配置如下,以下的配置只是MGR相关的配置,mysql 运行的基本配置需要自己设置。
我会对其中关键的参数做解释。
# 不同节点需要调整的配置
server_id=1
loose_group_replication_local_address= "192.168.1.4:33061"
# 需要根据服务器地址进行更改的配置
loose-group_replication_ip_whitelist = "192.168.1.14, 192.168.1.4, 192.168.1.13"
loose_group_replication_group_seeds= "dellr740:33061, east11713:33061, e117:33061"
# 可以直接复制的配置,无需修改
plugin_load_add='group_replication.so'
loose_group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose_group_replication_start_on_boot=off
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
transaction_write_set_extraction=XXHASH64
loose_group_replication_bootstrap_group=off
loose_group_replication_recovery_get_public_key=ON
下列两项配置在每台机器上不一样
# 三台机器不同就行
server_id=1
# 本机的 IP 地址,30061不需要更改,这是 MGR 提供给内部互联的端口
loose_group_replication_local_address= "192.168.1.4:33061"
下列两项配置需要根据自己机器的配置进行调整
# 这一项记录三台机器的 IP
loose-group_replication_ip_whitelist = "192.168.1.14, 192.168.1.4, 192.168.1.13"
# 这一项记录三台机器的 host_name:端口,按道理使用ip:端口也是可以的
loose_group_replication_group_seeds= "dellr740:33061, east11713:33061, e117:33061"
下面这项配置表明MGR需要使用此插件,所以需要自己安装 group_replication.so 插件,我是选择的编译安装。
plugin_load_add='group_replication.so'
MGR用户初始化:
启动主节点的 mysql sever,并使用客户端进入 msyql。
输入以下语句创建组复制的用户:
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
输入以下语句开启组复制
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION USER='rpl_user', PASSWORD='password';
SET GLOBAL group_replication_bootstrap_group=OFF;
SELECT * FROM performance_schema.replication_group_members;
若开启成功,会显示如下类似数据表
2.3 从节点配置
mysql server 配置文件:
配置文件同主节点几乎相同,只需要修改其中前两项,保证 IP 地址是本机的,且 server_id 与另外的机器不同即可。
# 不同节点需要调整的配置
server_id=2
loose_group_replication_local_address= "192.168.1.13:33061"
# 需要根据服务器地址进行更改的配置
loose-group_replication_ip_whitelist = "192.168.1.14, 192.168.1.4, 192.168.1.13"
loose_group_replication_group_seeds= "dellr740:33061, east11713:33061, e117:33061"
# 可以直接复制的配置,无需修改
plugin_load_add='group_replication.so'
loose_group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose_group_replication_start_on_boot=off
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
transaction_write_set_extraction=XXHASH64
loose_group_replication_bootstrap_group=off
loose_group_replication_recovery_get_public_key=ON
从节点加入集群:
启动从节点的 mysql sever,并使用客户端进入 msyql。
输入以下语句创建组复制的用户:
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
输入以下语句开启组复制
START GROUP_REPLICATION USER='rpl_user', PASSWORD='password';
SELECT * FROM performance_schema.replication_group_members;
若开启成功,会显示如下类似数据表
3. 问题汇总
错误信息可以在 mysql 客户端看到一些,也可以在 mysql server 的终端看到(或者是终端输出的错误日志中)
MY-001045
从节点的密码设置与主节点不一致(如果是复制我上述的语句,不会出现这个错误)
MY-002005
主机名和 /etc/hosts中名字不一致,正确的主机名可以用以下语句产生的图中看到。
SELECT * FROM performance_schema.replication_group_members;
ERROR 3098 (HY): The table does notcomply with the requirements by anexternal plugin .
mysql只支持 innodb 作为 MGR 的存储引擎,如果需要使用自己的存储引擎,需要修改 MGR 插件的源码:
plugin/group_replication/src/observer_trans.cc:143
plugin/group_replication/src/asynchronous_channels_state_observer.cc:202
if (param->tables_info[table].db_type != DB_TYPE_INNODB) {
// 暴力改法(不建议但是可行):改成
if (false) {
Debug 模式 MGR 源码报错
编译安装的时候记得把 MGR 插件也编译成 debug 模式就行了。