
文章目錄前言一、MGR 集群基礎(chǔ)介紹及核心概念解析1.1 復制組1.2 多數(shù)派投票機制Paxos1.3 單主模式【生產(chǎn)推薦】1.4 多主模式【僅測試使用】1.5 XCom通信組件1.6 寫沖突檢測1.7 一致性級別二、MGR 集群的核心作用三、MGR 集群的應用場景四、MGR 集群整體技術(shù)特性4.1 優(yōu)勢4.2 劣勢五、MGR 集群部署方案六、MGR 集群部署流程6.1 系統(tǒng)基礎(chǔ)配置6.2 安裝MySQL8.06.3 配置my.cnf6.4 創(chuàng)建復制賬戶所有節(jié)點執(zhí)行5.5 安裝組復制插件6.6 引導第一個節(jié)點主節(jié)點6.7 驗證數(shù)據(jù)同步6.8 故障切換測試與恢復6.8.1 模擬主節(jié)點宕機6.8.2 恢復原主節(jié)點七、MGR 架構(gòu)管理7.1 自動啟動組復制7.2 優(yōu)先級選舉7.3 故障檢測與恢復7.4 連接路由7.5 備份策略7.6安全加固總結(jié)前言隨著企業(yè)業(yè)務系統(tǒng)對數(shù)據(jù)庫可用性和數(shù)據(jù)一致性要求的不斷提高傳統(tǒng)的主從復制架構(gòu)在面對主庫故障時存在切換時間長、可能丟失數(shù)據(jù)、需要人工介入等痛點難以滿足關(guān)鍵業(yè)務對高可用的嚴苛要求。 MGR作為 MySQL 官方原生提供的高可用解決方案基于分布式 Paxos 協(xié)議實現(xiàn)了數(shù)據(jù)強一致性和自動故障切換當主庫發(fā)生故障時集群可在秒級內(nèi)自動完成新主選舉無需人工干預從根本上提升了數(shù)據(jù)庫服務的連續(xù)性。本文檔旨在提供一套完整的 MySQL 8.0 MGR 單主高可用集群部署方案。通過本方案的實施可構(gòu)建一個具備自動故障恢復的高可用數(shù)據(jù)庫集群為企業(yè)核心業(yè)務提供穩(wěn)定、可靠的數(shù)據(jù)庫服務支撐。一、MGR 集群基礎(chǔ)介紹及核心概念解析MGRMySQL Group ReplicationMySQL 組復制MySQL 官方原生高可用集群方案是基于 Paxos 一致性協(xié)議實現(xiàn)多節(jié)點數(shù)據(jù)一致性、故障自動檢測與主節(jié)點自動切換解決了傳統(tǒng)主從復制單點故障、數(shù)據(jù)不一致問題。主要分為單主模式、多主模式生產(chǎn)環(huán)境優(yōu)先使用單主模式。1.1 復制組多個MySQL實例組成一個復制組組內(nèi)節(jié)點互相通信協(xié)同共同維護數(shù)據(jù)一致性。最大支持9個節(jié)點生產(chǎn)環(huán)境常用3節(jié)點部署。1.2 多數(shù)派投票機制Paxos所有寫事務需要組內(nèi)半數(shù)以上節(jié)點確認通過事務才正式生效。示例3節(jié)點集群至少2個節(jié)點確認寫操作才算成功避免數(shù)據(jù)錯亂。1.3 單主模式【生產(chǎn)推薦】集群中僅有1臺主節(jié)點承擔讀寫業(yè)務其余節(jié)點為只讀。主節(jié)點故障集群自動投票選舉出新主無需人工干預切換。1.4 多主模式【僅測試使用】集群所有節(jié)點都支持讀寫。容易產(chǎn)生寫沖突業(yè)務限制多不建議生產(chǎn)環(huán)境使用。1.5 XCom通信組件MGR節(jié)點之間的內(nèi)部通信模塊負責消息廣播、節(jié)點存活檢測、投票協(xié)商。默認通信端口33061和MySQL服務端口3306區(qū)分開。1.6 寫沖突檢測當多個節(jié)點同時修改同一行數(shù)據(jù)MGR會檢測到?jīng)_突回滾沖突事務保障全集群數(shù)據(jù)統(tǒng)一。1.7 一致性級別最終一致性能高從節(jié)點允許短暫的數(shù)據(jù)延遲。故障切換安全默認主節(jié)點故障切換時保障數(shù)據(jù)安全兼顧性能生產(chǎn)默認使用。強一致所有節(jié)點數(shù)據(jù)完全實時同步會帶來較大性能損耗對比傳統(tǒng)主從傳統(tǒng)主從故障需要人工切換存在數(shù)據(jù)不一致風險MGR 實現(xiàn)自動故障轉(zhuǎn)移集群內(nèi)部保證數(shù)據(jù)一致性。二、MGR 集群的核心作用自動故障切換實時監(jiān)控節(jié)點狀態(tài)主節(jié)點宕機后自動選主、自動切換業(yè)務中斷時間大幅縮短。分布式數(shù)據(jù)強一致依靠投票 沖突檢測機制避免傳統(tǒng)異步 / 半同步主從的數(shù)據(jù)延遲、丟失問題。讀寫分離支撐讀請求分發(fā)至所有從節(jié)點分擔主庫查詢壓力提升數(shù)據(jù)庫整體吞吐量。集群自動擴容新增 MySQL 節(jié)點可自動同步全量數(shù)據(jù)快速加入復制組橫向擴展讀能力。三、MGR 集群的應用場景高可用核心業(yè)務電商訂單、支付賬務、企業(yè)后臺管理系統(tǒng)不允許數(shù)據(jù)庫長時間停機。數(shù)據(jù)一致性敏感業(yè)務財務、會員積分、庫存系統(tǒng)要求多副本數(shù)據(jù)完全統(tǒng)一杜絕臟數(shù)據(jù)。中小型業(yè)務系統(tǒng)不想引入第三方高可用中間件直接使用 MySQL 原生能力搭建集群。需頻繁維護數(shù)據(jù)庫場景定期版本更新、服務器硬件檢修需要在線切換主庫不中斷業(yè)務。四、MGR 集群整體技術(shù)特性4.1 優(yōu)勢MySQL 官方內(nèi)置功能無需額外第三方插件兼容性穩(wěn)定故障自動轉(zhuǎn)移無需人工介入切換主庫降低運維失誤自帶沖突校驗天然保障集群多副本數(shù)據(jù)統(tǒng)一單主模式貼近傳統(tǒng)主從使用習慣業(yè)務改造成本低。4.2 劣勢寫入操作存在投票開銷寫入性能相比單機 MySQL 有損耗集群節(jié)點上限 9 臺無法支撐大規(guī)模節(jié)點擴容節(jié)點之間對網(wǎng)絡質(zhì)量要求高網(wǎng)絡抖動易引發(fā)集群異常。五、MGR 集群部署方案部署架構(gòu)與環(huán)境準備本次部署采用 MySQL 8.0 MGR 單主高可用架構(gòu)共規(guī)劃三個節(jié)點Node110.8.0.10、Node210.8.0.30、Node310.8.0.50。三臺服務器均安裝 MySQL 8.0統(tǒng)一配置 hosts 解析、關(guān)閉防火墻與 SELinux并確保時間同步。MGR 集群通過 Paxos 協(xié)議保證數(shù)據(jù)一致性自動處理節(jié)點故障與主庫切換。在單主模式下只有 Primary 節(jié)點處理寫請求Secondary 節(jié)點提供讀服務配合 MySQL Router 實現(xiàn)讀寫分離與故障透明切換。部署步驟第一步基礎(chǔ)環(huán)境與 MySQL 安裝三臺均執(zhí)行設(shè)置主機名與 hosts 解析關(guān)閉防火墻和 SELinux配置 chronyd 時間同步。安裝 MySQL 8.0啟動服務并修改 root 密碼。第二步配置文件修改三臺均執(zhí)行在 /etc/my.cnf 中開啟 GTID、設(shè)置 Binlog 格式為 ROW添加 MGR 相關(guān)參數(shù)包括 group_replication_group_name三臺必須一致、group_replication_local_address各節(jié)點不同和 group_replication_group_seeds填寫全部三個節(jié)點的 IP:33061。測試環(huán)境關(guān)閉 SSL。第三步創(chuàng)建復制賬號并配置恢復通道三臺均執(zhí)行創(chuàng)建 repl10.8.0.% 用戶授予 REPLICATION SLAVE、CONNECTION_ADMIN、BACKUP_ADMIN、GROUP_REPLICATION_STREAM 權(quán)限并強制使用 mysql_native_password 插件。關(guān)鍵操作在所有節(jié)點執(zhí)行 CHANGE MASTER TO 時必須顯式指定 MASTER_HOST‘10.8.0.10’否則從庫恢復通道會指向自身導致數(shù)據(jù)無法同步。第四步啟動集群首先在 Node110.8.0.10上開啟引導模式并啟動 MGR隨后依次在 Node2 和 Node3 上直接執(zhí)行 START GROUP_REPLICATION 加入集群。通過查詢 performance_schema.replication_group_members 確認三個節(jié)點狀態(tài)均為 ONLINE并在主庫創(chuàng)建測試表驗證數(shù)據(jù)同步。生產(chǎn)環(huán)境建議后續(xù)開啟 group_replication_start_on_bootON 實現(xiàn)自動啟動并部署 MySQL Router 實現(xiàn)讀寫分離與故障自動切換。六、MGR 集群部署流程6.1 系統(tǒng)基礎(chǔ)配置主機名IP地址角色mysql110.8.0.10primarymysql210.8.0.30secondarymysql310.8.0.50secondary# 根據(jù)各節(jié)點設(shè)置主機名hostnamectl set-hostname mysql1# 在10上執(zhí)行hostnamectl set-hostname mysql2# 在30上執(zhí)行hostnamectl set-hostname mysql3# 在50上執(zhí)行# 所有節(jié)點統(tǒng)一編輯 /etc/hosts添加cat/etc/hostsEOF 10.8.0.10 mysql1 10.8.0.30 mysql2 10.8.0.50 mysql3 EOF# 關(guān)閉防火墻和增強功能systemctl stop firewalld setenforce0#時間同步systemctl start chronydsystemctlenablechronyd chronyc sources-v# 確認同步正常若MS列是以^,*,開頭則時間同步6.2 安裝MySQL8.0# 卸載系統(tǒng)自帶數(shù)據(jù)庫rpm-qa|grepmariadb yum remove mariadb*-y# 添加 MySQL 官方 Yum 倉庫cd/optwgethttps://repo.mysql.com/mysql80-community-release-el7-11.noarch.rpm# 安裝MySQL Serveryuminstall-ymysql-community-server systemctl start mysqld systemctlenablemysqld# 獲得mysql版本mysql--version# 獲取臨時密碼并修改密碼修改的密碼需要數(shù)字大小寫字母特殊符號greptemporary password/var/log/mysqld.log mysql-uroot-p臨時密碼ALTERUSERrootlocalhostIDENTIFIED BYYourNewPass2026;6.3 配置my.cnf# 在主服務器配置[mysqld]# 基礎(chǔ)設(shè)置server_id不同的機器配置不一樣server-id1port3306usermysqldatadir/var/lib/mysqlsocket/var/lib/mysql/mysql.sock log-error/var/log/mysqld.log pid-file/var/run/mysqld/mysqld.pidvalidate_password.policyLOWvalidate_password.length6# 字符集character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci# 關(guān)閉全局sslssl0skip-sslrequire_secure_transportOFF# GTID 與二進制日志MGR 必需gtid_modeONenforce_gtid_consistencyONbinlog_formatROWlog_binbinloglog_slave_updatesONmaster_info_repositoryTABLErelay_log_info_repositoryTABLEtransaction_write_set_extractionXXHASH64binlog_transaction_dependency_trackingWRITESETbinlog_checksumNONE# 組復制基本參數(shù)#其中三臺機器的group_replication_group_name參數(shù)必須一致可以通過在任意一臺機器執(zhí)行uuidgen命令獲取該參數(shù)# group_replication_local_address參數(shù)每臺機器不一致需要根據(jù)該機器的IP設(shè)置plugin_load_addgroup_replication.sogroup_replication_group_name525c43ec-2de1-413e-a64d-53767b693f2egroup_replication_start_on_bootOFFgroup_replication_local_address10.8.0.10:33061group_replication_group_seeds10.8.0.10:33061,10.8.0.30:33061,10.8.0.50:33061group_replication_bootstrap_groupOFFgroup_replication_single_primary_modeONgroup_replication_enforce_update_everywhere_checksOFF# MGR 通信禁用 SSL因全局已關(guān)閉 SSL必須顯式設(shè)置group_replication_ssl_modeDISABLEDgroup_replication_recovery_use_sslOFF# 網(wǎng)絡與成員管理每臺機器的report_host不一樣report_host10.8.0.10# 驗證ssl禁用mysql-uroot-p-eSHOW VARIABLES LIKE %ssl%;|grephave_ssl6.4 創(chuàng)建復制賬戶所有節(jié)點執(zhí)行# 臨時關(guān)閉當前會話的二進制日志記錄SETSQL_LOG_BIN0;# 創(chuàng)建 MGR 專用的復制賬號只允許來自 10.8.0.x 網(wǎng)段的連接CREATEUSERrepl10.8.0.%IDENTIFIED BYRepl2026;# 授予復制權(quán)限節(jié)點間同步數(shù)據(jù)需要GRANT REPLICATION SLAVE ON *.* TOrepl10.8.0.%;# 授予連接管理權(quán)限MGR 控制節(jié)點連接狀態(tài)需要GRANT CONNECTION_ADMIN ON *.* TOrepl10.8.0.%;# 授予備份管理權(quán)限分布式恢復donor 傳輸數(shù)據(jù)需要GRANT BACKUP_ADMIN ON *.* TOrepl10.8.0.%;# MGR 專用權(quán)限MySQL 8.0允許該用戶參與組復制的事務流GRANT GROUP_REPLICATION_STREAM ON *.* TOrepl10.8.0.%;# 刷新權(quán)限表使授權(quán)立即生效FLUSH PRIVILEGES;# 恢復二進制日志記錄后續(xù)操作恢復正常SETSQL_LOG_BIN1;# 配置恢復通道憑據(jù)就是告訴 MGR 用這個賬號去連接其他節(jié)點做數(shù)據(jù)恢復CHANGE MASTER TOMASTER_USERrepl,MASTER_PASSWORDRepl2026FOR CHANNELgroup_replication_recovery;# 修改 repl 用戶的密碼加密方式從 MySQL 8.0 默認的強加密算法caching_sha2_password改成 MGR 能識別的舊版加密算法mysql_native_password。ALTERUSERrepl10.8.0.%IDENTIFIED WITH mysql_native_password BYRepl2026;5.5 安裝組復制插件# 由于 my.cnf 中已配置 plugin_load_addgroup_replication.so通常已自動安裝。若提示 Function group_replication already exists 則忽略。INSTALL PLUGIN group_replication SONAMEgroup_replication.so;6.6 引導第一個節(jié)點主節(jié)點# 在主服務器上進行# 開啟引導模式SET GLOBALgroup_replication_bootstrap_groupON;# 啟動 MGRSTART GROUP_REPLICATION;# 關(guān)閉引導模式SET GLOBALgroup_replication_bootstrap_groupOFF;# 檢查集群成員SELECT * FROM performance_schema.replication_group_members;# 如果已啟動但失敗確保停止STOP GROUP_REPLICATION;# 清空所有二進制日志和 GTID 執(zhí)行記錄RESET MASTER;# 再次加入集群START GROUP_REPLICATION;#先清空所有二進制日志和GTID 執(zhí)行記錄因為之前做過了修改操作6.7 驗證數(shù)據(jù)同步# 在 PRIMARY 節(jié)點當前為 mysql1上執(zhí)行CREATE DATABASE arr;USE arr;CREATE TABLE uu(id INT PRIMARY KEY, msg VARCHAR(100));INSERT INTO uu VALUES(1,Hello MGR);# 登錄任意 SECONDARY 節(jié)點查詢SELECT * FROM arr.uu;6.8 故障切換測試與恢復6.8.1 模擬主節(jié)點宕機# 在 mysql1 上停止組復制或關(guān)閉 MySQLSTOP GROUP_REPLICATION;# 在其它節(jié)點如 mysql2查看SELECT * FROM performance_schema.replication_group_members;6.8.2 恢復原主節(jié)點# 手動啟動組復制START GROUP_REPLICATION;七、MGR 架構(gòu)管理7.1 自動啟動組復制驗證穩(wěn)定后將 group_replication_start_on_bootON 寫入配置文件并重啟MySQL。7.2 優(yōu)先級選舉若希望特定節(jié)點更可能成為主庫設(shè)置權(quán)重需要所有節(jié)點一致或按需設(shè)置group_replication_member_weight80# 值越大越優(yōu)先默認 507.3 故障檢測與恢復調(diào)整 group_replication_member_expel_timeout默認5秒8.0.21在網(wǎng)絡不穩(wěn)定時可適當增大避免誤驅(qū)逐。7.4 連接路由搭配 MySQL Router 或 ProxySQL 實現(xiàn)讀寫分離和自動故障轉(zhuǎn)移應用無需感知后端主從切換。7.5 備份策略在 SECONDARY 節(jié)點上使用 mysqldump 或 MySQL Enterprise Backup 進行備份減輕主庫壓力。7.6安全加固生產(chǎn)環(huán)境建議為 repl 用戶限制來源 IP 段已做并定期更換強密碼。若后續(xù)需要開啟 SSL需重新配置證書并調(diào)整 group_replication_ssl_mode 為 REQUIRED 或 VERIFY_CA??偨Y(jié)本次方案基于 MySQL 8.0 MGR 技術(shù)成功構(gòu)建了一套三節(jié)點單主高可用數(shù)據(jù)庫集群實現(xiàn)了數(shù)據(jù)強一致性保障和故障自動恢復能力。在生產(chǎn)環(huán)境部署中建議開啟 group_replication_start_on_bootON 實現(xiàn)節(jié)點自動加入并定期在 Secondary 節(jié)點執(zhí)行數(shù)據(jù)備份以減輕主庫壓力。特別提醒恢復通道配置時必須顯示指定 MASTER_HOST避免從庫指向自身導致同步中斷。MGR 是 MySQL 官方原生高可用方案部署輕量、運維可控是替代復雜自研架構(gòu)的理想選擇能夠為企業(yè)核心業(yè)務提供穩(wěn)定、可靠、易擴展的數(shù)據(jù)庫服務支撐。