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 進行註釋
實驗:
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已重新加入組
查看數據,發現數據已同步