MGR——Mysql的組複製之多主模式

組複製可以在兩種模式下運行。

1.在單主模式下,組複製具有自動選主功能,每次只有一個 server成員接受更新。
2.在多主模式下,所有的 server 成員都可以同時接受更新.


組複製與異步主從複製區別.

1.傳統mysql主從複製,是在主節點執行和提交事務,然後把他們異步的發送到從節點,行復制的重新執行主節點的SQL語句,這是一個 shared-nothing 的系統,默認情況下所有 server 成員都有一個完整的數據副本。


wKioL1jktgWx5ScuAAEGdpm4tMo523.png


2.半同步複製,它在協議中添加了一個同步步驟。 這意味着主節點在提交時需要等待從節點確認它已經接收到事務。只有這樣,主節點才能繼續提交操作。


wKiom1jktgWDoZH8AAEfDzCqi7k234.png




3.MySQL 組複製實現了基於複製協議的多主更新。
1)複製組由多個 server成員構成,並且組中的每個 server 成員可以獨立地執行事務。但所有讀寫(RW)事務只有在衝突檢測成功後纔會提交。只讀(RO)事務不需要在衝突檢測,可以立即提交。

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

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

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

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




wKioL1jktgaB4I5sAAFeq364XR8050.png




下面展示,Mysql組複製之多主模式

server*:


組內每臺主機,都需要先安裝組複製插件.否則會導致啓動失敗.
mysql>INSTALL PLUGIN group_replication SONAME 'group_replication.so';


server* (33,44,55)


vim /etc/my.cnf

24 server_id=3
25 gtid_mode=ON
26 enforce_gtid_consistency=ON
27 master_info_repository=TABLE     
28 relay_log_info_repository=TABLE  
#此選項可以寫FILE(明文存儲在relay-log.info 不安全,推薦寫TABLE,存儲在mysql.slave_relay_log_info)
29 binlog_checksum=NONE #關閉binlog校驗
30 log_slave_updates=ON   
#當server爲slave時,要記錄數據改變到自己二進制日誌中,換句話說,是否讓他的slave同步其數據.
31 log_bin=binlog
32 binlog_format=ROW    #組複製依賴基於行的複製格式
33
34 transaction_write_set_extraction = XXHASH64    
#以便在server收集寫集合的同時將其記錄到二進制日誌。寫集合基於每行的主鍵,並且是行更改後的唯一標識此標識將用於檢測衝突。
35 group_replication_start_on_boot = OFF  #同下
36 group_replication_bootstrap_group = OFF 
#爲了避免每次啓動自動引導具有相同名稱的第二個組,所以設置爲OFF。
37 group_replication_group_name = "b6ddfda0-d8bc-4272-a58f-4ea75acbbc79"  #組的名字可以隨便起,但不能用主機的GTID
38 group_replication_local_address = '172.25.88.33:23306' #寫自己主機所在IP
39 group_replication_group_seeds = '172.25.88.33:23306,172.25.88.44:23306,172.25.88.55:2330'
40 #41,42行是開啓多主模式的參數
41 group_replication_single_primary_mode=FALSE
42 group_replication_enforce_update_everywhere_checks=TRUE


server33:


mysql>SET GLOBAL group_replication_bootstrap_group=ON; 
#這句只有server33,在第一次執行引導組的時候執行.
mysql> CREATE USER repl@'%';
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%' IDENTIFIED BY 'repl';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CHANGE MASTER TO MASTER_USER='repl',MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.27 sec)

mysql> set global group_replication_ip_whitelist="127.0.0.1/32,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,172.25.88.0/24";
Query OK, 0 rows affected (0.00 sec)

mysql> START GROUP_REPLICATION;                                                 Query OK, 0 rows affected (1.32 sec)

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+---------------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST         | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+---------------------+-------------+--------------+
| group_replication_applier | eb724b27-19b2-11e7-8c21-525400cef621 | server33.lalala.com |        3306 | ONLINE       |
+---------------------------+--------------------------------------+---------------------+-------------+--------------+
1 row in set (0.00 sec)


配置 group_replication_recovery 通道的恢復憑據


server44,55:


mysql> CHANGE MASTER TO MASTER_USER='repl',MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.56 sec)

mysql> set global group_replication_ip_whitelist="127.0.0.1/32,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,172.25.88.0/24";
Query OK, 0 rows affected (0.01 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (4.02 sec)

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+---------------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST         | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+---------------------+-------------+--------------+
| group_replication_applier | 8d5b8fa6-19a1-11e7-9641-52540042c9d3 | server44.lalala.com |        3306 | ONLINE       |
| group_replication_applier | c5070c7c-19a3-11e7-9c1d-5254008cd713 | server55.lalala.com |        3306 | ONLINE       |
| group_replication_applier | eb724b27-19b2-11e7-8c21-525400cef621 | server33.lalala.com |        3306 | ONLINE       |
+---------------------------+--------------------------------------+---------------------+-------------+--------------+
3 rows in set (0.00 sec)


檢驗

server33:


mysql> create database test;
Query OK, 1 row affected (0.15 sec)

mysql> use test;
Database changed
mysql>  CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
Query OK, 0 rows affected (0.94 sec)

mysql>  INSERT INTO t1 VALUES (1, 'lalala');
Query OK, 1 row affected (0.46 sec)

mysql> select * from t1;
+----+--------+
| c1 | c2     |
+----+--------+
|  1 | lalala |
+----+--------+
1 row in set (0.00 sec)


在server44,55 可以看見組複製,同步過來的數據


wKioL1jktgPhjNjmAADFMsG7IYM718.png



可以在performance_schema中看見組成員


wKiom1jktgSC_WujAACS_6Fw0Yw206.png



排錯


沒有設置白名單網段:需要添加自己所在網段.


報錯:'[GCS] The member is leaving a group without being on one.'

解決:set global group_replication_ip_whitelist="127.0.0.1/32,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,172.25.88.0/24"; START GROUP_REPLICATION;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章