跳转至

MGR数据库集群

一. 相关基础知识

1. MHA

MHA自2018年停止更新,不支持GTID主从复制

2. MGR(主节点高可用)

MySQL从5.7开始支持MGR,MySQL8.0开始MGR成为正式版本

3. MGR的优势

  • 原生强一致性(强制主库与从库内容相同)
  • 支持GTID复制
  • 无需外部工具管理
  • 自动故障转移(主从切换)

底线:最多九个节点(1拖8)

最多容忍(N-1)/2台服务器宕机

单主/多主可选

作用:主库与从库之间的关系是MGR关系时。当主库坏掉一个从库会变成主库,其他从库与新竹库自动建立主从关系。

二. 迁移至MySQL Group Replication

1. 迁移步骤

a. 备份数据

b. 配置MGR(即修改MySQL配置文件)

c. 逐步加入新集群(防止数据丢失)

2. MGR集群

MGR架构图

api层 ---> 组件层() ---> 复制层协议(IO/SQL) ---> XCom(Paxos变体) (集群间探测协议)

组件层内容:

capture: 手机事务(row主键+GTID)

apply: 本地回放(relay-log)

recovery: 新节点分布式恢复,直接拉binlog+增量

3. 单主事务周期过程

客户端提交数据 ---> 主节点执行并写入binlog(未 fsync)

原子广播: 通过XCom把binlog events发给全体成员(包括自己)

冲突检测(也就是认证): 各个节点用发来的事务对比自己本地已经认证的事务(正在执行的语句)

  • 无冲突:预通过
  • 有冲突:事务在主节点回滚(回滚的同一事务)

投票&共识:超半数“ready就绪”即刻达成共识

主节点提交:fsync binlog返回客户端即可成功。

从节点异步应用:写relay-log ---> 回放 ---> 最终一致

MGR的工作原理口诀:先广播后提交(提交所有节点);先共识,后落盘

  • 事务即数据库正在执行的语句
  • 单主模式下所有写事务集中在同一节点,多主模式下多个节点可以同时处理写事务

4. 强一致性的级别(MySQL8.0以后的新增功能)

EVENTUAL(默认):读写都不等待积压事务,可能读取或写入旧数据。

高吞吐,可接受延迟

BEFORE:读/写前等待积压/完成事务。 场景:读必须最新

场景:读必须最新

AFTER:写完成后等待多数节点应用再返回。

场景:写后立即读,防止切换脏读。 脏读(Dirty Read)指的是读到了其他事务还没有提交的临时数据。

BEFORE_AND_AFTER:合并两者。

场景:金融账务等强一致性场景。(强一致性级别越高,越需要一个消息队列)

5. 单主模式与双主模式的差异

单主模式生产最稳定。多主模式需要面对冲突问题(投票反复问等)

无论哪种模式,网络是命脉,否则数据库之间无法进行通讯

所有表必须有主键

6. UUID

loose-group_replication_group_name必须为UUID

必须设置UUID编码(cat etc/fstab文件中可以查看到UUID)

UUID编码由16进制数字构成,结构是8-4-4-4-12,一共有32位

所有MySQL主机的Server UUID必须都是唯一的

协议硬性要求为XCom

自动识别,透明对比UUID判断是否为同一个集群

MGR集群所有节点设置相同的Group UUID,类似于 loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"

对于loose-group_replication的解释:

loose(宽松选项,插件为加载时不报错)-group(组复制插件)_replication(组的名字)

三. 实验过程(三个节点创建时数据库集群)

三台电脑的准备:

a. 将电脑时间进行同步

使用脚本

#! /bin/bash
#安装时间同步服务chrony
mount /dev/sr0 /media/cdrom &>/dev/null
sleep 2
dnf -y install chrony &>/dev/null
sed -i 's/^pool/#pool/' /etc/chrony.conf

cat << EOF >>  /etc/chrony.conf
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst
EOF

systemctl restart chronyd
sleep 5

if chronyc sources -v|grep -q '^\^\*';then
    echo "chronyd同步成功"
else
    echo "chronyd同步失败"
fi

b. 安装好数据库服务端和客户端

使用脚本

#! /bin/bash
#安装mysql
install_mysql() {
    mount /dev/sr0 /media/cdrom &>/dev/null
    dnf -y install cmake make gcc gcc-c++ bison libaio libaio-devel rpcgen ncurses ncurses-devel openssl openssl-devel
    wget https://dev.mysql.com/get/Downloads/MySQL-8.4/mysql-8.4.10-linux-glibc2.28-x86_64.tar.xz

    if [ $? -eq 0 ];then
        tar -xf mysql-8.4.10-linux-glibc2.28-x86_64.tar.xz -C /usr/local
        mv /usr/local/mysql-8.4.10-linux-glibc2.28-x86_64  /usr/local/mysql

        # 确保 mysql 用户存在,不存在则创建
        id mysql >/dev/null 2>&1 || useradd -M mysql

        # 初始化目录和配置文件
        mkdir -p /data/mysql/{data,log}
        chown -R mysql.mysql /data/mysql
        chown -R mysql:mysql /usr/local/mysql/
        cat << EOF > /etc/my.cnf

[client]
socket = /usr/local/mysql/mysql.sock        
[mysqld]
server_id=10                                
port = 3306                                 
user = mysql                                
character-set-server = utf8mb4              
default_storage_engine = innodb            
log_timestamps = SYSTEM                     
socket = /usr/local/mysql/mysql.sock       
basedir = /usr/local/mysql                 
datadir = /data/mysql/data                  
pid-file = /usr/local/mysql/mysql.pid      
log_error = /data/mysql/log/mysql-error.log
sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
skip-name-resolve
log_bin = /data/mysql/log/binlog
binlog_format = ROW                          
EOF

        /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/data
        cat << EOF > /lib/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/mysql/bin/mysqld  --defaults-file=/etc/my.cnf
User=mysql
Group=mysql
TimeoutSec=300
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF
        systemctl daemon-reload
        echo 'export PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile
        source /etc/profile
        systemctl start mysqld
        systemctl enable mysqld &>/dev/null
        exit 0

    else
        echo "mysql-8.4.1下载失败"
        exit 1
    fi

}


if strings /lib64/libc.so.6 | grep -q GLIBC_2.28 && ping -c 2 -W 3 dev.mysql.com &>/dev/null; then
    echo "环境检查通过,开始安装 MySQL..."
    install_mysql
else
    echo "您当前不满足安装 mysql-8.4.10 条件"
fi

c. 因xcom通讯走的是主机名解析,即hostname,所以需要再hosts文件中将这三台的IP地址加主机名填入,然后再使用scp指令,将该hosts文件复制到三台电脑中。以此用来连接主节点。使用ping加主机名即可进行通讯。

[root@1 ~]# cat <<EOF >> /etc/hosts
192.168.100.99  server1
192.168.100.100 server20
192.168.100.101 server10
EOF

[root@1 ~]# for ip in 99 100; do
                scp /etc/hosts root@192.168.100.${ip}:/etc/hosts
            done

d. 修改数据库的配置文件,具体内容如下

Gtid、enforce_gtid、row必须使用

不可添加主节点中允许哪个数据库传输的参数以及从节点中不允许传输哪个数据库的指令

如主机1

[root@1 ~]# vi /etc/my.cnf

[client]
socket = /usr/local/mysql/mysql.sock        #客户连接使用的socket

[mysqld]
server_id=1                                #将这台 MySQL 服务器的 ID 指定为20,与master应当设置为不同的ID
port = 3306                                 #默认监听的端口为3306
user = mysql                                #mysql进程的维护用户为mysql
character-set-server = utf8mb4              #默认字符集
default_storage_engine = innodb             #默认存储引擎
log_timestamps = SYSTEM                     #日志时间戳使用系统时间
socket = /usr/local/mysql/mysql.sock        #服务端的socket文件存放的位置
basedir = /usr/local/mysql                  #mysql的安装目录
datadir = /data/mysql/data                  #mysql数据文件的存放目录
pid-file = /usr/local/mysql/mysql.pid       #mysql进程id存放位置
log_error = /data/mysql/log/mysql-error.log #mysql错误日志的存放位置
sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
#STRICT_TRANS_TABLES 严格模式核心 — 对事务表启用严格模式,插入/更新数据时若值无效(如类型错误、超出长度),直接报错而非发出警告
#NO_ZERO_IN_DATE 不允许月份或日为零的日期,例如 '2010-00-01'、'2024-01-00' 会被拦截。现已被废弃,但不会报错
# 不允许 '0000-00-00' 作为合法日期。现已被废弃,但不会报错
#ERROR_FOR_DIVISION_BY_ZERO 除零操作直接报错,而非返回 NULL 并给警告
#NO_ENGINE_SUBSTITUTION 建表时如果指定了被禁用的存储引擎(如 Memory 被禁用),直接报错,而非自动替换为默认引擎(InnoDB)
skip-name-resolve                           #跳过DNS反向解析

log_bin = /data/mysql/log/binlog            #开启二进制文件
binlog_format = ROW                         #以行格式记录二进制的内容

slow_query_log = ON                         #开启慢查询日志
slow_query_log-file = /data/mysql/log/slow.log
#记录慢查询日志的select语句
long_query_time = 1                         #查询超时时间
log_queries_not_using_indexes = ON          #查询语句没有使用后索引也会记录到慢查询日志文件中

gtid_mode=ON                                #开启GTID模式
enforce-gtid-consistency=ON                 #强制GTID一致性,开启后,违反 GTID 一致性的语句会被直接拒绝执行,确保复制不会出错。
log_slave_updates=ON                        #记录从库上执行的中继日志事务到从库自己的 binlog。
binlog_expire_logs_seconds=604800           #二进制日志binlog的自动过期时间设置为604800 秒
sync_binlog=1                               #每次事务提交都强制将 binlog 刷入磁盘。

binlog_cache_size=4M                        #在事务期间用于缓存 binlog 写入的内存缓冲区大小。
max_binlog_cache_size=2G                    #单个事务的binlog缓存上限为2G

innodb_buffer_pool_size=10G                 #innodb缓冲池大小设置为10GB
innodb_log_file_size=1G                     #单个 InnoDB redo log(重做日志) 文件的大小,设为 1GB
innodb_log_buffer_size=64M                  #InnoDB redo log 的缓冲区大小,设为 64MB。
innodb_flush_log_at_trx_commit=1            #每次事务提交时,强制将 redo log 刷入磁盘。
innodb_file_per_table=1                     #每个 InnoDB 表使用独立的表空间文件(表名.ibd),而不是全部存到共享的 ibdata1 中。

max_connections=5000                        #MySQL 允许的最大并发连接数为 5000。
max_allowed_packet=64M                      #客户端与服务器之间传输的单个数据包最大为 64MB。
thread_cache_size=64                        #MySQL 缓存待复用的线程数量为 64 个。

relay_log=/data/mysql/log/relay-log         #指定中继日志(relay log) 的存放路径和文件名前缀。
relay_log_index=/data/mysql/log/relay-log.index
#中继日志索引文件路径
relay_log_recovery=ON                       #从库崩溃重启后,自动丢弃未执行完的中继日志,重新从主库获取,保证数据一致性。
relay_log_purge=ON                          #自动清理已执行完的旧中继日志文件,避免磁盘空间被撑满。

slave_net_timeout=30                        #设置从库与主库之间网络超时 30 秒,超过这个时间没收到数据就报错重连。
slave_compressed_protocol=1                 #主从传输时启用压缩,减少网络带宽占用(CPU 换带宽)。

loose-group_replication_group_name='aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'
loose-group_replication_start_on_boot=OFF   #代表改机开机自动加为集群,此处为关闭状态
loose-group_replication_local_address="192.168.100.99:33061"
#33061为xcom通讯端口,此处选项填写自己主机的IP地址与端口
loose-group_replication_group_seeds='192.168.100.99:33061,192.168.100.100:33061,192.168.100.101:33061'
#此处填写自己的及群组中有哪些电脑,填写IP地址
loose-group_replication_bootstrap_group=OFF #该参数先使用关闭状态,在电脑第一次开机时临时改为on,该参数为每次开机时创建新的集群
loose-group_replication_single_primary_mode=ON
#选项单主机还是多主机模式,此为单主机模式
loose-group_replication_enforce_update_everywhere_checks=OFF
#多主模式的关键保护,单主模式不需要开启
loose-group_replication_ip_whitelist="192.168.100.0/24"
#此处填写允许加载自己集群的网段

e. 其他主机做相同操作修改/etc/my.cnf只需要修改配置文件第五行server_id=1和第63行loose-group_replication_group_address="192.168.100.99:33061"就可以了

f0. 重新启动mysql服务

f. 先启动主节点的数据库服务

初始化数据库,给数据库进行密码设置,使用/usr/local/mysql/bin/mysql_secure_installation指令

[root@1 ~]# /usr/local/mysql/bin/mysql_secure_installation
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: y

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0
#密码安全级别,0最低
Please set the password for root here.

New password: 
#设置密码
Re-enter new password: 
#再次输入确认密码
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
#移除匿名用户
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : n
#禁止root用户远程登录
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
#删除测试数据库
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
#重新加载权限表
Success.

All done! 

g. 主节点登录数据库

[root@1 ~]# mysql -uroot -p
mysql> SHOW BINARY LOG STATUS \G
*************************** 1. row ***************************
             File: binlog.000002
         Position: 827
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

若此时Executed_Gtid_Set:有数据,则需要输入RESET BINARY LOGS AND GTIDS;清空,再加入集群

h. 登录数据库后,锁定一下主节点的集群,暂时不要计入二进制日志中,使用set SQL_LOG_BIN=0;指令即可

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

i. 创建用户并授权。%标识该用户在所有数据库节点中均可以登录该用户。

随后刷新权限

mysql>  CREATE USER 'mgr_user'@'%' IDENTIFIED WITH caching_sha2_password by 'Abcd1234';
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT REPLICATION SLAVE,GROUP_REPLICATION_ADMIN,CONNECTION_ADMIN,BACKUP_ADMIN ON *.* TO 'mgr_user'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

* 注释:ON之前未MGR给的权限,授权主从的从可以进行对该节点数据的复制,授权集群中的节点可以进行对该节点的数据复制

j. 使用SET SQL_LOG_BIN=1;指令,打开之前锁定该log日志。

k. 数据库还原的通道,即可设置使用该用户来到该节点进行数据的还原。

mysql> CHANGE REPLICATION SOURCE TO
    -> SOURCE_USER='mgr_user',
    -> SOURCE_PASSWORD='Abcd1234'
    -> for CHANNEL 'group_replication_recovery';

l. 安装插件

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.04 sec)

mysql> SHOW PLUGINS;
+----------------------------------+----------+--------------------+----------------------+---------+
| Name                             | Status   | Type               | Library              | License |
+----------------------------------+----------+--------------------+----------------------+---------+
| binlog                           | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| sha256_password                  | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |
| caching_sha2_password            | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |
| sha2_cache_cleaner               | ACTIVE   | AUDIT              | NULL                 | GPL     |
| daemon_keyring_proxy_plugin      | ACTIVE   | DAEMON             | NULL                 | GPL     |
| CSV                              | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| MEMORY                           | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| InnoDB                           | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| INNODB_TRX                       | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP                       | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP_RESET                 | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMPMEM                    | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMPMEM_RESET              | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP_PER_INDEX             | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP_PER_INDEX_RESET       | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_BUFFER_PAGE               | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_BUFFER_PAGE_LRU           | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_BUFFER_POOL_STATS         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_TEMP_TABLE_INFO           | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_METRICS                   | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_DEFAULT_STOPWORD       | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_DELETED                | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_BEING_DELETED          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_CONFIG                 | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_INDEX_CACHE            | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_INDEX_TABLE            | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_TABLES                    | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_TABLESTATS                | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_INDEXES                   | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_TABLESPACES               | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_COLUMNS                   | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_VIRTUAL                   | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CACHED_INDEXES            | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SESSION_TEMP_TABLESPACES  | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| MyISAM                           | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| MRG_MYISAM                       | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| PERFORMANCE_SCHEMA               | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| TempTable                        | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| ARCHIVE                          | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| BLACKHOLE                        | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| FEDERATED                        | DISABLED | STORAGE ENGINE     | NULL                 | GPL     |
| ndbcluster                       | DISABLED | STORAGE ENGINE     | NULL                 | GPL     |
| ndbinfo                          | DISABLED | STORAGE ENGINE     | NULL                 | GPL     |
| ndb_transid_mysql_connection_map | DISABLED | INFORMATION SCHEMA | NULL                 | GPL     |
| ngram                            | ACTIVE   | FTPARSER           | NULL                 | GPL     |
| mysqlx_cache_cleaner             | ACTIVE   | AUDIT              | NULL                 | GPL     |
| mysqlx                           | ACTIVE   | DAEMON             | NULL                 | GPL     |
| mysql_native_password            | DISABLED | AUTHENTICATION     | NULL                 | GPL     |
| group_replication                | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL     |
+----------------------------------+----------+--------------------+----------------------+---------+
49 rows in set (0.00 sec)

m. 在23上做相同操作

n. 在主节点上创建集群并启动

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.13 sec)

mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)

#. 集群启动后,使用SET GLOBAL group_replication_bootstrap_group=OFF;指令关闭,防止再开机时候创建新集群

o. 查看集群状态可以输入mysql> SELECT * FROM performance_schema.replication_group_members;查看performance_schema库中的表

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 1ce7e9b5-78d5-11f1-a462-000c29084547 | 1           |        3306 | ONLINE       | PRIMARY     | 8.4.10         | XCom                       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
1 row in set (0.00 sec)

p. 将2和3也加入到改集群中

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (1.43 sec)

p0. 错误

2和3也执行了

mysql> SET GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.01 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (1.43 sec)

mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)
2和3是不是不应该执行SET GLOBAL group_replication_bootstrap_group=ON;

导致2和3自己创建了集群而没有加入1

解决方法

先停止STOP GROUP_REPLICATION;

再重新启动START GROUP_REPLICATION;

q. 注:若在加入集群之前创建过数据恢复通道,为了不影响该节点对集群的加入,需使用reset binary logs and gtids指令,清空master的事务后,使用RESET REPLICA ALL FOR CHANNEL 'group_replication_recovery';指令将改数据恢复通道的事务清空一遍。

r. 回到1查看

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 06072465-7531-11f1-95a0-000c294f01ee | 3           |        3306 | ONLINE       | SECONDARY   | 8.4.10         | XCom                       |
| group_replication_applier | 1ce7e9b5-78d5-11f1-a462-000c29084547 | 1           |        3306 | ONLINE       | PRIMARY     | 8.4.10         | XCom                       |
| group_replication_applier | 21c6b6f7-7686-11f1-afec-000c29105f32 | 2           |        3306 | ONLINE       | SECONDARY   | 8.4.10         | XCom                       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.00 sec)

s. 测试

再主节点中登录数据库并创建一个库,再在库中建表tables,设置表结构并插入数据

mysql> CREATE DATABASE wen_db;
Query OK, 1 row affected (0.00 sec)

mysql> USE wen_db;
Database changed

mysql> create table t1(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50));
Query OK, 0 rows affected (0.02 sec)

mysql> SHOW TABLES;
+------------------+
| Tables_in_wen_db |
+------------------+
| t1               |
+------------------+
1 row in set (0.00 sec)

mysql> INSERT INTO t1(name) VALUES('mgrOK'),('wensir');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

t. 切换到2或3查看

mysql> SELECT * FROM wen_db.t1;
+----+--------+
| id | name   |
+----+--------+
|  1 | mgrOK  |
|  2 | wensir |
+----+--------+
2 rows in set (0.00 sec)

o. TIPS

模拟主节点宕机,其中一个次节点变为主节点,当知青主节点恢复后,需要再次登录数据库使用START GROUP_REPLICATION指令,重新加入数据库。此时该节点不会抢占现有主节点。

数据库集群不会再宕机后的节点恢复后主动重新加入集群,若想恢复后主动加入则需要在数据库配置文件中将loose-group_replication_start_on_boot=OFF改为ON状态

a. 在1上执行mysql> STOP GROUP_REPLICATION;

b. 到2或3上查看

mysql>  SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 06072465-7531-11f1-95a0-000c294f01ee | 3           |        3306 | ONLINE       | PRIMARY     | 8.4.10         | XCom                       |
| group_replication_applier | 21c6b6f7-7686-11f1-afec-000c29105f32 | 2           |        3306 | ONLINE       | SECONDARY   | 8.4.10         | XCom                       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
2 rows in set (0.01 sec)

c. 回到1上重新执行启动集群并查看

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 06072465-7531-11f1-95a0-000c294f01ee | 3           |        3306 | ONLINE       | PRIMARY     | 8.4.10         | XCom                       |
| group_replication_applier | 1ce7e9b5-78d5-11f1-a462-000c29084547 | 1           |        3306 | ONLINE       | SECONDARY   | 8.4.10         | XCom                       |
| group_replication_applier | 21c6b6f7-7686-11f1-afec-000c29105f32 | 2           |        3306 | ONLINE       | SECONDARY   | 8.4.10         | XCom                       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.00 sec)

此时1不再是PRIMARY