MySQL8.0基于GTID的組復制分布式集群的環境部署

前言:

?????????需要清楚知道:MySQL 復制組能夠以一種自動優先選擇的單主模式運行,在某個時間只有一個服務器接受更新 。但是對于更高優先級的用戶,組能夠以多主模式部署,所有的服務器都能夠接受更新,即使它們是同時發生的。組復制中存在著一種內建的組成員關系服務用來保持組的視圖一致,并且在任意時間對于組中的所有的服務器都可用。MySQL 服務器能夠退出或者加入組中,而且視圖也會相應的更新。有時服務器可能會意外的退出組 (故障),在這種情況下失敗檢測機制檢測這種情況并且告知復制組視圖發生了變化,這所有的一切都是自動實現的。

目錄

1.服務器環境部署

2.MGR組復制單主模式配置

(1)組復制第一個實例配置

①參數配置

②重啟服務

③用戶憑據

④組復制插件

⑤加入組復制

⑥數據測試

(2)組復制添加其他實例成員

①參數配置

②重啟服務

③用戶憑據

④組復制插件

⑤加入組復制

(3)數據測試

總結


1.服務器環境部署

本節實驗環境部署的是mysql 8.0.42三臺實例

主機名IPServer IDOSMySQL version
node1192.168.72.16381OpenEuler24.3Mysql 8.0.42
node2192.168.72.16482OpenEuler24.3Mysql 8.0.42
node3192.168.72.16583OpenEuler24.3Mysql 8.0.42
#所有主機添加hosts解析
[root@node1 ~]# cat /etc/hosts
192.168.72.163 node1
192.168.72.164 node2
192.168.72.165 node3

2.MGR組復制單主模式配置

(本案例采用 MGR 默認單主模式)。

(1)組復制第一個實例配置
①參數配置

先給這組 MGR 起個組名,組名可以隨便起,但是不能使用主機的 GTID.

可以通過節點的 UUID 作為 loose-group_replication_group_name 的組名,并且每個節點的這個組名必須一樣!

這里使用參照官網設置手冊,如下設置組名,https://dev.mysql.com/doc/refman/8.0/en/group-replication-configuring-instances.html

?# 如果要通過節點的UUID設置組名,查看節點node1的uid[root@node1 mysql]# cat /var/lib/mysql/auto.cnf [auto]server-uuid=dd746660-528a-11ed-9c86-000c293b9f86-- 或者通過sql查看mysql> select uuid();+--------------------------------------+| uuid() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |+--------------------------------------+| bf4b19ea-60f1-11ed-a06b-000c293b9f86 |+--------------------------------------+# 配置參數文件[root@node1 ~]# vim /etc/my.cnf[mysqld]# 原有默認配置
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
# 密碼驗證方式
default_authentication_plugin=mysql_native_password
#Storage Engines
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
#Replication Framework
server_id=81
gtid_mode=ON
enforce_gtid_consistency=ON
?binlog_checksum=NONE?
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
transaction_write_set_extraction=XXHASH64?
sync-master-info =1
sync_binlog =1
#Group Replication Settings
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= "node1:33061"
group_replication_group_seeds= "node1:33061,node2:33061,node3:33061"
group_replication_bootstrap_group=off
# 雙主模式,如果是單主模式無需配置,默認單主模式# 當前不配置,后續切換多主模式后再持久化該參數# group_replication_single_primary_mode=off# group_replication_enforce_update_everywhere_checks=on

參數說明:

?#以便在server收集寫集合的同時將其記錄到二進制日志。寫集合基于每行的主鍵,并且是行更改后的唯一標識此標識將用于檢測沖突。transaction_write_set_extraction=XXHASH64plugin_load_add='group_replication.so'#組的名字可以隨便起,但不能用主機的GTID! 所有節點的這個組名必須保持一致!group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"#為了避免每次啟動自動引導具有相同名稱的第二個組,所以設置為OFF。group_replication_start_on_boot=offgroup_replication_local_address= "node1:33061"group_replication_group_seeds= "node1:33061,node2:33061,node3:33061"group_replication_bootstrap_group=off#關閉單主模式的參數#group_replication_single_primary_mode=off#開啟多主模式的參數#group_replication_enforce_update_everywhere_checks=on
②重啟服務
?# 所有節點systemctl restart mysqld
③用戶憑據

為了在每個實例上單獨創建復制用戶,可以禁用二進制日志記錄后再創建,請按照以下語句執行:

https://dev.mysql.com/doc/refman/8.0/en/group-replication-user-credentials.html

[root@node1 ~]# mysql -proot
mysql>
# mysql8默認密碼認證方式,客戶端是無法連接的,使用mysql_native_password,或在參數文件中加入參數
# default_authentication_plugin=mysql_native_password
# CREATE USER repl@'%' IDENTIFIED BY 'repl';
SET SQL_LOG_BIN=0;
CREATE USER repl@'%' IDENTIFIED with mysql_native_password BY 'repl';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;?
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';

修改mysql密碼?

進入mysql創建復制用戶

④組復制插件
?# 安裝組復制插件# INSTALL PLUGIN group_replication SONAME 'group_replication.so';# 本次已經在配置文件添加引導,無需再次安裝mysql> SHOW PLUGINS;+----------------------------+----------+--------------------+----------------------+-------------+| Name ? ? ? ? ? ? ? ? ? ? ? | Status ? | Type ? ? ? ? ? ? ? | Library ? ? ? ? ? ?  | License ? ? |+----------------------------+----------+--------------------+----------------------+-------------+| binlog ? ? ? ? ? ? ? ? ? ? | ACTIVE ? | STORAGE ENGINE ? ? | NULL ? ? ? ? ? ? ? ? | PROPRIETARY |?(...)?| group_replication ? ? ? ?  | ACTIVE ? | GROUP REPLICATION  | group_replication.so | PROPRIETARY |+----------------------------+----------+--------------------+----------------------+-------------+
⑤加入組復制
?# 引導只能由單個服務器完成,即啟動組的服務器并且只執行一次。# 這就是為什么group_replication_bootstrap_group選項的值沒有存儲在實例的選項文件中的原因。# 如果它保存在選項文件中,則在重新啟動服務器時會自動引導第二個具有相同名稱的組。這將導致兩個不同的組具有相同的名稱mysql>
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
SELECT * FROM performance_schema.replication_group_members;# 可以檢查該組現在是否已創建并且其中有一個成員# 要保證group_replication_applier的狀態為"ONLINE"!
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 | dd746660-528a-11ed-9c86-000c293b9f86 | node1 ? ? ? | ? ? ? ?3306 | ONLINE ? ? ? | PRIMARY ? ? | 8.0.31 ? ? ? ? | XCom ? ? ? ? ? ? ? ? ? ? ? |+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+1 row in set (0.00 sec)
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.00 sec)mysql>  START GROUP_REPLICATION;Query OK, 0 rows affected (1.30 sec)mysql>  SET GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 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 | fa4f25e1-5beb-11f0-885f-000c29c274d2 | node1       |        3306 | ONLINE       | PRIMARY     | 8.0.42         | XCom                       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
1 row in set (0.00 sec)

⑥數據測試
?# 組復制環境下要求每個表都需要有主鍵,否則表上的DML會報錯:# ERROR 3098 (HY000): The table does not comply with the requirements by an external plugin.mysql>
CREATE DATABASE test;
USE test;
CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
INSERT INTO t1 VALUES (1, 'Luis');?
mysql> SELECT * FROM test.t1;+----+------+| c1 | c2 ? |+----+------+| ?1 | Luis |+----+------+
mysql> SHOW BINLOG EVENTS;
mysql> CREATE DATABASE test;
Query OK, 1 row affected (0.00 sec)mysql> USE test;
Database changed
mysql>  CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
Query OK, 0 rows affected (0.01 sec)mysql> INSERT INTO t1 VALUES (1, 'Luis');
Query OK, 1 row affected (0.03 sec)mysql> SELECT * FROM test.t1;
+----+------+
| c1 | c2   |
+----+------+
|  1 | Luis |
+----+------+
1 row in set (0.00 sec)mysql> SHOW BINLOG EVENTS;
+---------------+-----+----------------+-----------+-------------+-----------------------------------+
| Log_name      | Pos | Event_type     | Server_id | End_log_pos | Info                              |
+---------------+-----+----------------+-----------+-------------+-----------------------------------+
| binlog.000001 |   4 | Format_desc    |         1 |         126 | Server ver: 8.0.42, Binlog ver: 4 |
| binlog.000001 | 126 | Previous_gtids |         1 |         157 |                                   |
| binlog.000001 | 157 | Stop           |         1 |         180 |                                   |
+---------------+-----+----------------+-----------+-------------+-----------------------------------+
3 rows in set (0.00 sec)

(2)組復制添加其他實例成員
①參數配置

參數配置和第一個節點的參數類似,只需修改server_idgroup_replication_local_address.

?# 將參數文件拷貝到其他節點[root@node1 ~]# scp /etc/my.cnf root@node2:/etc/my.cnf[root@node1 ~]# scp /etc/my.cnf root@node3:/etc/my.cnf?# 配置參數文件,其他參數相同,修改如下兩個參數[root@node2 ~]# vim /etc/my.cnf[mysqld]server_id = 82group_replication_local_address= "node2:33061"[root@node3 ~]# vim /etc/my.cnf[mysqld]server_id = 83group_replication_local_address= "node3:33061"

切換到node2主機修改配置文件?

?切換到node3主機修改配置文件

②重啟服務
?# 所有節點systemctl restart mysqld
③用戶憑據

為了在每個實例上單獨創建復制用戶,可以禁用二進制日志記錄后再創建,請按照以下語句執行:

User Credentials For Distributed Recovery

mysql>
SET SQL_LOG_BIN=0;
CREATE USER repl@'%' IDENTIFIED BY 'repl';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;?
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';

切換到node2主機創建復制用戶

?切換到node3主機創建復制用戶

④組復制插件
?# 安裝組復制插件# INSTALL PLUGIN group_replication SONAME 'group_replication.so';# 本次已經在配置文件添加引導,無需再次安裝
⑤加入組復制
?#這里只需要執行這一步即可,因為組已經創建mysql> START GROUP_REPLICATION;#查看組內情況,發現node2,node3已經成功加入這個組了#一主兩從模式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 | 2dd88a45-6161-11ed-b5d2-000c299aa451 | node3 ? ? ? | ? ? ? ?3306 | ONLINE ? ? ? | SECONDARY ? | 8.0.31 ? ? ? ? | XCom ? ? ? ? ? ? ? ? ? ? ? || group_replication_applier | 30c9d73b-6161-11ed-b523-000c2913fd72 | node2 ? ? ? | ? ? ? ?3306 | ONLINE ? ? ? | SECONDARY ? | 8.0.31 ? ? ? ? | XCom ? ? ? ? ? ? ? ? ? ? ? || group_replication_applier | 32710bb7-6161-11ed-b45b-000c29b2256f | node1 ? ? ? | ? ? ? ?3306 | ONLINE ? ? ? | PRIMARY ? ? | 8.0.31 ? ? ? ? | XCom ? ? ? ? ? ? ? ? ? ? ? |+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+3 rows in set (0.00 sec)

切換到node2主機加入組復制?

切換到node3主機加入組復制?

(3)數據測試
#主庫創建
mysql> CREATE DATABASE recovery_test;
Query OK, 1 row affected (0.01 sec)
mysql> USE recovery_test;
Database changed
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
Query OK, 0 rows affected (0.03 sec)mysql> INSERT INTO t1 VALUES (1, 'Luis');
Query OK, 1 row affected (0.01 sec)#從庫查詢
mysql> SELECT * FROM recovery_test.t1;
+----+------+
| c1 | c2 ? |
+----+------+
| ?1 | Luis |
+----+------+
1 row in set (0.00 sec)
#主庫添加數據
INSERT INTO recovery_test.t1 VALUES (2, 'Klaus');
#從庫查詢
mysql> ?SELECT * FROM recovery_test.t1;
+----+-------+
| c1 | c2 ?  |
+----+-------+
| ?1 | Luis  |
| ?2 | Klaus |
+----+-------+
2 rows in set (0.00 sec)

node2驗證?

node3驗證

以上驗證成功后,組復制配置結束

總結:

????????基于GTID的組復制通過事務唯一標識+自動位點同步,顯著簡化了分布式集群的運維復雜度。部署核心在于:

????????1.全節點GTID參數統一配置;

????????2.初始數據強一致保障;

????????3.多主架構下沖突解決策略優化;

????????4.配套半同步復制與自動故障轉移提升可用性。

????????5.生產環境中需持續監控GTID執行進度,并規避非事務引擎操作,以維持集群穩定性。

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

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

相關文章

中國國際會議會展中心模塊化解決方案的技術經濟分析報告

——以模塊化、可持續材料與ESG為核心的運營效益提升路徑研究-----中國會展經濟研究會原副會長,學術委員會副主任 姚望一、報告概述1.1報告目的本報告深入探討了一種經濟視角下的綜合評估,針對某國際會議會展中心采用的一種模塊化、多功能、可持續升級的…

模擬開關、可編程增益儀表放大器電路

一、模擬開關1.CD4052CD4052是一種模擬多路開關,也可以稱作是一個模擬多路復用器,輸入引腳可以提供可變電壓,可以通過輸出引腳獲得相同電壓,常見的封裝有DIP16、SOP16、TSSOP16。 CD4052的引腳功能如下圖,可以用于控制…

時序數據庫 TDengine × SSRS:專為工業、能源場景打造的報表解決方案

每當聽到“做報表”三個字,是不是內心都會先嘆口氣?尤其在工業、能源、制造等場景,面對那些結構固定、字段繁多、格式要求嚴苛的報表任務,用 Excel 手動拼,真的是既費時又容易出錯。 現在解決方案來了——時序數據庫 …

C++設計秘籍:為什么所有參數都需類型轉換時,非成員函數才是王道?

當所有參數都需要類型轉換時,為什么要選擇非成員函數? 在C++的世界里,有一個看似簡單卻蘊含深意的設計原則:當所有參數(包括被this指針所指的那個隱式參數)皆須進行類型轉換時,請為此采用非成員函數實現。這個原則背后隱藏著C++類型系統的精妙設計,也揭示了成員函數與…

Markmap:基于Markdown生成思維導圖

Markmap 是一款用于將 Markdown 文本轉換為思維導圖的免費工具。 Markmap 的核心原理是通過輸入:結構化的 Markdown 文本,根據標題層級構建一個樹形數據結構,然后使用 d3.js 可視化 JavaScript 庫將樹形數據渲染成可交互的 SVG 思維導圖。 主…

學習threejs,使用自定義GLSL 著色器,生成漂流的3D能量球

👨??? 主頁: gis分享者 👨??? 感謝各位大佬 點贊👍 收藏? 留言📝 加關注?! 👨??? 收錄于專欄:threejs gis工程師 文章目錄一、🍀前言1.1 ??GLSL著色器1.1.1 ??著色器…

分布式推客系統全棧開發指南:SpringCloud+Neo4j+Redis實戰解析

一、推客系統概述與市場背景推客系統(或稱"推薦客"系統)是一種基于社交關系和內容分發的推薦營銷平臺,近年來在電商、內容平臺和社交媒體領域迅速崛起。根據最新統計數據,2023年全球社交電商市場規模已達1.2萬億美元&am…

Redis數據類型之list

上篇文章: Redis數據類型之hashhttps://blog.csdn.net/sniper_fandc/article/details/149139615?fromshareblogdetail&sharetypeblogdetail&sharerId149139615&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目錄 1 lpush、lpu…

在 Windows 上安裝和配置 Kafka

消息代理是一種軟件,充當在不同應用程序之間發送消息的中介。它的功能類似于服務器,從一個應用程序(稱為生產者)接收消息,并將其路由到一個或多個其他應用程序(稱為消費者)。消息代理的主要目的…

FPGA實現SDI轉LVDS視頻發送,基于GTP+OSERDES2原語架構,提供工程源碼和技術支持

目錄 1、前言工程概述免責聲明 2、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目本博已有的 SDI 編解碼方案FPGA實現LVDS視頻收發方案 3、工程詳細設計方案工程設計原理框圖SDI 輸入設備Gv8601a 均衡器GTP 高速接口-->解串SMPTE SD/HD/3G SDI IP…

uniapp+vue3項目實現:H5的文件預覽、文件下載功能(文章參考)

uniappvue3項目實現:H5的文件預覽、文件下載功能(文章參考) 文章參考: uniapp的移動端h5實現文件下載兼容手機各版本瀏覽器 uni-app之微信小程序實現‘下載保存至本地預覽’功能 uniapp:h5和微信小程序文件下載方式

汽車功能安全-軟件單元驗證 (Software Unit Verification)【定義、目的、要求建議】6

文章目錄1 軟件單元驗證 (Software Unit Verification)2 ISO 26262-6對單元驗證的實施要求和建議2.1 要求和建議2.2 通俗易懂的解釋與總結2.3 示例2.3.1 場景1:電動助力轉向系統 (EPS)2.3.2 場景2:自動緊急制動系統 (AEB)2.3.3 示例模型驗證2.4 核心要點…

提示工程:突破Transformer極限的計算科學

Why Prompt Design Matters and Works: A Complexity Analysis of Prompt Search Space in LLMs 提示工程如何從經驗技巧升級為系統科學 一、Transformer的先天缺陷:計算深度固化與信息丟失 原理 Transformer架構的計算能力存在固有局限: 計算深度固化:其隱狀態僅在層間…

【2025/07/11】GitHub 今日熱門項目

GitHub 今日熱門項目 🚀 每日精選優質開源項目 | 發現優質開源項目,跟上技術發展趨勢 📋 報告概覽 📊 統計項📈 數值📝 說明📅 報告日期2025-07-11 (周五)GitHub Trending 每日快照&#x1f55…

LeetCode 278. 第一個錯誤的版本

LeetCode 278. 第一個錯誤的版本 解析 這個問題要求找到第一個錯誤的版本,其中給定一個 API isBadVersion(version) 可以判斷某個版本是否錯誤。由于版本號是有序的,且錯誤版本之后的所有版本都是錯誤的,因此可以使用二分查找高效地定位第一個…

【RK3568+PG2L50H開發板實驗例程】FPGA部分 | Pango 的時鐘資源——鎖相環

本原創文章由深圳市小眼睛科技有限公司創作,版權歸本公司所有,如需轉載,需授權并注明出處(www.meyesemi.com) 1.實驗簡介 實驗目的: 了解 PLL IP 的基本使用方法。 實驗環境: Window11 PDS2022.2-SP6.4…

Graph Contrastive Learning with Generative Adversarial Network基于生成對抗網絡的圖對比學習

1. 什么是圖?(Graph)想象一下社交網絡,每個人是一個“點”(節點),他們之間的朋友關系是“線”(邊)。這樣的點和線組成的結構就是“圖”。在計算機科學中,圖被…

PyTorch中的torch.argmax()和torch.max()區別

在PyTorch中,torch.argmax()和torch.max()都是針對張量操作的函數,但它們的核心區別在于返回值的類型和用途:1. torch.argmax() 作用:僅返回張量中最大值所在的索引位置(下標)。返回值:一個整數…

WebSocket主從服務器架構完整教程

目錄 1. 前言:為什么要學習WebSocket主從架構 第一章:基礎知識準備 2.1 什么是WebSocket 生活中的例子 技術特點 2.2 WebSocket vs HTTP 什么時候用WebSocket? 2.3 什么是主從架構 生活中的例子 技術架構圖 2.4 環境準備 需要的軟件 項目結構 第二章:WebSock…

Java的extends通配符

在Java泛型中,extends通配符用于限定泛型類型的上界,即指定泛型可以是某個類型或其子類型。它有兩種常見用法:類型參數限定和通配符限定,下面詳細介紹: 1. 類型參數限定(在類/方法定義中) 在定義…