一、MySQL 組復制(MGR)核心概念
MySQL Group Replication(簡稱 MGR)是 MySQL 官方推出的 高可用(HA)+ 強一致性 解決方案,基于改進的 Paxos 協議實現,核心能力可概括為 3 點:
- 數據強一致:事務需經集群中「多數節點(N/2+1)」確認后才提交,避免數據延遲或混亂;
- 自動故障轉移:主節點故障時,剩余節點自動選舉新主,無需人工干預; 靈活架構:支持「單主模式」(1
個可寫節點,多只讀節點)和「多主模式」(所有節點均可寫),適配不同業務場景(讀多寫少 / 分布式寫)。 - MGR 對表有一個硬性要求:所有表必須有主鍵或唯一索引(用于跟蹤數據變化,確保同步不沖突),這也是前期操作中避免報錯的關鍵。
二、搭建前置準備與環境說明
- MySQL源碼環境:
https://blog.csdn.net/racwwt/article/details/151259281
1. 環境信息
本次搭建使用 3 臺節點組成集群,具體信息如下:
主機名 | ip | 操作系統版本 | mysql版本 |
---|---|---|---|
master | 192.168.2.102/24 | rhel7.9 | mysql8.0.40 |
node1 | 192.168.2.104/24 | rhel7.9 | mysql8.0.40 |
node2 | 192.168.2.105/24 | rhel7.9 | mysql8.0.40 |
https://dev.mysql.com/doc/refman/8.0/en/group-replication-configuring-instances.html
2.前置配置
MGR 集群依賴節點間的通信與身份識別,需先完成以下準備:
配置域名自解析(所有節點執行):
目的是讓節點通過主機名(如 master、node1)相互訪問,避免直接寫 IP 導致配置繁瑣。
編輯 /etc/hosts 文件,添加以下內容
#三個主機均需要配置hosts文件的解析,如果不配置域名解析則需要在/etc/my.cnf中加一條配置skip-name-resolve
[root@node1 ~]# cat /etc/hosts
192.168.2.102 master
192.168.2.104 node1
192.168.2.105 node2
三、MGR 單主模式搭建
單主模式是 MGR 默認架構,僅 master 節點可執行寫操作(如插入 / 更新數據),node1、node2 為只讀節點,適合「讀多寫少」場景(如電商商品詳情頁)。
1. Master 節點配置(修改 my.cnf)
#1)修改配置文件
[root@master ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log_timestamps=SYSTEM #設置日志時間和本地時間保持一致
server_id=102
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" #組復制,數據必須存儲在 InnoDB 事務存儲引擎中
gtid_mode=ON #組復制要開啟gtid
enforce_gtid_consistency=ON
log_bin=binlog #默認開啟
log_slave_updates=ON #默認開啟
binlog_format=ROW #默認開啟
transaction_write_set_extraction=XXHASH64 #默認開啟,組復制使用此信息在所有組成員上進行沖突檢測
plugin_load_add='group_replication.so' #將組復制插件添加到服務器啟動時加載的插件列表中
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" #告訴插件它正在加入或創建的組名為“aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa”
group_replication_start_on_boot=off #插件在服務器啟動時不自動啟動操作,使用手動啟動插件
group_replication_local_address= "192.168.2.102:33061" #與其它主機通信時使用的網絡地址和端口
group_replication_group_seeds= "master:33061,node1:33061,node2:33061" #設置組成員的主機名和端口
group_replication_bootstrap_group=off #指示插件是否啟動該組,在首次引導組時在一個服務器上啟用
group_replication_ip_whitelist="192.168.2.0/24,127.0.0.1/8" #僅允許白名單內的 IP 加入復制組
group_replication_recovery_use_ssl=on #caching_sha2_password插件要求安全傳輸密碼,開啟主從之間的連接使用SSL/TLS
[root@master ~]# /etc/init.d/mysqld restart
2. Master 節點創建復制賬號與授權
MGR 節點間同步數據需專用賬號,登錄 MySQL 后創建 rp 用戶并授予權限(所有節點后續均需創建相同賬號)
執行以下 SQL 語句(SET SQL_LOG_BIN=0 表示當前操作不記錄 binlog,避免同步給從節點)
#2)在主的數據庫中使用sql語句添加復制賬號并授予權限,從上面也需要設置一樣的賬號
-- 1. 臨時關閉binlog(避免賬號創建操作被同步)
SET SQL_LOG_BIN = 0;-- 2. 創建復制賬號 rp(密碼123,可自定義,所有節點需一致)
CREATE USER rp@'%' IDENTIFIED BY '123';-- 3. 授予MGR所需權限(復制、連接管理、備份、流復制權限)
GRANT REPLICATION SLAVE ON *.* TO rp@'%';
GRANT CONNECTION_ADMIN ON *.* TO rp@'%';
GRANT BACKUP_ADMIN ON *.* TO rp@'%';
GRANT GROUP_REPLICATION_STREAM ON *.* TO rp@'%';-- 4. 刷新權限
FLUSH PRIVILEGES;-- 5. 恢復binlog記錄
SET SQL_LOG_BIN = 1;-- 6. 配置MGR恢復通道(指定用rp賬號同步數據)
CHANGE REPLICATION SOURCE TO
SOURCE_USER = 'rp',
SOURCE_PASSWORD = '123' FOR CHANNEL 'group_replication_recovery';#注意:如果需要重置則使用命令reset master;
3. 驗證 MGR 插件加載
確認 MGR 插件已成功加載(避免后續啟動失敗)
#3)查看是否有group_replication插件
mysql> show plugins;
| group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | GPL |
4. 啟動 MGR 集群(引導 Master)
首次啟動集群需通過 Master 節點「引導」(開啟 group_replication_bootstrap_group)
#4)啟動MGR集群
#使用當前服務器作為引導服務器啟動一個新的群組復制過程或者恢復一個已經存在的群組
-- 1. 開啟集群引導(僅Master首次啟動時執行)
mysql> SET GLOBAL group_replication_bootstrap_group = ON;-- 2. 啟動MGR(指定用rp賬號通信)
mysql> START GROUP_REPLICATION USER = 'rp', PASSWORD = '123';-- 3. 關閉集群引導(避免重復引導導致沖突)
mysql> SET GLOBAL group_replication_bootstrap_group = OFF;
#在主上查看組信息
mysql> SELECT * FROM performance_schema.replication_group_members;
5. 從節點(node1、node2)配置
#1)在從上寫配置文件
[root@node1 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log_timestamps=SYSTEM
server_id=104
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid_mode=ON
enforce_gtid_consistency=ON
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address="192.168.2.104:33061"
group_replication_group_seeds="master:33061,node1:33061,node2:33061"
group_replication_ip_whitelist="192.168.2.0/24,127.0.0.1/8"
group_replication_bootstrap_group=off
group_replication_recovery_use_ssl=on
[root@node1 ~]# /etc/init.d/mysqld restart[root@node2 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log_timestamps=SYSTEM
server_id=105
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid_mode=ON
enforce_gtid_consistency=ON
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address="192.168.2.105:33061"
group_replication_group_seeds="master:33061,node1:33061,node2:33061"
group_replication_ip_whitelist="192.168.2.0/24,127.0.0.1/8"
group_replication_bootstrap_group=off
group_replication_recovery_use_ssl=on
[root@node2 ~]# /etc/init.d/mysqld restart
6. 從節點創建復制賬號與授權
與 Master 步驟 2 完全一致,在 node1 和 node2 上分別登錄 MySQL,執行相同的賬號創建與授權 SQL
#2)在所有從的數據庫中使用sql語句添加復制賬號并授予權限,從上面也需要設置一樣的賬號
SET SQL_LOG_BIN=0;
CREATE USER rp@'%' IDENTIFIED BY '123';
GRANT REPLICATION SLAVE ON *.* TO rp@'%';
GRANT CONNECTION_ADMIN ON *.* TO rp@'%';
GRANT BACKUP_ADMIN ON *.* TO rp@'%';
GRANT GROUP_REPLICATION_STREAM ON *.* TO rp@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE REPLICATION SOURCE TO SOURCE_USER='rp', SOURCE_PASSWORD='123' FOR CHANNEL 'group_replication_recovery';
7. 從節點加入 MGR 集群且驗證整個集群狀態
從節點無需引導集群,直接啟動 MGR 即可自動加入(node1 和 node2 分別執行):
#3)開啟組復制
mysql> START GROUP_REPLICATION USER='rp', PASSWORD='123';
#查看組信息
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+--------------
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUN
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+--------------
| group_replication_applier | 85aa2339-87e8-11f0-b63e-000c29d446f0 | master | 3306 | ONLINE | PRIMARY | 8.0.40 | XCom
| group_replication_applier | 85aa2339-87e8-11f0-b63e-000c29d446f1 | node2 | 3306 | ONLINE | SECONDARY | 8.0.40 | XCom
| group_replication_applier | 85aa2339-87e8-11f0-b63e-000c29d446f2 | node1 | 3306 | ONLINE | SECONDARY | 8.0.40 | XCom
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+--------------
3 rows in set (0.00 sec)
8. 單主模式功能驗證
#master執行,從節點不支持寫入操作
mysql> create database test2;
mysql> use test2;
mysql> create table t3(id int primary key);
mysql> insert into t3 values(9527);
#從上查看
mysql> select * from test2.t3;
+------+
| id |
+------+
| 9527 |
+------+
9. 測試主節點宕機
MGR 核心優勢是「自動故障轉移」,測試 Master 故障后集群是否正常:
#測試主節點宕機
mysql> stop GROUP_REPLICATION;
#從庫節點查看,發現僅剩2個節點,并且自動選舉出主節點
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 | 85aa2339-87e8-11f0-b63e-000c29d446f1 | node2 | 3306 | ONLINE | PRIMARY | 8.0.40 | XCom |
| group_replication_applier | 85aa2339-87e8-11f0-b63e-000c29d446f2 | node1 | 3306 | ONLINE | SECONDARY | 8.0.40 | XCom |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
2 rows in set (0.00 sec)#重新啟動前面的master主節點,可以看到master已經作為從節點加入到群組中
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected, 1 warning (10.73 sec)
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 | 85aa2339-87e8-11f0-b63e-000c29d446f0 | master | 3306 | ONLINE | SECONDARY | 8.0.40 | XCom |
| group_replication_applier | 85aa2339-87e8-11f0-b63e-000c29d446f1 | node2 | 3306 | ONLINE | PRIMARY | 8.0.40 | XCom |
| group_replication_applier | 85aa2339-87e8-11f0-b63e-000c29d446f2 | node1 | 3306 | ONLINE | SECONDARY | 8.0.40 | XCom |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.00 sec)
四、MGR 多主模式搭建(基于單主改造)
多主模式允許 所有節點均可寫(如 master、node1、node2 都能插入數據),適合「分布式寫」場景(如多區域業務)。搭建需在單主模式基礎上修改配置,關閉單主限制。
1. 所有節點修改 my.cnf 配置
在 master、node1、node2 的 /etc/my.cnf 中添加以下 2 個參數(關閉單主,開啟多主一致性檢查)
#修改所有的my.cnf的配置文件,添加如下內容
#關閉單master模式
loose-group_replication_single_primary_mode=off
#多主一致性檢查
loose-group_replication_enforce_update_everywhere_checks=ON
[root@master mysql]# /etc/init.d/mysqld restart
2. 啟動多主模式集群
#在其中一臺主機里面執行以下mysql命令
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
#在另外兩臺主機里面執行以下mysql命令,開啟組復制
mysql> START GROUP_REPLICATION;
#所有節點的 MEMBER_ROLE 均為 PRIMARY(表示均可寫)
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 | 85aa2339-87e8-11f0-b63e-000c29d446f0 | master | 3306 | ONLINE | PRIMARY | 8.0.40 | XCom |
| group_replication_applier | 85aa2339-87e8-11f0-b63e-000c29d446f1 | node2 | 3306 | ONLINE | PRIMARY | 8.0.40 | XCom |
| group_replication_applier | 85aa2339-87e8-11f0-b63e-000c29d446f2 | node1 | 3306 | ONLINE | PRIMARY | 8.0.40 | XCom |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.01 sec)
#在三個主機上面分別執行以下三條命令測試是否都可以執行寫入操作
mysql> insert into test2.t3 values(612);
mysql> insert into test2.t3 values(613);
mysql> insert into test2.t3 values(614);
mysql> select * from test2.t3;
+------+
| id |
+------+
| 612 |
| 613 |
| 614 |
| 9527 |
+------+
五、總結
- 核心流程:環境準備(hosts/MySQL 基礎)→ 配置文件修改(啟用 MGR 插件、參數)→ 復制賬號創建→ 集群啟動→ 功能驗證;
- 單主 vs 多主:單主適合讀多寫少,多主適合分布式寫;兩者切換僅需修改 2 個配置參數,靈活度高;
- MGR 優勢:自動故障轉移(無需外部工具如 MHA)、數據強一致(避免腦裂)、動態擴縮容(節點加入 / 退出不中斷服務)。