一、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集群搭建流程如下,本文将介绍搭建单主模式,包括一主一从(一主多从的流程基本相同)
- MySQL服务安装
- MGR集群配置(my.cnf)
- 创建集群复制专用用户,配置用户复制权限
- 配置同步规则
- 安装复制插件
- 第一个节点开启引导组,即创建复制组,启动复制插件
- 其他节点启动复制插件,即加入复制组
1.MySQL服务安装
安装MySQL过程不在本文赘述,请参考 MySQL安装--yum(CentOS7 + MySQL 5.7.35) 或 MySQL安装--rpm(CentOS7 + MySQL 5.7.35)
2.MGR集群配置
特别关注:配置文件中指定的所有路径,请在启动前确保已存在
在MySQL安装教程中配置文件基础上,增加MGR集群配置,最终my.cnf配置文件如下。
特别关注:如果MySQL初始化安装后直接使用如下配置文件,则需要将 loose-group_replication_start_on_boot 配置为OFF,考虑如下
- 第一次关闭插件,可以确保在启动组复制之前,可以进行一些配置修改,如配置同步用户,配置同步规则等,配置完成后,才能正常组建集群
- MySQL初始化后,需要通过临时密码登录,而登录后限制第一个操作必须ALTER语句修改密码,如果启动了复制插件,将作为slave角色,只读状态,无法执行修改密码、配置用户等操作。
- 加入集群之前的所有写操作,建议先关闭binlog,可以在my.cnf 【mysqld】节最后增加 skip-log-bin 或 disable-log-bin(只要在binlog相关配置后即可,因为mysql遵循后配置优先生效原则),也可以在登录mysql后,执行 SET SQL_LOG_BIN=0,在节点加入集群前再次开启binlog即可
- 确认节点加入集群后,可以将 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(10,172.16 - 172.31,192.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,避免节点重启服务后创建新的集群,造成脑裂。
如果集群中至少有一个节点在线,则其他节点启动后直接加入即可。
特别关注
如果集群所有节点同时离线,则需要重新创建集群,参照本教程上述内容执行以下步骤
- 由第一个节点临时设置group_replication_bootstrap_group = ON
- 第一个节点 start group_replication 创建集群
- 第一个节点关闭该配置 group_replication_bootstrap_group = OFF
- 其他节点启动后 start group_replication 加入集群
以上操作请参考 MySQL MGR集群部署运维常用脚本
特别关注
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加载顺序:
- 服务器启动时加载本地配置 auto_increment_increment和 auto_increment_offset
- 组复制插件启动时,如果auto_increment_increment和 auto_increment_offset都配置为1,则分别使用 group_replication_auto_increment_increment和 server_id 的值替代
- 组复制插件停止时,如果启动时执行了替代,将两个还原为本地配置
经验证,以上配置组合结果如下
- group_replication_auto_increment_increment可以配置
- 不支持group_replication_auto_increment_offset参数,auto_increment_offset的值必定会使用 server_id 替代
- 不建议在本地登录服务器后通过命令更改,一方面可能会破坏集群设计的自增长策略,一方面会在一定周期内被组复制插件恢复
- 单主模式下,主从切换时,由于数据库已经完成同步,所以新的主会以当前最大的自增字段值开始执行,而不是从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点特性,实际使用中会出现数据融合的一些问题。
- 数据同步方向为 主 -> 从
- 数据同步方式为 binlog
假设当前主服务器为A,从服务器为B,均设置group_replication_allow_local_disjoint_gtids_join = ON,其中B加入集群之前,已经存在独立的数据库TempDataBase。
场景一:当前集群架构下,基于以上特性,B.TempDataBase无法回流到A,此时通过A访问集群时,无法查询TempDataBase,但通过B访问集群时,可以查询TempDataBase。
场景二:如果A宕机或其他异常引起MGR主从切换,B变为主服务器,此时将会有2种情况
- 如果B加入集群前已经开启binlog,即TempDataBase有完整的binlog记录,则A作为从服务器,会从B同步到TempDataBase,此时A、B数据完全同步
- 如果B加入集群前未开启binlog,则A服务器无法同步TempDataBase,此时通过B访问集群,可以查询TempDataBase,但通过A访问集群,无法查询
实际使用过程中,如果出现以上问题,需要根据实际业务评估数据融合方案,可以采用先手工同步数据(导出/导入,备份还原,等),也可以先重置新服务器(现有业务数据已经无效),然后加入集群。
特别关注:手工同步集群数据时,请先关闭从服务器binlog,避免从切换为主时,数据回流造成冲突。
6.关于无主键数据表
如果新节点已经存在无主键的InnoDB表,加入时会报告异常,解决方案如下
- 为相应的表设置主键,或设置一个与主键等价的唯一索引(不允许为NULL)
- 删除相应的表
7.关于MGR集群配置IP白名单
MySQL MGR根据IP白名单约束可以加入集群的服务器,配置项如下
- group_replication_ip_whitelist(MySQL 8.0.22之前)
- 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,下次重启是配置再生效
特别关注:系统默认启用了防火墙,请在启动服务前关闭防火墙,或在防火墙中添加服务端口