MySQL Group Replication(MGR)集群部署實(shí)現(xiàn)自動(dòng)故障切換問(wèn)題記錄
傳統(tǒng)MySQL主從復(fù)制需要手動(dòng)切換故障節(jié)點(diǎn),無(wú)法滿足高可用場(chǎng)景下“秒級(jí)自動(dòng)恢復(fù)”的需求。MySQL Group Replication(MGR,組復(fù)制)基于Paxos協(xié)議實(shí)現(xiàn)多節(jié)點(diǎn)數(shù)據(jù)同步與自動(dòng)故障切換,無(wú)需依賴(lài)Keepalived、MHA等第三方工具,是MySQL官方推薦的高可用解決方案。
一、MGR核心認(rèn)知
1.1 MGR對(duì)比傳統(tǒng)主從的優(yōu)勢(shì)
| 特性 | 傳統(tǒng)主從復(fù)制 | MySQL Group Replication |
|---|---|---|
| 故障切換 | 手動(dòng)切換 | 自動(dòng)選舉新主節(jié)點(diǎn),秒級(jí)恢復(fù) |
| 數(shù)據(jù)一致性 | 異步/半同步,易不一致 | 強(qiáng)一致性(基于Paxos協(xié)議) |
| 集群管理 | 依賴(lài)第三方工具 | 原生支持集群管理,無(wú)需額外組件 |
| 節(jié)點(diǎn)角色 | 主從固定 | 單主/多主模式,角色自動(dòng)切換 |
| 腦裂風(fēng)險(xiǎn) | 高 | 低(奇數(shù)節(jié)點(diǎn)仲裁) |
1.2 MGR核心原理
MGR集群由至少3個(gè)節(jié)點(diǎn)組成(奇數(shù)節(jié)點(diǎn),保證投票仲裁),單主模式下:
- 集群選舉出1個(gè)主節(jié)點(diǎn)(Primary) 處理所有寫(xiě)入操作,其余為從節(jié)點(diǎn)(Secondary) 只讀;
- 主節(jié)點(diǎn)將事務(wù)同步到集群,所有節(jié)點(diǎn)通過(guò)組通信協(xié)議(XCom)達(dá)成共識(shí)后,才提交事務(wù),保證數(shù)據(jù)一致性;
- 主節(jié)點(diǎn)故障時(shí),集群自動(dòng)檢測(cè)并通過(guò)投票選舉新主節(jié)點(diǎn),從節(jié)點(diǎn)無(wú)縫接管寫(xiě)入,無(wú)需人工干預(yù)。
1.3 環(huán)境規(guī)劃(單主模式)
| 節(jié)點(diǎn)角色 | 服務(wù)器IP | MySQL版本 | 核心配置 | 端口說(shuō)明 |
|---|---|---|---|---|
| MGR節(jié)點(diǎn)1(初始主) | 192.168.1.30 | 8.0.36 | 4核8G,500G硬盤(pán) | 3306(MySQL服務(wù))、33061(MGR通信) |
| MGR節(jié)點(diǎn)2 | 192.168.1.31 | 8.0.36 | 4核8G,500G硬盤(pán) | 3306、33061 |
| MGR節(jié)點(diǎn)3 | 192.168.1.32 | 8.0.36 | 4核8G,500G硬盤(pán) | 3306、33061 |
1.4 前置準(zhǔn)備
- 所有節(jié)點(diǎn)操作系統(tǒng):CentOS 7.x(關(guān)閉SELinux、防火墻開(kāi)放3306/33061端口);
- 同步系統(tǒng)時(shí)間:
ntpdate ntp.aliyun.com; - 禁用AppArmor/SELinux:
setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config; - 開(kāi)放端口:
firewall-cmd --add-port=3306/tcp --permanent firewall-cmd --add-port=33061/tcp --permanent firewall-cmd --reload
二、第一步:所有節(jié)點(diǎn)安裝并配置MySQL 8.0
MGR對(duì)MySQL版本要求嚴(yán)格(推薦8.0.20+),以下步驟需在所有3個(gè)節(jié)點(diǎn)執(zhí)行。
2.1 安裝MySQL 8.0
# 1. 安裝MySQL YUM源
wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm
rpm -ivh mysql80-community-release-el7-7.noarch.rpm
# 2. 安裝MySQL服務(wù)器(忽略GPG檢查,避免版本兼容問(wèn)題)
yum install -y mysql-community-server --nogpgcheck
# 3. 啟動(dòng)MySQL并設(shè)置開(kāi)機(jī)自啟
systemctl start mysqld
systemctl enable mysqld
# 4. 獲取初始密碼
initial_pass=$(grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')
echo "初始密碼:$initial_pass"2.2 初始化MySQL(修改密碼、配置權(quán)限)
# 1. 登錄MySQL并修改root密碼(需符合復(fù)雜度:大小寫(xiě)+數(shù)字+特殊字符) mysql -u root -p"$initial_pass" -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'MySQL@123456'; FLUSH PRIVILEGES;" # 2. 遠(yuǎn)程訪問(wèn)授權(quán)(生產(chǎn)環(huán)境建議限制IP,此處為測(cè)試放開(kāi)) mysql -u root -p"MySQL@123456" -e "CREATE USER 'root'@'%' IDENTIFIED BY 'MySQL@123456'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;"
2.3 配置MGR核心參數(shù)(修改my.cnf)
編輯/etc/my.cnf,替換原有配置為以下內(nèi)容(注意替換server-id和group_replication_local_address為節(jié)點(diǎn)對(duì)應(yīng)值):
節(jié)點(diǎn)1(192.168.1.30)my.cnf配置
[mysqld] # 基礎(chǔ)配置 datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid lower_case_table_names=1 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci # MGR核心配置 server-id=30 # 每個(gè)節(jié)點(diǎn)唯一,建議用IP最后一段 gtid_mode=ON # 開(kāi)啟GTID,MGR必需 enforce_gtid_consistency=ON master_info_repository=TABLE relay_log_info_repository=TABLE binlog_checksum=NONE log_slave_updates=ON binlog_format=ROW transaction_write_set_extraction=XXHASH64 # MGR用于檢測(cè)沖突的哈希算法 loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" # 固定UUID,所有節(jié)點(diǎn)一致 loose-group_replication_start_on_boot=OFF # 不隨MySQL啟動(dòng)自動(dòng)啟動(dòng)MGR loose-group_replication_local_address="192.168.1.30:33061" # 當(dāng)前節(jié)點(diǎn)MGR通信地址 loose-group_replication_group_seeds="192.168.1.30:33061,192.168.1.31:33061,192.168.1.32:33061" # 所有節(jié)點(diǎn)通信地址 loose-group_replication_bootstrap_group=OFF # 僅初始化集群時(shí)設(shè)為ON loose-group_replication_single_primary_mode=ON # 單主模式(核心:自動(dòng)故障切換依賴(lài)此模式) loose-group_replication_enforce_update_everywhere_checks=OFF # 單主模式設(shè)為OFF loose-group_replication_auto_increment_increment=7 # 避免主鍵沖突
節(jié)點(diǎn)2(192.168.1.31)my.cnf配置
僅修改以下2處,其余與節(jié)點(diǎn)1一致:
server-id=31 loose-group_replication_local_address="192.168.1.31:33061"
節(jié)點(diǎn)3(192.168.1.32)my.cnf配置
僅修改以下2處:
server-id=32 loose-group_replication_local_address="192.168.1.32:33061"
2.4 重啟MySQL并驗(yàn)證配置
# 重啟MySQL systemctl restart mysqld # 驗(yàn)證GTID是否開(kāi)啟(輸出ON即正常) mysql -u root -p"MySQL@123456" -e "SHOW VARIABLES LIKE 'gtid_mode';"
三、第二步:搭建MGR集群(單主模式)
3.1 步驟1:在所有節(jié)點(diǎn)創(chuàng)建MGR專(zhuān)用用戶
MGR需要專(zhuān)用用戶用于節(jié)點(diǎn)間通信,登錄每個(gè)節(jié)點(diǎn)執(zhí)行:
mysql -u root -p"MySQL@123456" << EOF # 創(chuàng)建MGR通信用戶 CREATE USER 'mgr_repl'@'%' IDENTIFIED BY 'MGR@123456'; # 授予MGR所需權(quán)限 GRANT REPLICATION SLAVE ON *.* TO 'mgr_repl'@'%'; GRANT GROUP_REPLICATION_ADMIN ON *.* TO 'mgr_repl'@'%'; FLUSH PRIVILEGES; # 配置MGR插件使用該用戶 CHANGE MASTER TO MASTER_USER='mgr_repl', MASTER_PASSWORD='MGR@123456' FOR CHANNEL 'group_replication_recovery'; EOF
3.2 步驟2:初始化MGR集群(僅節(jié)點(diǎn)1執(zhí)行)
節(jié)點(diǎn)1作為初始主節(jié)點(diǎn),負(fù)責(zé)引導(dǎo)集群創(chuàng)建:
mysql -u root -p"MySQL@123456" << EOF # 加載MGR插件(8.0+默認(rèn)內(nèi)置,無(wú)需手動(dòng)安裝) INSTALL PLUGIN group_replication SONAME 'group_replication.so'; # 啟動(dòng)集群引導(dǎo)(僅第一次執(zhí)行) SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF; # 驗(yàn)證集群狀態(tài)(輸出ON即正常) SELECT * FROM performance_schema.replication_group_members; EOF
執(zhí)行后查看replication_group_members,節(jié)點(diǎn)1狀態(tài)應(yīng)為ONLINE,角色為PRIMARY。
3.3 步驟3:節(jié)點(diǎn)2、3加入集群
節(jié)點(diǎn)2執(zhí)行:
mysql -u root -p"MySQL@123456" << EOF # 加載MGR插件 INSTALL PLUGIN group_replication SONAME 'group_replication.so'; # 加入集群 START GROUP_REPLICATION; # 驗(yàn)證節(jié)點(diǎn)狀態(tài) SELECT * FROM performance_schema.replication_group_members; EOF
節(jié)點(diǎn)3執(zhí)行:
與節(jié)點(diǎn)2命令完全一致,執(zhí)行后驗(yàn)證節(jié)點(diǎn)狀態(tài)。
3.4 驗(yàn)證集群搭建成功
在任意節(jié)點(diǎn)執(zhí)行以下命令,查看集群成員狀態(tài):
mysql -u root -p"MySQL@123456" -e "SELECT MEMBER_HOST, MEMBER_ROLE, MEMBER_STATE FROM performance_schema.replication_group_members;"
正常輸出示例:
| MEMBER_HOST | MEMBER_ROLE | MEMBER_STATE |
|---|---|---|
| 192.168.1.30 | PRIMARY | ONLINE |
| 192.168.1.31 | SECONDARY | ONLINE |
| 192.168.1.32 | SECONDARY | ONLINE |
3個(gè)節(jié)點(diǎn)均為ONLINE,且節(jié)點(diǎn)1為PRIMARY,說(shuō)明集群搭建成功。 |
四、第三步:驗(yàn)證自動(dòng)故障切換
4.1 前置測(cè)試:主節(jié)點(diǎn)寫(xiě)入數(shù)據(jù)
在節(jié)點(diǎn)1(主節(jié)點(diǎn))插入測(cè)試數(shù)據(jù),驗(yàn)證從節(jié)點(diǎn)同步:
# 節(jié)點(diǎn)1執(zhí)行:創(chuàng)建測(cè)試庫(kù)和表
mysql -u root -p"MySQL@123456" << EOF
CREATE DATABASE IF NOT EXISTS mgr_test;
USE mgr_test;
CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50));
INSERT INTO user (name) VALUES ('MGR測(cè)試用戶1'), ('MGR測(cè)試用戶2');
EOF
# 節(jié)點(diǎn)2/3執(zhí)行:查詢(xún)數(shù)據(jù)(應(yīng)同步成功)
mysql -u root -p"MySQL@123456" -e "SELECT * FROM mgr_test.user;"4.2 模擬主節(jié)點(diǎn)故障(停止節(jié)點(diǎn)1的MySQL)
# 節(jié)點(diǎn)1執(zhí)行:停止MySQL服務(wù),模擬故障 systemctl stop mysqld
4.3 驗(yàn)證自動(dòng)選舉新主節(jié)點(diǎn)
等待5~10秒(MGR故障檢測(cè)默認(rèn)超時(shí)約5秒),在節(jié)點(diǎn)2執(zhí)行以下命令:
mysql -u root -p"MySQL@123456" -e "SELECT MEMBER_HOST, MEMBER_ROLE, MEMBER_STATE FROM performance_schema.replication_group_members;"
預(yù)期輸出(節(jié)點(diǎn)2或3被選舉為新主):
| MEMBER_HOST | MEMBER_ROLE | MEMBER_STATE |
|---|---|---|
| 192.168.1.30 | UNREACHABLE | OFFLINE |
| 192.168.1.31 | PRIMARY | ONLINE |
| 192.168.1.32 | SECONDARY | ONLINE |
4.4 驗(yàn)證新主節(jié)點(diǎn)寫(xiě)入功能
在新主節(jié)點(diǎn)(如節(jié)點(diǎn)2)插入數(shù)據(jù),驗(yàn)證寫(xiě)入正常:
# 節(jié)點(diǎn)2執(zhí)行:插入數(shù)據(jù)
mysql -u root -p"MySQL@123456" << EOF
USE mgr_test;
INSERT INTO user (name) VALUES ('故障切換后寫(xiě)入');
EOF
# 節(jié)點(diǎn)3執(zhí)行:查詢(xún)數(shù)據(jù)(應(yīng)同步新數(shù)據(jù))
mysql -u root -p"MySQL@123456" -e "SELECT * FROM mgr_test.user;"4.5 故障節(jié)點(diǎn)恢復(fù)后重新加入集群
節(jié)點(diǎn)1修復(fù)后,重啟MySQL并重新加入集群:
# 節(jié)點(diǎn)1執(zhí)行:重啟MySQL systemctl start mysqld # 重新加入集群 mysql -u root -p"MySQL@123456" << EOF START GROUP_REPLICATION; # 驗(yàn)證狀態(tài)(此時(shí)節(jié)點(diǎn)1為SECONDARY) SELECT MEMBER_HOST, MEMBER_ROLE FROM performance_schema.replication_group_members; EOF
五、MGR集群生產(chǎn)環(huán)境優(yōu)化
5.1 配置自動(dòng)重啟MGR
編輯/etc/my.cnf,添加以下配置(所有節(jié)點(diǎn)),確保MySQL重啟后MGR自動(dòng)啟動(dòng):
loose-group_replication_start_on_boot=ON
5.2 監(jiān)控集群狀態(tài)
5.2.1 核心監(jiān)控SQL
# 1. 集群成員狀態(tài) SELECT MEMBER_HOST, MEMBER_ROLE, MEMBER_STATE FROM performance_schema.replication_group_members; # 2. MGR運(yùn)行狀態(tài) SHOW STATUS LIKE 'group_replication%'; # 3. 事務(wù)沖突(生產(chǎn)環(huán)境需監(jiān)控) SELECT * FROM performance_schema.replication_group_conflicts;
5.2.2 結(jié)合Prometheus+Grafana監(jiān)控
- 安裝MySQL Exporter,配置監(jiān)控指標(biāo);
- 導(dǎo)入MGR專(zhuān)用監(jiān)控模板(Grafana ID:14050),重點(diǎn)監(jiān)控:
- 節(jié)點(diǎn)在線狀態(tài)、角色;
- 事務(wù)同步延遲;
- 集群沖突數(shù);
- MGR通信端口連通性。
5.3 數(shù)據(jù)備份策略
MGR僅保證集群內(nèi)數(shù)據(jù)一致,仍需定期備份:
- 開(kāi)啟binlog日志,設(shè)置過(guò)期時(shí)間:
binlog_expire_logs_seconds=604800(7天); - 每天在從節(jié)點(diǎn)執(zhí)行全量備份:
mysqldump -u root -p"MySQL@123456" --all-databases --single-transaction --master-data=2 > /backup/mysql_full_$(date +%Y%m%d).sql
5.4 權(quán)限最小化(生產(chǎn)環(huán)境必做)
- MGR通信用戶僅授予必要權(quán)限,取消遠(yuǎn)程全量授權(quán):
REVOKE ALL PRIVILEGES ON *.* FROM 'mgr_repl'@'%'; GRANT REPLICATION SLAVE, GROUP_REPLICATION_ADMIN ON *.* TO 'mgr_repl'@'192.168.1.%'; FLUSH PRIVILEGES;
- root用戶限制IP訪問(wèn):
CREATE USER 'root'@'192.168.1.%' IDENTIFIED BY 'MySQL@123456';。
六、常見(jiàn)問(wèn)題與解決
6.1 節(jié)點(diǎn)加入集群失?。∕EMBER_STATE=ERROR)
- 原因:節(jié)點(diǎn)server-id重復(fù)、GTID不一致、防火墻未開(kāi)放33061端口;
- 解決:
- 檢查
server-id是否唯一; - 重置GTID:
RESET MASTER;; - 驗(yàn)證33061端口連通性:
telnet 192.168.1.30 33061。
- 檢查
6.2 故障切換后新主節(jié)點(diǎn)無(wú)法寫(xiě)入
- 原因:?jiǎn)沃髂J轿撮_(kāi)啟、
super_read_only未自動(dòng)關(guān)閉; - 解決:
SET GLOBAL group_replication_single_primary_mode=ON; SET GLOBAL super_read_only=OFF;
6.3 集群腦裂(節(jié)點(diǎn)狀態(tài)不一致)
- 原因:網(wǎng)絡(luò)分區(qū)、節(jié)點(diǎn)數(shù)量為偶數(shù);
- 解決:
- 保證集群節(jié)點(diǎn)數(shù)為奇數(shù)(3/5/7);
- 配置
group_replication_member_expel_timeout=5(縮短節(jié)點(diǎn)驅(qū)逐超時(shí))。
到此這篇關(guān)于MySQL Group Replication(MGR)集群部署實(shí)現(xiàn)自動(dòng)故障切換問(wèn)題記錄的文章就介紹到這了,更多相關(guān)MySQL Group Replication自動(dòng)故障切換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
高并發(fā)狀態(tài)下Replace Into造成的死鎖問(wèn)題解決
本文主要介紹了高并發(fā)狀態(tài)下Replace Into造成的死鎖問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
MySQL數(shù)據(jù)庫(kù)基礎(chǔ)篇SQL窗口函數(shù)示例解析教程
這篇文章主要為大家介紹了MySQL數(shù)據(jù)庫(kù)基礎(chǔ)篇之窗口函數(shù)示例解析教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10
MySQL?alter命令修改表語(yǔ)法實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于MySQL?alter命令修改表語(yǔ)法實(shí)例詳解的相關(guān)資料,在MySQL中ALTER指令的作用是修改已存在的數(shù)據(jù)庫(kù)表的結(jié)構(gòu),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
MySQL數(shù)據(jù)庫(kù)中UUID主鍵性能優(yōu)化的方案詳解
最近我們?cè)谛阅軆?yōu)化中發(fā)現(xiàn)了一個(gè)隱蔽的問(wèn)題,數(shù)據(jù)庫(kù)的寫(xiě)入和查詢(xún)性能在數(shù)據(jù)量增長(zhǎng)后出現(xiàn)明顯下降,原因竟然是UUID,本文將剖析UUID在數(shù)據(jù)庫(kù)中的真實(shí)影響并提供更優(yōu)化的解決方案,希望對(duì)大家有所幫助2026-02-02
mysql執(zhí)行計(jì)劃id為空(UNION關(guān)鍵字)詳解
這篇文章主要給大家介紹了關(guān)于mysql執(zhí)行計(jì)劃id為空(UNION關(guān)鍵字)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09
編寫(xiě)腳本令Xtrabackup對(duì)MySQL數(shù)據(jù)進(jìn)行備份的教程
這篇文章主要介紹了編寫(xiě)腳本令Xtrabackup對(duì)MySQL數(shù)據(jù)進(jìn)行備份的教程,示例環(huán)境基于CentOS系統(tǒng),需要的朋友可以參考下2015-12-12
mysql數(shù)據(jù)遷移到Oracle的正確方法
這篇文章主要為大家詳細(xì)介紹了mysql數(shù)據(jù)遷移到Oracle的正確方法,文中步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02

