MySQL MGR集群搭建(CentOS7 + MySQL 5.7.35)

发布时间 2023-09-04 13:49:03作者: xiaoyaozhe

Linux系统-部署-运维系列导航

 

一、MGR架构的介绍

1、简介
MGR(MySQL Group Replication)是MySQL5.7.17版本引进来的一个数据库高可用架构,解决了传统异步复制和半同步复制的缺陷(主从数据一致性的问题),MGR依靠分布式一致性协议PAXOS,实现了主从数据库的一致性。
PAXOS协议:是一种基于消息传递的一致性算法。MGR中由若干个节点共同组成一个组复制,一个事物的提交,必须经过组内大多数节点(N/2 + 1)投票并通过,才能提交。
 
2、MGR特点
  • 高一致性:基于分布式PAXOS协议实现组复制,保证数据的一致性;
  • 高容错性:故障自动检测机制,只要有半数节点存活MGR就可以继续工作;
  • 高扩展性:节点的增加与移除会自动更新组成员信息,新节点加入后,自动从其他节点同步增量数据,直到与其他节点数据一致;
  • 高灵活性:提供单主模式和多主模式。单主模式在主库宕机后能够自动选主(根据MEMBER_ID的排序情况,最小的升级为主库),所有写操作都在主库上进行,多主模式支持多节点写入;
 
3、MGR故障检测机制
MGR中有一个故障检测机制,会提供某节点可能死掉的信息,某个server无响应时触发猜测,组内其余成员进行协调以排除该节点,与它隔离开来,该节点无法同步其他节点传送过来的binlog,也无法执行任何本地事务。
 
4、搭建MGR的前提条件
  • 存储引擎必须是InnoDB(支持事物处理),并且每张表一定要有主键,用于解决write冲突;
  • 必须打开GTID特性
  • binlog日志格式必须设置为ROW;
  • 目前一个MGR集群组最多支持9个节点;
  • 不支持SERIALIZABLE事物隔离级别;
  • 不支持外键:多主不支持,单主模式不存在此问题
特别关注:MGR实际可以创建无主键的InnoDB表,但也仅仅可以创建空表,业务上无法写入数据,否则会报告以下异常
The table does not comply with the requirements by an external plugin.

 

二、MGR搭建

集群架构设计
 
机器名称  
IP
服务器角色
备注
localhost
192.168.11.13
MGR节点1
CentOS7 + MySQL 5.7.35
localhost
192.168.11.14
MGR节点2
CentOS7 + MySQL 5.7.35
 
MGR集群搭建流程如下,本文将介绍搭建单主模式,包括一主一从(一主多从的流程基本相同)
  1. MySQL服务安装
  2. MGR集群配置(my.cnf)
  3. 创建集群复制专用用户,配置用户复制权限
  4. 配置同步规则
  5. 安装复制插件
  6. 第一个节点开启引导组,即创建复制组,启动复制插件
  7. 其他节点启动复制插件,即加入复制组
 

1.MySQL服务安装

 

2.MGR集群配置

特别关注:配置文件中指定的所有路径,请在启动前确保已存在
 
在MySQL安装教程中配置文件基础上,增加MGR集群配置,最终my.cnf配置文件如下。
特别关注:如果MySQL初始化安装后直接使用如下配置文件,则需要将 loose-group_replication_start_on_boot 配置为OFF,考虑如下
  1. 第一次关闭插件,可以确保在启动组复制之前,可以进行一些配置修改,如配置同步用户,配置同步规则等,配置完成后,才能正常组建集群
  2. MySQL初始化后,需要通过临时密码登录,而登录后限制第一个操作必须ALTER语句修改密码,如果启动了复制插件,将作为slave角色,只读状态,无法执行修改密码、配置用户等操作。
  3. 加入集群之前的所有写操作,建议先关闭binlog,可以在my.cnf 【mysqld】节最后增加 skip-log-bin 或 disable-log-bin(只要在binlog相关配置后即可,因为mysql遵循后配置优先生效原则),也可以在登录mysql后,执行 SET SQL_LOG_BIN=0,在节点加入集群前再次开启binlog即可
  4. 确认节点加入集群后,可以将 loose-group_replication_start_on_boot 配置为ON,重启服务即可。
 
核心配置原则包括
  • 开启binlog并配置GTID
  • 配置集群种子节点,用于新加入的节点连接并同步集群数据
  • 配置集群模式,即单主/多主
  • 配置组标识ID,组内所有节点配置相同组ID
  • 配置引导组,用于创建复制组
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

#[client]用于客户端工具连接,如mysqladmin工具
[client]
#mysql以socket方式运行的sock文件位置
socket=/data/mysql/mysql.sock

#[mysql]用于mysql命令连接,如mysql -u xxx -p 
[mysql]
#mysql以socket方式运行的sock文件位置
socket=/data/mysql/mysql.sock

#[mysqld]配置组为mysql服务运行参数配置,java、navicat等客户端连接使用该部分socket配置
[mysqld]
###集群中各服务器需要单独配置的项###
#服务ID,官方建议server_id最好为1,2,3这样的自增量,且每台都不同
server_id = 1 
#本节点的IP地址和端口,注意该端口是组内成员之间通信的端口,而不是MySQL对外提供服务的端口
#如果服务器开启了防火墙,需要允许33071
loose-group_replication_local_address = '192.168.11.13:33071'
#种子节点的IP和端口号,新成员加入到集群的时候需要联系种子节点获取复制数据,启动集群的节点不使用该选项
loose-group_replication_group_seeds = '192.168.11.13:33071,192.168.11.14:33071'
#mysql默认通过dns查找其他服务器,如果多台服务器hostname配置相同,将无法正确解析,此处配置使集群中以IP为服务器标识
report_host=192.168.11.13
#不再进行反解析(ip不反解成域名),加快数据库的反应时间
skip-name-resolve
###集群中各服务器需要单独配置的项###

#mysql mgr集群所有节点同时离线(如机房停电等)后,无法自动开启集群
#此时各节点启动后,并没有组成集群,各自具有读写能力,如果客户端连接不同节点进行操作,就会造成数据不一致,此时再创建集群,就会遇到问题
#将所有节点默认设置为只读状态,创建集群/加入集群后,由mgr自动修改其只读状态,避免客户端连接而数据不一致
#普通用户只读
read_only=1
#超级权限用户只读
super_read_only=1

#跳过权限检查,用于mysql服务修复
#skip-grant-tables
#修改默认端口,可能需要关闭SELinux,否则启动失败,提示端口无法绑定
port=3307
#mysql日志时间默认为utc,改为与系统一致
log_timestamps=SYSTEM
#mysql数据文件目录
datadir=/data/mysql/data
#mysql以socket方式运行的sock文件位置
socket=/data/mysql/mysql.sock
#错误日志位置
log-error=/data/mysql/log/mysqld.log
#是否支持符号链接,即数据库或表可以存储在my.cnf中指定datadir之外的分区或目录,为0不开启
symbolic-links=0
#比较名字时忽略大小写,创建表时,大写字母将转为小写字母
#特别关注:集群所有节点设置必须一致
lower_case_table_names=1

###MGR集群配置###
#特别关注:以下参数,除loose-group_replication_bootstrap_group需要在不同节点灵活配置外,集群所有节点建议设置一致
#在MGR中,必须使用InnoDB存储引擎,使用其他存储引擎可能会导致MGR发生错误。设置系统变量disabled_storage_engines以防止其他存储引擎被使用
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" 
#配置默认引擎为INNODB
default_storage_engine=INNODB
#全局事务
gtid_mode = ON 
#强制GTID的一致性
enforce_gtid_consistency = ON 
#将master.info元数据保存在系统表中
master_info_repository = TABLE 
#将relay.info元数据保存在系统表中
relay_log_info_repository = TABLE 
#禁用二进制日志事件校验
binlog_checksum = NONE 
#级联复制,即设置每个节点都要转存binlog
log_slave_updates = ON 
#开启二进制日志记录
log_bin = binlog 
#以行的格式记录
binlog_format = ROW 
#设置多线程复制类型为逻辑时钟(5.7新增)提高效率,默认为数据库(DATABASE)
slave_parallel_type=logical_clock
slave_parallel_workers=16
slave_preserve_commit_order=ON
#使用哈希算法将其编码为散列
transaction_write_set_extraction = XXHASH64 
#自增长字段配置,由于集群中所有节点都可能执行写操作,所有自增字段需要配置起始偏移以及自增量,避免多服务器重复
#配置加载顺序
#1.服务器启动时加载本地配置 auto_increment_increment和 auto_increment_offset
#2.组复制插件启动时,如果auto_increment_increment和 auto_increment_offset都配置为1,则分别使用 group_replication_auto_increment_increment和 server_id 的值替代
#3.组复制插件停止时,如果启动时执行了替代,将两个还原为本地配置
#group_replication_auto_increment_increment可配置,默认为7,不支持group_replication_auto_increment_offset参数,即server_id必定替代auto_increment_offset
#单主模式下,可以配置自增量为1,多主模式下,官方建议自增配置为集群内成员数
auto_increment_increment=1
auto_increment_offset=1
group_replication_auto_increment_increment=1

#测试用:关闭binlog,配置skip-log-bin 或 disable-log-bin,该配置在binlog相关配置之后才能生效,因为mysql遵循后配置优先生效原则
#skip-log-bin

#启动自动加载插件,否则需要在启动后执行 install plugin group_replication soname 'group_replication.so';
plugin_load = 'group_replication=group_replication.so'
#MGR配置项变量使用loose-前缀表示Server启用时没有加载复制插件也能继续启动
#组名,可以自定义,格式是UUID,集群所有主机需要一致
loose-group_replication_group_name = '620245b8-87f4-4591-b805-898e2ee8043a'
#启用MGR单主模式,以下2个参数用于切换单主模式与多主模式
loose-group_replication_single_primary_mode = ON
loose-group_replication_enforce_update_everywhere_checks = OFF
#在服务器启动时不要自动开启复制插件,这一步十分重要,可以确保在启动组复制之前,可以进行一些配置修改,如配置同步用户,配置同步规则等,配置完成后,才能正常组建集群
#集群组建完成后,可以改成on,后期节点故障后重启服务即可自动加入集群
loose-group_replication_start_on_boot = OFF 
#这个变量告诉插件是否开启“引导组”的功能。
#一般来说一个组中需要且只能有一个server将次参数设置为on,但是在搭建时,都先使用off,防止启动时出现脑裂的情况,即所有节点各自创建新的复制组
#所以,在第一个server启动上线后,再开启这个参数,启动复制组后,立即关闭
loose-group_replication_bootstrap_group = OFF
#允许加入复制组的实例自身存在binlog,否则会报异常:[ERROR] Plugin group_replication reported: \'This member has more executed transactions than those present in the group.
loose-group_replication_allow_local_disjoint_gtids_join = ON
#IP白名单,可以不配置,默认为AUTOMATIC,即自动识别 127.0.0.1 以及 服务器当前所在局域网的所有IP(10172.16 - 172.31192.168)
#配置格式支持:ip、ip/子网掩码、AUTOMATIC
#如果集群中的各服务器不在同一个局域网,则需要明确配置白名单
#MySQL 8.0.22之前使用 group_replication_ip_whitelist,之后使用 group_replication_ip_allowlist
#group_replication_ip_whitelist='192.168.11.13/24'

 

3.创建集群复制专用用户,配置用户复制权限

MGR组内使用异步复制协议进行分布式恢复(distributed recovery),需要特定的用户以及配置特定的权限,包括 replication slave。
mysql> grant replication slave on *.* to 'repl_user'@'%' identified by 'Repl_pass_123';
Query OK, 0 rows affected, 1 warning (0.04 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.02 sec)
原则上需要在每一个节点上都配置专用用户,实际上在第一台节点上创建这个用户一次就可以了,创建用户的记录会记入binlog日志,其他节点成功加入复制组后,会自动同步复制过去。
如果想手动配置同步用户,为避免相同账户信息在节点间出现同步问题,建议先临时关闭binlog,配置用户完成后再开启binlog。
mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)

mysql> grant replication slave on *.* to 'repl_user'@'%' identified by 'Repl_pass_123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)

 

4.配置同步规则

MGR分布式恢复依赖于一个复制通道:group_replication_recovery,所有节点通过上述步骤创建的用户连接该通道同步集群数据。配置该通道是每一个新加入组的成员所做的第一件事,如果这个用户配置不正确,没有创建同步规则认证信息,那么这个新成员将不能连接到其他成员从而获取数据,最终导致加入失败。
mysql> CHANGE MASTER TO MASTER_USER='repl_user', MASTER_PASSWORD='Repl_pass_123' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.02 sec)

 

5.安装复制插件

MGR所有的操作都依赖group_replication插件完成,该插件可以在配置文件中指定,也可以在服务启动后执行命令安装,如下
#my.cnf配置方式
plugin_load = 'group_replication=group_replication.so'

#服务启动后安装方式
INSTALL PLUGIN group_replication SONAME 'group_replication.so';

 

6.第一个节点开启引导组

集群中第一个节点需要开启引导组参数 group_replication_bootstrap_group,启动复制插件后,会根据my.cnf配置的复制组标识ID创建组,创建成功后,关闭引导组参数。
mysql> set global group_replication_bootstrap_group=on;
Query OK, 0 rows affected (0.00 sec)

mysql> start group_replication;
Query OK, 0 rows affected, 1 warning (2.09 sec)

mysql> set global group_replication_bootstrap_group=off;
Query OK, 0 rows affected (0.00 sec)
 
集群创建后,可以查询集群节点信息
mysql> select * from performance_schema.replication_group_members ;
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| group_replication_applier | 5e2b2f7f-7e7f-11ec-9903-080027801456 | 192.168.11.13 |        3307 | ONLINE       |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
1 row in set (0.00 sec)

 

查询主节点
mysql> select * from performance_schema.global_status where variable_name like '%group%';
+----------------------------------+--------------------------------------+
| VARIABLE_NAME                    | VARIABLE_VALUE                       |
+----------------------------------+--------------------------------------+
| group_replication_primary_member | 5e2b2f7f-7e7f-11ec-9903-080027801456 |
+----------------------------------+--------------------------------------+
1 row in set (0.00 sec)

 

查询节点状态,如只读状态,主节点可读写,从节点只读
mysql> show global variables like '%super%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| super_read_only | OFF   |
+-----------------+-------+
1 row in set (0.01 sec)

 

7.插入数据,模拟集群动态扩展

mysql> create database mgr_test default character set utf8;
Query OK, 1 row affected (0.04 sec)

mysql> use mgr_test;
Database changed

mysql> create table person (id int(10) primary key auto_increment not null,name varchar(20),age int(10)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.02 sec)

mysql> insert into person(id,name,age) values(1,'zhangsan',21);
Query OK, 1 row affected (0.02 sec)

mysql> insert into person(id,name,age) values(2,'lisi',23);
Query OK, 1 row affected (0.02 sec)

mysql> select * from person;
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  1 | zhangsan |   21 |
|  2 | lisi     |   23 |
+----+----------+------+
2 rows in set (0.00 sec)

 

8.其他节点启动复制插件,即加入复制组

以下在192.168.11.14操作
mysql> start group_replication;
Query OK, 0 rows affected, 1 warning (5.74 sec)

 

查询集群节点信息,已经有2个节点,都是在线状态。
mysql> select * from performance_schema.replication_group_members ;
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| group_replication_applier | 5e2b2f7f-7e7f-11ec-9903-080027801456 | 192.168.11.13 |        3307 | ONLINE       |
| group_replication_applier | cbcef9a0-7f33-11ec-978e-0800271ec1ee | 192.168.11.14 |        3307 | ONLINE       |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
2 rows in set (0.00 sec)

 

新加入的节点,会先显示恢复状态:RECOVERING,即正在同步集群数据,完成后显示在线:ONLINE。
特别关注:节点第一次加入时,RECOVERING状态会持续一段时间,请关注MySQL日志确认同步过程是否正常。
ONLINE节点异常恢复后重新加入集群时,RECOVERING状态持续时间较短。
 
查询主节点,为192.168.11.13
mysql> select * from performance_schema.global_status where variable_name like '%group%';
+----------------------------------+--------------------------------------+
| VARIABLE_NAME                    | VARIABLE_VALUE                       |
+----------------------------------+--------------------------------------+
| group_replication_primary_member | 5e2b2f7f-7e7f-11ec-9903-080027801456 |
+----------------------------------+--------------------------------------+
1 row in set (0.00 sec)

 

查询从节点状态,此时为只读状态
mysql> show global variables like '%super%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| super_read_only | ON    |
+-----------------+-------+
1 row in set (0.00 sec)

 

9.11.14从节点验证数据同步

mysql> select * from person;
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  1 | zhangsan |   21 |
|  2 | lisi     |   23 |
+----+----------+------+
2 rows in set (0.00 sec)
至此,一主一从MGR集群搭建完毕,如果有其他节点加入,按照从节点192.168.11.14的操作执行即可。

 

三、MGR故障恢复测试
1.主节点11.13停止服务
[root@localhost ~]# service mysqld stop
Redirecting to /bin/systemctl stop mysqld.service

 

2.从节点11.14切换为主,且可以读写
mysql> select * from performance_schema.replication_group_members ;
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| group_replication_applier | cbcef9a0-7f33-11ec-978e-0800271ec1ee | 192.168.11.14 |        3307 | ONLINE       |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
1 row in set (0.00 sec)

mysql> select * from performance_schema.global_status where variable_name like '%group%';
+----------------------------------+--------------------------------------+
| VARIABLE_NAME                    | VARIABLE_VALUE                       |
+----------------------------------+--------------------------------------+
| group_replication_primary_member | cbcef9a0-7f33-11ec-978e-0800271ec1ee |
+----------------------------------+--------------------------------------+
1 row in set (0.00 sec)

mysql> show global variables like '%super%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| super_read_only | OFF   |
+-----------------+-------+
1 row in set (0.00 sec)

 

3.故障节点11.13恢复,切换为从
[root@localhost ~]# service mysqld start
Redirecting to /bin/systemctl start mysqld.service

 

重新加入集群,确认本节点为从角色,只读状态
mysql> start group_replication;
Query OK, 0 rows affected, 1 warning (5.74 sec)

mysql> select * from performance_schema.replication_group_members ;
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| group_replication_applier | 5e2b2f7f-7e7f-11ec-9903-080027801456 | 192.168.11.13 |        3307 | ONLINE       |
| group_replication_applier | cbcef9a0-7f33-11ec-978e-0800271ec1ee | 192.168.11.14 |        3307 | ONLINE       |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
2 rows in set (0.00 sec)

mysql> select * from performance_schema.global_status where variable_name like '%group%';
+----------------------------------+--------------------------------------+
| VARIABLE_NAME                    | VARIABLE_VALUE                       |
+----------------------------------+--------------------------------------+
| group_replication_primary_member | cbcef9a0-7f33-11ec-978e-0800271ec1ee |
+----------------------------------+--------------------------------------+
1 row in set (0.00 sec)

mysql> show global variables like '%super%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| super_read_only | ON    |
+-----------------+-------+
1 row in set (0.00 sec)

 

四、运维常用脚本

 

五、后记

1.关于配置项 group_replication_bootstrap_group

建议所有节点始终配置为 OFF,避免节点重启服务后创建新的集群,造成脑裂。
如果集群中至少有一个节点在线,则其他节点启动后直接加入即可。
特别关注
如果集群所有节点同时离线,则需要重新创建集群,参照本教程上述内容执行以下步骤
  1. 由第一个节点临时设置group_replication_bootstrap_group = ON
  2. 第一个节点 start group_replication 创建集群
  3. 第一个节点关闭该配置 group_replication_bootstrap_group = OFF
  4. 其他节点启动后 start group_replication 加入集群
 
特别关注
mysql mgr集群所有节点同时离线(如机房停电等)后,无法自动开启集群;
此时各节点启动后,并没有组成集群,各自具有读写能力,如果客户端连接不同节点进行操作,就会造成数据不一致,此时再创建集群,就会遇到问题;
将所有节点默认设置为只读状态,创建集群/加入集群后,由mgr自动修改其只读状态,避免客户端连接而数据不一致。
[mysqld]
#普通用户只读
read_only=1
#超级权限用户只读
super_read_only=1

 

2.关于配置项 group_replication_start_on_boot

该配置项说明在服务器启动时是否自动开启复制插件。
在第一次创建集群时,第一个节点需要配置一些集群基本参数,如创建同步用户及权限、配置同步规则(即同步通道),其他节点也至少需要配置同步规则(其中同步账户可以由集群同步而来),这些操作完成后才能正常创建集群,所以建议
  • 初始化集群时,所有节点配置为OFF,可以在加入集群前配置集群基本参数
  • 集群创建成功后,已经加入过集群的节点,可以配置ON,可以在节点故障重启后自动加入集群,因为同步用户、权限、同步规则等已经保存在服务中
 

3.关于配置项 auto_increment_offset 与 auto_increment_increment

由于MGR支持多主模式,即多节点同时支持读写,所以如果数据表使用了自增长字段,必须采用一定的策略保证各节点插入数据不会产生重复值。
MGR提供的方案是配置 auto_increment_offset 起始值偏移 以及 auto_increment_increment 自增步长。
auto_increment_increment和auto_increment_offset加载顺序:
  1. 服务器启动时加载本地配置 auto_increment_increment和 auto_increment_offset
  2. 组复制插件启动时,如果auto_increment_increment和 auto_increment_offset都配置为1,则分别使用 group_replication_auto_increment_increment和 server_id 的值替代
  3. 组复制插件停止时,如果启动时执行了替代,将两个还原为本地配置
经验证,以上配置组合结果如下
  1. group_replication_auto_increment_increment可以配置
  2. 不支持group_replication_auto_increment_offset参数,auto_increment_offset的值必定会使用 server_id 替代
  3. 不建议在本地登录服务器后通过命令更改,一方面可能会破坏集群设计的自增长策略,一方面会在一定周期内被组复制插件恢复
  4. 单主模式下,主从切换时,由于数据库已经完成同步,所以新的主会以当前最大的自增字段值开始执行,而不是从1开始
 

4.关于配置项 disabled_storage_engines

在MGR中,必须使用InnoDB存储引擎,使用其他存储引擎可能会导致MGR发生错误。设置系统变量disabled_storage_engines以防止其他存储引擎被使用。
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
请注意,系统数据库中的一些表使用 MyISAM 存储引擎,如mysql.user表,在禁用MyISAM存储引擎的情况下,仍使用mysql_upgrade进行MySQL升级时(在MySQL 8.0.16之前),mysql_upgrade可能会失败并显示错误。要解决此问题,可以在运行mysql_upgrade时重新启用该存储引擎,升级之后重新启动服务器时并再次将其禁用。
 

5.关于主从服务器数据融合

如果设置了 group_replication_allow_local_disjoint_gtids_join = ON,则允许服务器在加入到集群之前存在数据。
基于MGR集群的以下2点特性,实际使用中会出现数据融合的一些问题。
  1. 数据同步方向为 主 -> 从
  2. 数据同步方式为 binlog
假设当前主服务器为A,从服务器为B,均设置group_replication_allow_local_disjoint_gtids_join = ON,其中B加入集群之前,已经存在独立的数据库TempDataBase。
场景一:当前集群架构下,基于以上特性,B.TempDataBase无法回流到A,此时通过A访问集群时,无法查询TempDataBase,但通过B访问集群时,可以查询TempDataBase。
场景二:如果A宕机或其他异常引起MGR主从切换,B变为主服务器,此时将会有2种情况
  1. 如果B加入集群前已经开启binlog,即TempDataBase有完整的binlog记录,则A作为从服务器,会从B同步到TempDataBase,此时A、B数据完全同步
  2. 如果B加入集群前未开启binlog,则A服务器无法同步TempDataBase,此时通过B访问集群,可以查询TempDataBase,但通过A访问集群,无法查询
实际使用过程中,如果出现以上问题,需要根据实际业务评估数据融合方案,可以采用先手工同步数据(导出/导入,备份还原,等),也可以先重置新服务器(现有业务数据已经无效),然后加入集群。
特别关注:手工同步集群数据时,请先关闭从服务器binlog,避免从切换为主时,数据回流造成冲突。
 

6.关于无主键数据表

如果新节点已经存在无主键的InnoDB表,加入时会报告异常,解决方案如下
  1. 为相应的表设置主键,或设置一个与主键等价的唯一索引(不允许为NULL)
  2. 删除相应的表
 

7.关于MGR集群配置IP白名单

MySQL MGR根据IP白名单约束可以加入集群的服务器,配置项如下
  1. group_replication_ip_whitelist(MySQL 8.0.22之前)
  2. group_replication_ip_allowlist(MySQL 8.0.22之后)
配置格式支持:ip、ip/子网掩码、AUTOMATIC。
配置默认为AUTOMATIC,即自动识别 127.0.0.1 以及 服务器当前所在局域网的所有IP,所以默认情况下,同一个局域网中的服务器都可以正常加入集群。
其中AUTOMATIC可以自动识别的局域网范围如下,根据服务器当前IP确认使用哪个范围
10/8         (10.0.0.0 - 10.255.255.255)
172.16/12    (172.16.0.0 - 172.31.255.255)
192.168/16   (192.168.0.0 - 192.168.255.255)

 

所以,如果集群中的各服务器不在同一个局域网,则需要明确配置白名单,以172.16.11.14加入集群为例,配置如下
group_replication_ip_whitelist='192.168.11/24,172.16.11.14'

 

8.关于单主模式与多主模式

8.1MGR支持多主模式,即所有节点同时支持读写。
多主模式对读写提供了方便,但限制相对会更多,如外键、事务锁、死锁(多节点执行 select for update等指令时成员间无法共享锁)等,同时,多主模式在提交事务时,需要集群内所有节点执行一系列事务状态冲突的检查操作,整体执行效率降低,否则出现数据不一致。
建议根据实际业务场景与数据量分析,优先选择单主模式,架构简单,效率较高。
 
8.2如果要切换多主模式,则执行以下操作实现热切换
1所有节点退出集群 
stop group_replication;

2所有节点关闭单主模式 
set global group_replication_single_primary_mode=FALSE;

3所有节点设置事务检查
set global group_replication_enforce_update_everywhere_checks=TRUE;

4所有节点重新配置同步规则 
CHANGE MASTER TO MASTER_USER='repl_user', MASTER_PASSWORD='Repl_pass_123' FOR CHANNEL 'group_replication_recovery';

5第一个节点开启引导组,开启组复制,关闭引导组
set global group_replication_bootstrap_group=ON;
start group_replication;
set global group_replication_bootstrap_group=OFF;

6其他节点加入集群
start group_replication;
以上热切换可以不停服,切换期间原来的单主节点依然可以执行读写操作,集群创建后各节点也会同步数据。
热切换完成后,需要将配置文件my.cnf的参数 group_replication_single_primary_mode 与group_replication_enforce_update_everywhere_checks 配置修改,实现服务重启后自动完成集群。
如果环境允许,建议停服操作,修改my.cnf后,按照初始化集群步骤重新组建集群。
 
8.3如果要从多主模式切换回单主模式,操作类似,将相关配置反向修改即可,不再赘述
 
特别关注:系统默认启用了SELinux内核模块(安全子系统),所以在服务绑定/监听某些端口时,提示无访问权限,此时需要禁用SELinux,修改 /etc/selinux/config 文件,设置SELINUX=disabled
Can't start server: Bind on TCP/IP port: Permission denied

 

特别关注:selinux设置完成需要重启生效,如果当前不方便重启,可以执行 setenforce 0 临时关闭selinux,下次重启是配置再生效
 
特别关注:系统默认启用了防火墙,请在启动服务前关闭防火墙,或在防火墙中添加服务端口