MySQL Group Replication配置

来源:https://www.cnblogs.com/shengdimaya/archive/2018/02/09/8436112.html
-Advertisement-
Play Games

MySQL 組複製實現了基於複製協議的多主更新(單主模式)。 複製組由多個 server成員構成,並且組中的每個 server 成員可以獨立地執行事務。但所有讀寫(RW)事務只有在衝突檢測成功後才會提交。只讀(RO)事務不需要在衝突檢測,可以立即提交。 對於任何 RW 事務,提交操作並不是由始發 s ...


MySQL Group Replication簡述

MySQL 組複製實現了基於複製協議的多主更新(單主模式)。

複製組由多個 server成員構成,並且組中的每個 server 成員可以獨立地執行事務。但所有讀寫(RW)事務只有在衝突檢測成功後才會提交。只讀(RO)事務不需要在衝突檢測,可以立即提交。

對於任何 RW 事務,提交操作並不是由始發 server 單向決定的,而是由組來決定是否提交。準確地說,在始發 server 上,當事務準備好提交時,該 server 會廣播寫入值(已改變的行)和對應的寫入集(已更新的行的唯一標識符)。然後會為該事務建立一個全局的順序。最終,這意味著所有 server 成員以相同的順序接收同一組事務。因此,所有 server 成員以相同的順序應用相同的更改,以確保組內一致。

組複製使您能夠根據在一組 server 中複製系統的狀態來創建具有冗餘的容錯系統。因此,只要它不是全部或多數 server 發生故障,即使有一些 server 故障,系統仍然可用,最多只是性能和可伸縮性降低,但它仍然可用。server 故障是孤立並且獨立的。它們由組成員服務來監控,組成員服務依賴於分散式故障檢測系統,其能夠在任何 server 自願地或由於意外停止而離開組時發出信號。

他們是由一個分散式恢復程式來確保當有 server 加入組時,它們會自動更新組信息到最新。並且多主更新確保了即使在單個伺服器故障的情況下也不會阻止更新,不必進行 server故障轉移。因此,MySQL 組複製保證資料庫服務持續可用。

值得註意的一點是,儘管資料庫服務可用,但當有一個 server 崩潰時,連接到它的客戶端必須定向或故障轉移到不同的 server。 這不是組複製要解決的問題。連接器,負載均衡器,路由器或其他形式的中間件更適合處理這個問題。MySQL 組複製提供了高可用性,高彈性,可靠的 MySQL 服務。 MySQL組複製的一些限制:

1 不支持XA事務 
2 表需要有主鍵 
3 採用GTID+binlog的方式進行複製 
4 只支持IPV4的網路 
5 網路性能對於集群影響很大 ,需要低延遲,高帶寬
6 多主不支持同一對象但是不同實例的併發的DDL+DML混合操作 
7 不支持串列化操作 不支持RR模式的間隙鎖,最好採用RC模式配合組複製 
8 多主不支持外鍵約束
9 不支持事務保存點
10 集群性能取決於最差的硬體機器,所以推薦所有硬體統一配置
11 mysqldump無法備份GR實例
12 目前集群限制最多允許9個節點。

以上參考了網路上一些博客,原理的東西網上東西還是很多的,大家可以自行百度。

關於組複製的一些詳細加強,可以看一下我們星耀隊的譯文MySQL 8.0.2複製新特性(翻譯)

1:安裝環境

 

機器IP
SERVER1 10.103.16.31
SERVER2 10.103.16.34
SERVER3 10.103.16.35

MySQL的版本是5.7.20,我們先在三台主機安裝好MySQL並且啟動,詳細安裝參考MySQL5.7.20編譯安裝,基本環境搭建完成以後我們來看一下MySQL Group Replication的配置

2:配置安裝MySQL Group Replication

我們現在三台機器上已經配置好了三台MySQL服務,我們要在我們當前配置文件的基礎上加上GR的一些參數,我們以SERVER1為例:

binlog_checksum = NONE #MGR本身不支持binlog的checksum校驗
transaction_write_set_extraction = XXHASH64 
loose-group_replication_group_name = "00e575aa-0cc0-11e8-9186-0050569341db"    # 組名,此處可拿select uuid();生成
loose-group_replication_start_on_boot = off    # 在mysqld啟動時不自動啟動組複製
loose-group_replication_local_address = "10.103.16.31:24901" 
loose-group_replication_group_seeds = "10.103.16.34:24901,10.103.16.35:24901,10.103.16.31:24901"    
loose-group_replication_bootstrap_group = off 

 

我們之前已經加過一些必須的參數了,我們看看GR需要的其他參數:

gtid-mode=on
enforce_gtid_consistency = ON #GTID模式是組複製的基礎技術
master_info_repository = TABLE 
relay_log_info_repository = TABLE #管理複製的元數據和恢復用,記錄同步的信息,便於管理和恢復
log-bin=row #必須是ROW格式
log_slave_updates = ON #需要記錄事務的binlog,用作以後的恢復用,哪怕不是寫入點,也需要

 

接下來我們要創建GR所使用的賬號:

set sql_log_bin=0;
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repl'@'%' IDENTIFIED BY '123456';
flush privileges;
set sql_log_bin=1;

 

我們先在主庫執行:

CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
set global group_replication_allow_local_disjoint_gtids_join=ON;
START GROUP_REPLICATION;

 

然後在SERVER2,和server3上執行:

INSTALL PLUGIN group_replication SONAME 'group_replication.so';
START GROUP_REPLICATION;

 

然後去看一下節點:

mysql> select * from performance_schema.replication_group_members;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    145
Current database: mxq

+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 096769f1-de4e-11e7-bc85-0050569355e1 | sdw1        |        3306 | ONLINE       |
| group_replication_applier | 6899e4bf-de91-11e7-a3bb-005056930bed | sdw2        |        3306 | ONLINE       |
| group_replication_applier | c6b0f3b3-de40-11e7-9dbd-0050569341db | mdw         |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)

 

我們可以通過查看MEMBER_STATE來確認節點的狀態:

online 
offline 離線
recoving 恢復中
unreachable 不可到達,查看錯誤日誌
error 同步發生錯誤,查看錯誤日誌

 

查看一下主節點是那個:

mysql> SELECT b.member_id, b.member_host, b.member_port  FROM performance_schema.global_status a   JOIN performance_schema.replication_group_members b 
    -> ON a.variable_value = b.member_id WHERE a.variable_name= 'group_replication_primary_member';
+--------------------------------------+-------------+-------------+
| member_id                            | member_host | member_port |
+--------------------------------------+-------------+-------------+
| c6b0f3b3-de40-11e7-9dbd-0050569341db | mdw         |        3306 |
+--------------------------------------+-------------+-------------+
1 row in set (0.00 sec)

 

我們可以看到現在主節點是SERVER1,GR當中所有的從節點都是預設為read_only的。我們也可以通過以下系統表來檢測GR的信息:

mysql> select * from performance_schema.replication_group_member_stats\G
*************************** 1. row ***************************
                      CHANNEL_NAME: group_replication_applier
                           VIEW_ID: 15181587863063562:15
                         MEMBER_ID: c6b0f3b3-de40-11e7-9dbd-0050569341db
       COUNT_TRANSACTIONS_IN_QUEUE: 0
        COUNT_TRANSACTIONS_CHECKED: 0
          COUNT_CONFLICTS_DETECTED: 0
COUNT_TRANSACTIONS_ROWS_VALIDATING: 0
TRANSACTIONS_COMMITTED_ALL_MEMBERS: 00e575aa-0cc0-11e8-9186-0050569341db:1-17
    LAST_CONFLICT_FREE_TRANSACTION: 
1 row in set (0.00 sec)

 

我們可以看到現在的三台機器是單主模式的,我們把他修改為多主模式的話怎麼改呢,但是我們強烈建議不要使用多主模式 ,因為多主模式下很容易hang住整個集群,而且很多的限制都是限制多主模式,如果我們要把單主修改為多主,只用做如下操作就好:

SERVER2,SERVER3:

STOP GROUP_REPLICATION;
SET GLOBAL group_replication_single_primary_mode=FALSE;
SET GLOBAL group_replication_enforce_update_everywhere_checks=TRUE;

SERVER1:

STOP GROUP_REPLICATION;
SET GLOBAL group_replication_single_primary_mode=FALSE;
SET GLOBAL group_replication_enforce_update_everywhere_checks=TRUE;
SET GLOBAL group_replication_bootstrap_group=on;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=off;

然後SERVER2,SERVER3:

SET GLOBAL group_replication_bootstrap_group=on;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=off;

 我們在查看一下節點信息:

mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 096769f1-de4e-11e7-bc85-0050569355e1 | sdw1        |        3306 | ONLINE       |
| group_replication_applier | 6899e4bf-de91-11e7-a3bb-005056930bed | sdw2        |        3306 | ONLINE       |
| group_replication_applier | c6b0f3b3-de40-11e7-9dbd-0050569341db | mdw         |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)

發現三個節點已經全部OK了,做一下測試:

SERVER1:

mysql> use mxq;
Database changed
mysql> create table gr(id int ,name  varchar(10),primary key(id));
Query OK, 0 rows affected (0.06 sec)

mysql> insert into gr(1,'a');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1,'a')' at line 1
mysql> insert into gr values(1,'a');
Query OK, 1 row affected (0.05 sec)

SERVER2:

mysql> insert into gr values(2,'a');
Query OK, 1 row affected (0.01 sec)

SERVER3:

mysql> insert into gr values(3,'a');
Query OK, 1 row affected (0.04 sec)

然後查看數據:

mysql> select * from gr;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | a    |
|  3 | a    |
+----+------+
3 rows in set (0.00 sec)

 

這樣就OK了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 升級10.13.2後,很多不會操作了, 那天把系統管理員設置成了普通管理,就不能打開個別軟體了, 賊尷尬~~~ 後來找blog才解決,現在分享下~~ http://www.cnblogs.com/ZZY0808/p/8430987.html 前因 今天不知怎麼就想把蘋果電腦原來的名字給改一下,於是就 ...
  • 1. JasperReport介紹 JasperReport 是一個開源的Java報表引擎,它不像其他的報表工具,例如Crystal報表是基於Java的,沒有自己的表達式語法。Jasper Reports有提供豐富的內容到屏幕上,到印表機,或轉換成PDF,HTML,XLS,RTF,ODT,CSV,T ...
  • 繼續上一個鏈接內容所講:http://www.cnblogs.com/linhaostudy/p/8430583.html 下麵bmp18x sensor為例進行分析。 BMP18x Sensor: 我們以打開bmp180為例,代碼為hardware\qcom\sensors\Bmp180.cpp: ...
  • 高通的HAL層其實分為兩種,一種是直接從kernel這邊報數據上來的,由sensor HAL層來監聽,另一種是走ADSP的模式,HAL層是通過qmi的形式進行監聽的; 走ADSP架構的可以看下麵的博客:http://blog.csdn.net/u011006622/article/details/5 ...
  • 1.從官網中下載apache-tomcat-**.tar.gz文件 2.在本地文件新建一個文件夾(tomcat),在文件夾中解壓壓縮包, 不需要使用root: 3.進入解壓文件中使用命令,將tomcat中的文件全部設置添加讀寫許可權: 4. 進入tomcat的conf文件夾下,找到tomcat-use ...
  • 1、切換用戶 命令:su - paytest,回車輸入密碼。 2、查看文件系統 命令:df -a (用於查看文件系統的使用情況) 命令:du -shx * (用於列出所有文件夾的大小) 命令:df -h 顯示已經掛載的分區列表 命令:ls -lSr |more 以尺寸大小排列文件和目錄 命令:du ...
  • 集群組成: 一臺主機,一臺從節點。 系統環境: 操作系統:CentOS 7,64位,7.4.1708(/etc/redhat-release中查看) CPU:AMD Fx-8300 8核 記憶體:8GB 硬碟:120GB GNOME:3.22.2 安裝版本: GPDB:V5.4.1 GPORCA:V2 ...
  • 高級查詢 關鍵字書寫順序 關鍵字執行順序select:投影結果 1 5 from:定位到表 2 1 where:分組前第一道過濾 3 2 group by:分組 4 3 having:分組後第二道過濾 5 4 order by:排序 6 6 limit: 最後 分頁 *目的:為了加快網站對數據的查詢 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...