MySQL 8.x配置MGR高可用+ProxySQL讀寫分離(一):MGR構建MySQL高可用

#作者:stackofumbrella

文章目錄

  • 簡介
  • MGR優點
  • MGR缺點
  • MGR適用場景
  • 單主模式和多主模式
    • 組復制介紹
    • 組復制插件架構圖
    • 單主模式
    • 多主模式
    • 配置主機名解析
    • 安裝MGR插件
  • MGR故障轉移
  • 恢復MGR集群

簡介

MGR(MySQL Group Replication)是MySQL 5.7.17版本誕生的,是MySQL自帶的一個插件,可以靈活部署。

保證數據一致性又可以自動切換,具備故障檢測功能、支持多節點寫入。
集群是多個MySQL Server節點共同組成的分布式集群,每個Server都有完整的副本,它是基于ROW格式的二進制日志文件和GTID特性。

MGR優點

強一致性:基于原生復制及paxos協議的組復制技術,并以插件的方式提供,提供一致的數據安全保證。

高容錯性:只要不是大多數節點壞掉就可以繼續工作,有自動檢測機制,當不同節點產生資源爭用沖突時,不會出現錯誤,按照先到者優先原則進行處理,并且內置了自動化腦裂防護機制。

高擴展性:節點的新增和移除都是自動的,新節點加入后,會自動從其他節點上同步狀態,直到新節點和其他節點保持一致,如果某節點被移除了,其他節點自動更新組信息,自動維護新的組信息。

靈活性:有單主模式和多主模式。單主模式下會自動選主,所有更新操作都在主上進行;多主模式下,所有server都可以同時處理更新操作。優先使用單主模式。

MGR缺點

  • 僅支持InnoDB表,并且每張表一定要有一個主鍵,用于做write set的沖突檢測。
    必須打開GTID特性,二進制日志格式必須設置為ROW,用于選主與write set;主從狀態信息存于表中(-master-info-repository=TABLE 、-relay-log-inforepository=TABLE),-log-slave-updates打開。

  • MGR不支持大事務,事務大小最好不超過143MB,當事務過大,無法在5秒的時間內通過網絡在組成員之間復制消息,則可能會懷疑成員失敗了,然后將其驅逐出局。
    目前一個MGR集群最多支持9個節點。

  • 不支持外鍵于save point特性,無法做全局間的約束檢測與部分事務回滾。
    二進制日志不支持Binlog Event Checksum。

MGR適用場景

  • 金融交易、重要數據存儲、對主從一致性要求高的場景。
  • 核心數據總量未過億。
  • 讀多寫少,如:互聯網電商。

單主模式和多主模式

組復制介紹

MGR對屬于同一組中的服務器自動進行協調。對于要提交的事務,組成員必須就全局事務序列中給定事務的順序達成一致,提交或回滾事務由每個服務器單獨完成(即每臺服務器都可以寫數據或讀數據),但所有服務器都必須做出相同的決定。如果存在網絡分區,導致成員無法達成事先定義的分割策略,則在解決此問題之前系統不會繼續進行,這是一種內置的自動裂腦保護機制。

MGR由組通信系統(Group Communication System ,GCS) 協議支持。該系統提供故障檢測機制、組成員服務以及安全且有序的消息傳遞。

組復制插件架構圖

MySQL組復制是一個MySQL插件,它基于常規的MySQL復制,利用了基于行格式的二進制日志和GTID等特性。下圖是MySQL組復制的整體框架圖。
在這里插入圖片描述

  1. 從上圖的頂端開始,有一系列的API控制組復制插件如何和MySQL Server進行交互(圖中灰色方框)。
  2. 中間有一些接口可以使信息從MySQL Server流向組復制插件,反之亦然。這些接口將MySQL Server核心部分和插件隔離開來。在Server到插件的方向上,傳遞一些通知信息,例如server正在啟動,server正在恢復,server已準備好接收連接,server將要提交事務等等。另一方向,即插件到server的方向上,插件會通知server對事務進行提交,終止正在進行的事務,將事務放進relay-log中排隊等等。
  3. 從API往下是一些響應組件,當通知信息路由到它們身上時就響應。capture組件負責跟蹤正在執行的事務的上下文信息。applier組件負責在本節點上執行遠程傳輸來的事務。recovery組件負責管理分布式恢復過程,還負責在節點加入組時選擇donor,編排追趕過程以及對選擇donor失敗時的反應。
  4. 繼續向下,replication協議模塊包含了特定的復制協議邏輯。它負責探測沖突,在組中接收和傳播事務。
  5. 后兩層是組內通信系統(GCS)的API(第一個綠色方框),以及一個基于Paxos組通信引擎的實現(implementation)(第二個綠色方框)。GCS API是組內通信API,它是一個上層API,它抽象了構建一個復制狀態所需的屬性,它從插件的更上層解耦了消息傳遞層。
  6. 組通信引擎負責處理組內成員的通信。

單主模式

在單主模式下,組復制具有自動選主功能,group內只有一臺節點可寫可讀,其他節點只可以讀。對于group的部署,需要先跑起primary主節點,然后再開啟其他節點,并把這些節點加進group。其他的節點就會自動同步primary節點上面的變化,然后設置為只讀模式。

當primary主節點意外宕機或下線,在滿足大多數節點存活的情況下,group內部發起選舉,選出下一個可用的讀節點提升為primary節點。
在這里插入圖片描述

多主模式

在多主模式下,所有的MySQL節點都可以同時接受讀寫操作。group內的所有節點都是primary主節點,同時可以進行讀寫操作,并且數據是最終一致的。在多主模式下,不支持SERIALIZABLE事務隔離級別,且不能完全支持級聯外鍵約束。

在mysql多主模式下,在組復制中通過Group Replication Protocol協議及Paxos協議,形成的整體高可用解決方案同時增加了certify的概念,負責檢查事務是否允許提交,是否與其它事務存在沖突。Group Replication是由多個節點共同組成一個數據庫集群,每個節點都可以單獨執行事務,但是readwrite(rw)的操作只有在組內驗證后才可以commit,Read-only (RO)事務是不需要驗證可以立即執行,當一個事務在一個節點上提交之前,會在組內自動進行原子性的廣播,告知其他節點變更了什么內容,執行了什么事務,然后為該事務建立一個全局的排序。最終這意味著所有的服務器都以相同的順序接收相同的事務集。因此,所有服務器都按照相同的順序應用相同的變更集,因此它們在組中保持一致。

在這里插入圖片描述

配置主機名解析

$ sudo vim /etc/hosts
192.168.1.46 mysqlmaster
192.168.1.47 mysqlslave1
192.168.1.48 mysqlslave2
192.168.1.51 mysqlproxy

安裝MGR插件

查找插件位置
$ sudo find / -name “group_replication.so”
在這里插入圖片描述
主庫配置
在主庫原有配置上增加如下配置

# 設置MySQL插件目錄:MGR基于插件,必須設置插件路徑
plugin_dir=/usr/lib/mysql/plugin
# 開啟binlog的GTID模式(MGR強制要求)
gtid_mode=ON
# 開啟后MySQL只允許能夠保障事務安全,并且能夠被日志記錄的SQL語句被執行
enforce_gtid_consistency=ON
# 關閉binlog校驗(MGR強制要求)
binlog_checksum=NONE# 定義用于事務期間哈希寫入提取的算法,組復制模式下必須設置為XXHASH64。
transaction_write_set_extraction=XXHASH64
# 服務器實例所在復制組名稱,必須是有效的UUID,所有節點必須相同。
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
# 確定服務器是否應該在服務器啟動期間啟動組復制。
loose-group_replication_start_on_boot=OFF# 為復制組中其他的成員提供的網絡地址,指定為“主機:端口”的格式化字符串。
# 很多人想當然認為端口應該是3306,其實不然,MGR需要開啟新端口24901同步交換
# 所以這里不要寫錯,可以配置主機名或IP地址
loose-group_replication_local_address="192.168.1.46:24901"# 用于建立新成員到組的連接組成員列表。
# 這個列表指定為由分隔號間隔的組成員網絡地址列表,類似host1:port1、host2:port2的格式。
loose-group_replication_group_seeds="192.168.1.46:24901,192.168.1.47:24901,192.168.1.48:24901"# 配置此服務器為引導組,這個選項必須僅在一臺服務器上設置,
# 并且僅當第一次啟動組或重新啟動整個組時。成功引導組啟動后,將此選項設置為關閉。
loose-group_replication_bootstrap_group=OFF

slave1從庫配置

plugin_dir=/usr/lib/mysql/plugingtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE# 這個參數決定primary節點到secondary節點的請求是否為基于RSA密鑰對的密碼交換所需的公鑰
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_recovery_use_ssl=ON
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF# 設置slave1節點本機地址192.168.1.47:24901
loose-group_replication_local_address="192.168.1.47:24901"
loose-group_replication_group_seeds="192.168.1.46:24901,192.168.1.47:24901,192.168.1.48:24901"
loose-group_replication_bootstrap_group=OFF

slave2從庫配置

plugin_dir=/usr/lib/mysql/plugingtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE# 這個參數決定primary節點到secondary節點的請求是否為基于RSA密鑰對的密碼交換所需的公鑰
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_recovery_use_ssl=ON
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF# 設置slave2本機地址192.168.1.48:24901
loose-group_replication_local_address="192.168.1.48:24901"
loose-group_replication_group_seeds="192.168.1.46:24901,192.168.1.47:24901,192.168.1.48:24901"
loose-group_replication_bootstrap_group=OFF
重啟各個節點
$ sudo systemctl restart mysql
導入插件,在每個節點都執行
INSTALL PLUGIN group_replication SONAME 'group_replication.so';

在這里插入圖片描述
在主服務器的MySQL上執行下述命令

SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

在這里插入圖片描述
在兩個從服務器上執行下述命令,執行之前應關閉MySQL主從復制線程

# 關閉復制線程
STOP SLAVE;# 指定主從賬戶與指定通信頻道
CHANGE MASTER TO MASTER_USER="replica", MASTER_PASSWORD="123456" FOR CHANNEL 'group_replication_recovery';# 開啟組網數據同步
START GROUP_REPLICATION;
查看成員狀態信息
SELECT * FROM performance_schema.replication_group_members;

在這里插入圖片描述

MGR故障轉移

主節點下線重新選舉
$ sudo systemctl stop mysql
在slave1節點查看集群狀態
SELECT * FROM performance_schema.replication_group_members;

在這里插入圖片描述
查看master的日志
在這里插入圖片描述
查看slave1的日志
在這里插入圖片描述
查看slave2的日志
在這里插入圖片描述
可以看到slave1已經成為主庫,由此可以說明MGR的選舉策略為:

  1. 優先低版本節點
  2. 版本一樣,優先權重大的節點
  3. 版本與權重一樣,按照server uuid的字母順序選主

新主節點slave1下線,集群不可用
$ sudo systemctl stop mysql

SELECT * FROM performance_schema.replication_group_members;

在這里插入圖片描述
在slave2上通過命令查看發現,slave1新主節點盡管已經下線,但slave2還在線,因為只有1個節點的情況下,少于n/2+1的規則,導致整體MGR集群失效,slave2節點無法產生選舉

恢復MGR集群

只需要將三臺服務器的MySQL分別重啟,然后按照啟動復制組的順序執行命令即可恢復

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85679.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85679.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85679.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

保安員證考試的理論知識部分,重點考查的法律法規具體有哪些?

保安員證考試理論知識部分,重點考查的法律法規主要有以下幾種: 《保安服務管理條例》:作為保安行業的專門法規,是考試核心。重點考查保安服務活動規范,如保安服務的范圍、資質要求等;保安員的權利與義務&am…

【好用但慎用】Windows 系統中將所有 WSL 發行版從 C 盤遷移到 非系統 盤的完整筆記(附 異常處理)

🚀 將所有 WSL 發行版從 C 盤遷移到 I 盤的完整教程(含 Podman / NVIDIA Workbench / Ubuntu 等) 【無標題】使用 Chocolatey 安裝 WSL 管理工具 LxRunOffline-CSDN博客 免責聲明 重要提示 在執行 WSL 遷移操作前,請務必仔細閱讀…

Oracle APEX 通過rtf模板下載PDF文件(BIP)

1. 上傳模板文件 共享組件 > 報表布局 2. 編寫SQL文 共享組件 > 報表查詢 報表布局中選擇1中設置完的報表布局,然后編寫SQL文提供數據 3. 添加下載按鈕 在頁中添加一個下載按鈕,添加動態操作,選擇打印報告 4. 下載PDF文件 點擊Pri…

Web Seach 搜索 MCP 啟動!

🚀 開啟你的 AI 助手搜索能力!開源 Web 搜索 MCP 服務器上線! 在 ChatGPT、Claude 等 AI 工具成為生產力新核心的今天,我們往往面臨一個尷尬的問題:模型不知道最新的網絡信息。雖然 GPT-4o 和 Claude 支持聯網功能&am…

005微信小程序npm包_全局數據共享和分包

npm包_全局數據共享和分包 1. 使用npm包1.1 Vant Weapp1.2 API Promise化 2. 全局數據共享3. 分包3.1 分包的加載規則3.2 分包的體積限制3.3 使用分包3.3 獨立分包3.4 分包預下載 1. 使用npm包 小程序對npm進行了支持與限制,限制如下: 不支持依賴于 No…

DPO直接偏好函數的學習解讀

DPO, Direct Preference Optimization,采用直接優化策略滿足人類偏好,使得LLM對于給定輸入,生成能用輸出的概率高于生成不能用輸出的概率。 1)DPO優化目標 在DPO訓練過程中,模型通過最大化可用回答相對于不可用回答的…

【開源初探】基于 Qwen2.5VL的文檔解析工具:docext

源碼地址: https://github.com/NanoNets/docext 概述 docext 是一個由視覺語言模型(vlm)提供支持的全面的本地文檔智能工具包。vlm 使用的是基于 Qwen2.5VL-3B 的模型,應該是在此模型基礎上進行的微調。 它提供了三個核心功能&…

Python 正確重載運算符(增量賦值運算符)

增量賦值運算符 Vector 類已經支持增量賦值運算符 和 * 了,如示例 13-15 所示。 示例 13-15 增量賦值不會修改不可變目標,而是新建實例,然后 重新綁定 >>> v1 Vector([1, 2, 3]) >>> v1_alias v1 # ? >>> …

XCUITest + Objective-C 詳細示例

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】

redis分布式鎖 Redisson在電商平臺開發中的實際應用

目錄 概述 Redis分布式鎖的實現方式 1. 基于SETNX命令(String類型) 2. 使用SET命令的NX和EX參數(推薦方式) 3. 基于Lua腳本實現復雜邏輯 4. RedLock算法(多節點Redis實現) Redisson的分布式鎖 Redis…

joomla 使用nginx服務器只能打開首頁,其他頁面404的解決方案

最近一個客戶將Joomla4網站從原先的Apache服務器改為Nginx服務器,整個過程一切順利,但還原網站后發現只能打開首頁,其他頁面都是404。這個問題需要修改nginx的配置文件來解決。 偽靜態 在Apache中使用.htaccess來完成偽靜態路由的轉發&…

湖北理元理律師事務所企業債務紓困路徑:司法重整中的再生之道

中小企業債務危機常呈現“擔保鏈擴散”特征,單一債務可能引發企業崩盤。湖北理元理律師事務所通過預重整制度與企業債務重組技術,探索出“司法保護商業談判”的紓困模式。 一、企業債務風險處置四步法 緊急止血 申請司法保護:通過訴前調解…

利用DeepWiki高效閱讀項目源碼

想獲取更多高質量的Java技術文章?歡迎訪問Java技術小館官網,持續更新優質內容,助力技術成長 技術小館官網 DeepWiki 是一個強大的工具,專為程序員提供開源項目源碼的結構化文檔和 AI 驅動的問答功能,幫助快速理解復雜…

django rest_framework 前端網頁實現Token認證

rest_framework提供了幾種認證方式:Session、Token等。Session是最簡單的,幾乎不用寫任何代碼就可以是實現,Token方式其實也不復雜,網上的教程一大把,但是最后都是用Postman這類工具來實現API調用的,通過這…

面試題-函數類型的重載是啥意思

在 TypeScript 中,函數重載(Function Overload) 是指為同一個函數提供多個不同的調用簽名(參數類型和返回值類型的組合),但函數體只有一個實現。這樣可以讓函數在不同的輸入下表現出不同的行為,…

磐基PaaS平臺MongoDB組件SSPL許可證風險與合規性分析(上)

#作者:任少近 文章目錄 1.背景與問題1.1.背景1.2.問題 3.SSPL條款解讀分析3.1.條款0:定義條款3.2.條款一:源代碼條款3.3.條款二:基本授權條款3.4.條款三:反規避保護條款3.5.條款四:逐字傳播條款3.6.條款五…

「Linux文件及目錄管理」輸入輸出重定向與管道

知識點解析 輸入/輸出重定向 標準輸入(stdin):默認從鍵盤讀取,文件描述符為0。標準輸出(stdout):默認輸出到終端,文件描述符為1。標準錯誤(stderr):默認輸出到終端,文件描述符為2。重定向符號: >:覆蓋輸出到文件(如command > file)。>>:追加輸出…

【Node】最佳Node.js后端開發模板推薦

Node.js 后端開發模板推薦 以下是幾個優秀的Node.js后端模板,它們都適合二次開發,各自有不同的特點和適用場景: 1. Express基礎模板 Express Generator (官方工具) 官方提供的快速搭建工具基礎MVC結構簡單易上手 npm install express-ge…

HALCON相機標定

相機標定簡介: 首先,相機會產生畸變,即實際圖像和拍攝圖像不一致,可以是凸性也可以是凹性形變,相機標定的過程就是將畸變圖像還原為原始圖像,并將圖像中的像素坐標轉換為世界坐標。 形如:相機內…

Solidity 入門教程(二):值類型全解 —— 布爾、整數、地址與字節數組

在上一章中,我們寫下了第一個 Solidity 合約并在 Remix 中成功運行。本章我們將深入了解 Solidity 中的幾種常用值類型(Value Types),并通過示例代碼在 Remix 進行驗證。 一、Solidity 中的三種數據類型 在 Solidity 中&#xf…