1. 程式人生 > >mysql的組復制

mysql的組復制

MGR 搭建 測試

mysql的組復制

先說說數據庫復制的各種形式

異步復制模式下,Master上執行事務產生 binlog,slave 通過連接 master 抓取 binlog 的內容接收到本地的 relaylog 上,然後 apply 對應的事務,產生 slave 服務器上自身的 binlog(由--log-slave-update 參數決定)。流程圖如下:

技術分享圖片

其次是半同步復制,流程圖如下

技術分享圖片

異步復制模式下,如果 slave 全部宕機,則在 master 上的事務無法同步到 slave 上,存在一定的數據安全風險。


半 同步復制解決了數據安全風險的問題,在半同步環境下要求至少有一臺 slave 接收到 master 的binlog並成功寫入到本地的 relaylog, master 上的事務才可以成功提交,這樣對主庫的事務提交速度會產生一定影響,半同步在數據安全和數據庫性能兩者之間做了一個中和。


在實際使用過程中,可以通過配置參數(rpl_semi_sync_master_timeout 單位是毫秒,默認為10000,即10s)設定若 slave 在多長時間沒有ack返回,同步模式由半同步自動修改為異步同步模式。


組復制分單主模式和多主模式,mysql 的復制技術僅解決了數據同步的問題,如果 master 宕機,意味著數據庫管理員需要介入,應用系統可能需要修改數據庫連接地址或者重啟才能實現。

技術分享圖片


組復制的特點:

● 高一致性

基於原生復制及 paxos 協議的組復制技術,並以插件的方式提供,提供一致數據安全保證;


● 高容錯性

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


● 高擴展性

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


● 高靈活性

有單主模式和多主模式,單主模式下,會自動選主,所有更新操作都在主上進行;

多主模式下,所有 server 都可以同時處理更新操作。


目前組復制最多支持一個組中有 9 個 server

做組復制時,註意做好解析/etc/hosts,關閉密碼插件,在 /etc/my.conf 中寫入,

validate_password=OFF
或是在vim /etc/init.d/mysqld 進行註釋
[object Object]


實驗:

server1 192.168.122.11

server2 192.168.122.12

server3 192.168.122.13


一、配置文件

/etc/my.cnf

server2,3的配置文件區別僅在於 server-id 與 local_address

技術分享圖片

復制框架

設置將 server 配置為使用唯一標識號 1,以啟用全局事務標識符,並將復制元數據存儲在系統表(而不是文件)中。 此外,它設置 server 打開二進制日誌記錄,使用基於行的格式並禁用二進制日誌事件校驗和。


組復制設置

技術分享圖片

第 1 行指示 server 必須為每個事務收集寫集合,並使用 XXHASH64 哈希算法將其編碼為散列。

第 2 行告知插件,正在加入或創建的組要命名為“aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa”。

第 3 行指示插件在 server 啟動時不自動啟動組復制。

第 4 行告訴插件使用 本地主機或IP 地址 127.0.0.1 ,端口 24091 用於接受來自組中其他成員的傳入連接。

第 5 行告訴插件,當下面這些 server 需要加入組時,應該連接到這些主機和端口上訪問他們,這些就是種子成員。

第 6 行指示插件是否自動引導組。此選項在任何時候只能在一個 server 實例上使用,通常是首次引導組時(或在整個組被崩潰然後恢復的情況下)。 如果您多次引導組,例如,當多個 server 實例設置了此選項,則它們可能會人為地造成腦裂的情況,其中存在兩個具有相同名稱的不同組。 在第一個server 實例加入組後禁用此選項。


二、數據庫配置


1.用戶憑據

分布式恢復過程依賴於 group_replication_recovery 復制通道,該復制通道用於在組成員之間傳輸事務。 因此,需要設置具有正確權限的復制用戶,以便組復制可以直接建立成員到成員的恢復復制通道。

mysql> SET SQL_LOG_BIN=0; 關閉二進制日誌

mysql> grant replication slave on *.* to rpl_user@'%' identified by 'LH=liuhuan123'; 創建 rpl_user 用戶並且授權使之可以進行復制功能

mysql> flush privileges;

mysql> SET SQL_LOG_BIN=1; 開啟二進制日誌

mysql> change master to master_user='rpl_user',master_password='LH=liuhuan123' for channel 'group_replication_recovery'; 下次需要從其他成員恢復其狀態時,使用 group_replication_recovery 復制通道的給定憑據.。


2.啟動組復制


mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; 安裝插件

mysql> SET GLOBAL group_replication_bootstrap_group=ON; server1引導組,啟動組復制程序,只用在組復制成員中執行一次即可。不可將此參數寫在配置文件中,因為在下一次啟動組復制時,會有兩個不同的組有相同的名稱。

mysql> START GROUP_REPLICATION; 啟動 server1的組復制

mysql> SET GLOBAL group_replication_bootstrap_group=OFF; 將引導組復制的程序關閉,其余成員直接加入該組即可。


mysql> SELECT * FROM performance_schema.replication_group_members; 查看

技術分享圖片



三、向組中添加實例


server2端

mysql> SET SQL_LOG_BIN=0;
mysql> grant replication slave on *.* to rpl_user@'%' identified by 'LH=liuhuan123';
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user',MASTER_PASSWORD='LH=liuhuan123' for CHANNEL 'group_replication_recovery';

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; 安裝插件

mysql> start group_replication; 將 server2 添加到組

技術分享圖片

查日誌得:

技術分享圖片


上網查找(網站 bing.com)

技術分享圖片


技術分享圖片

server3同理,查看mysql> SELECT * FROM performance_schema.replication_group_members;


技術分享圖片


四、高可用驗證


1、驗證數據寫入

server1端,寫入數據

技術分享圖片

server2,3端查看

技術分享圖片


2、模擬宕機一個節點驗證


關閉server2

技術分享圖片

技術分享圖片

在server1寫入數據

技術分享圖片

啟動server2

技術分享圖片

再次查看組成員,發現server2已重新加入組

技術分享圖片


查看數據,發現數據已同步

技術分享圖片




mysql的組復制