MGR的基础结构要求和使用限制
基础结构要求:
1.引擎必须为innodb,因为需事务支持在commit时对各节点进行冲突检查
2.每个表必须有主键,在进行事务冲突检测时需要利用主键值对比
3.必须开启binlog且为row格式
4.开启GTID,且主从状态信息存于表中(--master-info-repository=TABLE 、--relay-log-info-repository=TABLE),--log-slave-updates打开
5.一致性检测设置--transaction-write-set-extraction=XXHASH64
使用限制:
1.RP和普通复制binlog校验不能共存,需设置--binlog-checksum=none
2.不支持gap lock(间隙锁),隔离级别需设置为read_committed。
3.不支持对表进行锁操作(lock /unlock table),不会发送到其他节点执行 ,影响需要对表进行加锁操作的情况,列入mysqldump全表备份恢复操作
4.不支持serializable(序列化)隔离级别
5.DDL语句不支持原子性,不能检测冲突,执行后需自行校验是否一
6.多主模式下不支持外键,单主模式下支持外键;最多9个节点,超过9台无法加入集群
组复制部分配置参数说明:
group_replication变量使用的loose-前缀是指示Server启用时尚未加载复制插件也将继续启动
transaction_write_set_extraction = XXHASH64
##指示Server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
loose-group_replication_group_name="05153196-c2ab-43ae-b355-b9832eacf0b2"
##表示将加入或者创建的复制组命名为05153196-c2ab-43ae-b355-b9832eacf0b2
##可自定义 通过cat /proc/sys/kernel/random/uuid
loose-group_replication_start_on_boot=off
##设置为Server启动时不自动启动组复制
loose-group_replication_local_address="testdb62:33061"
##绑定本地的testdb62及33061端口接受其他组成员的连接,IP地址必须为其他组成员可正常访问
loose-group_replication_group_seeds="testdb62:33061,testdb136:33061,testdb76:33061"
##本行为告诉服务器当服务器加入组时,应当连接到testdb62:33061,testdb136:33061,testdb76:33061
##这些种子服务器进行配置。本设置可以不是全部的组成员服务地址。
loose-group_replication_bootstrap_group = off
##配置是否自动引导组
loose-group_replication_ip_whitelist="10.30.0.0/16,10.31.0..0/16,10.27.0.0/16"
##配置白名单,默认情况下只允许192.168.109.x连接到复制组,如果是其他IP则需要配置。
环境介绍:
10.10.10.62 testdb62
10.10.10.136 testdb136
10.10.10.76 testdb76
添加/etc/hosts 对IP的映射
10.10.10.62 testdb62
10.10.10.136 testdb136
10.10.10.76 testdb76
一、单主模式
# 修改配置文件,修改或者新增到[mysqld]模块下。3个节点除了server_id、loose-group_replication_local_address 参数不一样外,其他保持一致,然后重启mysql
server-id=1
log_bin=binlog
binlog_format=ROW
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="05153196-c2ab-43ae-b355-b9832eacf0b2"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="testdb62:33061"
loose-group_replication_group_seeds="testdb62:33061,testdb136:33062,testdb76:33063"
loose-group_replication_bootstrap_group=off
loose-group_replication_single_primary_mode=FALSE
loose-group_replication_enforce_update_everywhere_checks= TRUE
# 如果防火墙是打开的,要添加mysql的端口号。
firewall-cmd --permanent --zone=public --add-port={3306,33061}/tcp
firewall-cmd --reload
firewall-cmd --zone=public --list-ports
# 关闭SELinux
临时关闭
setenforce 0
修改配置文件需要重启机器:
sed -i 's/^SELINUX=.*$/SELINUX=disabled/g' /etc/selinux/config
# 创建一个复制用的用户(所有节点执行)
SET SQL_LOG_BIN=0;
grant replication slave on *.* to 'repl'@'10.10.10.%' identified by 'Jimstars';
flush privileges;
SET SQL_LOG_BIN=1;
# 安装group replication插件(所有节点执行)
install PLUGIN group_replication SONAME 'group_replication.so';
# 查看组件是否安装成功
show plugins;
# 修改master信息,构建组复制(group replication)集群信息(所有节点执行)
change master to master_user='repl',master_password='Jimstars' for channel 'group_replication_recovery';
# 开启组复制(group replication)集群(在主库上执行)
set global group_replication_bootstrap_group=on;
# 开启组复制(在主库上执行)
start group_replication;
# 关闭组复制引导(在主库上执行)
set global group_replication_bootstrap_group=off;
# 其他节点加入MGR(在其他节点上执行)
start group_replication;
# 查看MGR组信息
SELECT * FROM performance_schema.replication_group_members;
二、单主切换至多主模式
在创建时就启用多主模式只需在修改配置文件/etc/my.cnf时多加两行参数。其余保持不变
loose-group_replication_single_primary_mode=off //关闭单master模式
loose-group_replication_enforce_update_everywhere_checks=ON //多主一致性检查
# 停止组复制(所有节点执行):
stop group_replication;
set global group_replication_single_primary_mode=OFF;
set global group_replication_enforce_update_everywhere_checks=ON;
# 随便选择某个节点执行
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
# 其他节点执行
START GROUP_REPLICATION;
# 查看组信息,所有节点的 MEMBER_ROLE 都为 PRIMARY
SELECT * FROM performance_schema.replication_group_members;
三、多主切换回单主模式
# 所有节点执行
stop group_replication;
set global group_replication_enforce_update_everywhere_checks=OFF;
set global group_replication_single_primary_mode=ON;
# 主节点执行
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
# 从节点执行
START GROUP_REPLICATION;
# 查看MGR组信息
SELECT * FROM performance_schema.replication_group_members;
四、MGR相关运维
# MGR区分主从服务器
show variables like 'read_only';
如果是主服务器,显示的是 OFF ,从服务器显示的是 ON
# 主库宕机,修复并加入节点
模拟宕机
/etc/init.d/mysqld stop
在testdb136 节点查看已经提升到主节点了。
mysql> show variables like 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only | OFF |
+---------------+-------+
1 row in set (0.00 sec)
在testdb136 节点写入测试数据
mysql> insert into textbook select 2,10076,1;
mysql> select * from textbook;
+--------+----------+--------+
| bookid | schoolid | status |
+--------+----------+--------+
| 1 | 10075 | 1 |
| 2 | 10076 | 1 |
+--------+----------+--------+
2 rows in set (0.04 sec)
修复好 test62 节点,启动并查看状态
mysql> select * from performance_schema.replication_group_members;
+---------------------------+-----------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+-----------+-------------+-------------+--------------+
| group_replication_applier | | | NULL | OFFLINE |
+---------------------------+-----------+-------------+-------------+--------------+
1 row in set (0.00 sec)
将修好的test62 节点添加回复制组
change master to master_user='repl',master_password='Jimstars' for channel 'group_replication_recovery';
set global group_replication_allow_local_disjoint_gtids_join=ON;
start group_replication;
如果是单主模式,需要在执行start group_replication 之前执行下面语句
set global group_replication_enforce_update_everywhere_checks=OFF;
set global group_replication_single_primary_mode=ON;
查看是否加入复制组
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 4b53cb18-e2ce-11ea-9cd7-d45d64086d0a | testdb136 | 3306 | ONLINE |
| group_replication_applier | 4db2798b-e2ce-11ea-adfa-000c298e7822 | testdb62 | 3306 | ONLINE |
| group_replication_applier | 501d0288-e2ce-11ea-9575-000c292f0c3c | testdb76 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)
测试数据也已经同步
mysql> select * from textbook;
+--------+----------+--------+
| bookid | schoolid | status |
+--------+----------+--------+
| 1 | 10075 | 1 |
| 2 | 10076 | 1 |
+--------+----------+--------+
2 rows in set (0.01 sec)