(1)網絡異常
MGR 對網絡要求很高,有的時候會因網絡波動,自動退出集群的情況,此時需要先在出問題的節(jié)點停止組復制,然后再重新加入到集群中。
如下,該節(jié)點被踢出集群,直接執(zhí)行Stop group_replication;報錯

需要先執(zhí)行 stop group_replication 然后再 start group_replication
Stop group_replication;
Start group_replication;

(2)節(jié)點啟動長時間處于RECOVERING

查看日志

在主節(jié)點將密碼的加密方式修改
SET SQL_LOG_BIN=0;
alter USER repl@'%' IDENTIFIED WITH mysql_native_password BY 'repl';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
GRANT BACKUP_ADMIN ON *.* TO repl@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
在重啟兩個從節(jié)點
STOP GROUP_REPLICATION;
START GROUP_REPLICATION;
2節(jié)點狀態(tài)恢復正常

3節(jié)點狀態(tài)恢復正常

(3)數(shù)據(jù)異常修復
暫時性恢復
MGR 對數(shù)據(jù)具有一定的容錯性和最終一致性,原則上并不會出現(xiàn)數(shù)據(jù)不一致的情況,并且每次執(zhí)行事務都會檢測沖突,然后如果當某個節(jié)點的數(shù)據(jù)因為異常導致不一致,切主節(jié)點的 binlog 丟失的情況,勢必會導致集群數(shù)據(jù)不一致,此時可以通過以下的方法暫時讓集群起來。
停止異常節(jié)點的組復制
Stop group_replication;
清空當前的 GTID EXECUTED
Reset master;
在異常節(jié)點將 GTID 事務號設置和主節(jié)點一致
SET @@GLOBAL.GTID_PURGED='主節(jié)點的 GTID 號';
啟動異常節(jié)點的組復制
Start group_replication; 這里需要注意,這樣的方式即使恢復了集群,因為 binlog 的缺失,實際上數(shù)據(jù)是不一致的,極有可能發(fā)生后續(xù)因為數(shù)據(jù)不一致導致集群出現(xiàn)問題,這里強烈不建議這么做。
(4)分布式恢復
前面提到了暫時性的集群恢復,這樣的恢復會有很大的問題,這里說下 MGR 正常的恢復方式,MGR 當新的成員加入節(jié)點時,通常有兩種方法,當 binlog 全,或者 binlog 在刪除前接入的節(jié)點能夠成功繼續(xù)往下同
步的。則新加入的節(jié)點會繼續(xù)同步下去,在 mysql8.0.21 版本中,可以通過設置參數(shù)
group_replication_advertise_recovery_endpoints 這個參數(shù)來進行指定的點進行同步。
如果當 binlog 不可用或者差的數(shù)據(jù)實在太多時,mysql 在 8.0.17 后退出了克隆的方式進行恢復,即在集群中的所有 mysql 節(jié)點上添加克隆插件,新加入的節(jié)點數(shù)據(jù)將會被全部刪除,然后會被自動重新同步數(shù)據(jù)。
4.1節(jié)點分布式恢復
讀節(jié)點重新加入環(huán)境
模擬讀節(jié)點重新加入,首先觀察主節(jié)點的數(shù)據(jù)以及事務的情況
此時將節(jié)點 3,然后清除所有數(shù)據(jù),清除同步信息,重新初始化 mysql,模擬成新節(jié)點
已有數(shù)據(jù)

關庫

刪數(shù)據(jù)文件

此時3節(jié)點已經被集群踢出去了

重新初始化,啟動,并登錄
初始化
mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --initialize-insecure --datadir=/data/3306/data --user=mysql &
啟動
mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
登錄
mysql -u root


這里注意,因為 2 節(jié)點的的 ip 已經添加到了所有節(jié)點的 group_replication_group_seeds 中,所以不再添加,如果是新的 ip 加入節(jié)點,必須在所有其他節(jié)點上 group_replication_group_seeds 中添加新節(jié)點的IP。
按照搭建 MGR 節(jié)點的步驟,將節(jié)點 2 添加到集群中
Reset master;
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';
START GROUP_REPLICATION;

已經重新加入到集群中,數(shù)據(jù)也同步回來


可以看到同步事務已經一致

4.2克隆恢復
Mysql8.0.17 后可以使用克隆恢復
這里我們依然采用節(jié)點 3 作為需要接收克隆的節(jié)點
首先在源節(jié)點和接收克隆的節(jié)點添加克隆插件
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
同樣因為是組復制,所以節(jié)點 3 必須裝組復制插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so';

其次在提供克隆的節(jié)點上,也就是節(jié)點 1 上賦權
CREATE USER clone_user@'%' IDENTIFIED by '123456';
GRANT BACKUP_ADMIN ON *.* TO 'clone_user'@'%'; 在接收克隆的目標節(jié)點,也就是節(jié)點 2 上賦權
CREATE USER clone_user@'%' IDENTIFIED by '123456';
GRANT CLONE_ADMIN ON *.* TO 'clone_user'@'%'; 在接收克隆的目標節(jié)點上設置源端的白名單
SET GLOBAL clone_valid_donor_list = '192.168.168.101:3360';
為了驗證克隆是否會清除接收端上的數(shù)據(jù),這里我們多建幾個 schema在節(jié)點3執(zhí)行
CLONE INSTANCE FROM clone_user@'192.168.168.101':3360 IDENTIFIED BY '123456';
完成之后,把節(jié)點3重新加入到集群
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';
start GROUP_REPLICATION;完成恢復




