MySQL Group Replication實踐
Group Replication直接翻譯過來就是組複製,是基於組的複製(Group-based Replication)技術,和galera集羣可以相提並論,在應用場景中可以實現高可用。
Replication-group(複製組)是由能夠相互通信的多個服務器(節點)組成的。一個Replication-group就是一組節點,每個節點都可以獨立執行事務,而讀寫事務則會在於group內的其他節點進行協調之後再commit。
2016年12月12日,在MySQL 5.7.17中,Group Replication GA。
下載最新的MySQL5.7.17版本,進行測試:
準備工作,GroupReplication有很多限制,需要將以下幾個參數加入到配置文件中。
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
transaction_write_set_extraction = XXHASH64
slave_parallel_type = LOGICAL_CLOCK
slave_preserve_commit_order = ON
也可以啓動後通過set global這種方式來設置,其中gtid_mode和enforce_gtid_consistency爲不可動態動態修改參數
$ mysqld --defaults-file=mysql4307.cnf --initialize-insecure #初始化數據庫並且不生成密碼
$ mysqld --defaults-file=mysql4307.cnf & #啓動數據庫
$ uuidgen #生成uuid,用作後面group_replication_name
929c33d5-bdd8-44fa-87be-ae9f8e96d0f2
在第一個節點上操作:
mysql> INSTALL PLUGIN group_replication SONAME "group_replication.so";
mysql> SET GLOBAL group_replication_group_name = "929c33d5-bdd8-44fa-87be-ae9f8e96d0f2”;
mysql> SET GLOBAL group_replication_local_address = "192.168.1.1:13306";
mysql> SET GLOBAL group_replication_bootstrap_group = ON; #只在第一個節點設置,集羣啓動後需要將該參數關閉
mysql> START GROUP_REPLICATION;
mysql> GRANT replication_slave on *.* to repl@’%’ identified by‘repl4slave’; FLUSH PRIVILEGES;
在第後續節點上操作:
mysql> INSTALL PLUGIN group_replication SONAME "group_replication.so";
mysql> SET GLOBAL group_replication_group_name = "929c33d5-bdd8-44fa-87be-ae9f8e96d0f2”;
mysql> SET GLOBAL group_replication_local_address = "192.168.1.2:13306";
mysql> SET GLOBAL group_replication_group_seeds = "192.168.1.1:13306";
mysql> CHANGE MASTER TO MASTER_USER="repl",MASTER_PASSWORD="repl4slave" FOR CHANNEL"group_replication_recovery";
mysql> START GROUP_REPLICATION;
如果無法啓動,請查看錯誤日誌,裏面說明的相關原因。
爲了方便,我們可以把參數寫入到配置文件中,可以省去多數配置步驟。
plugin-load = group_replication.so
group_replication_single_primary_mode = OFF
group_replication_start_on_boot = OFF
group_replication_group_name = "929c33d5-bdd8-44fa-87be-ae9f8e96d0f2”
group_replication_local_address = '10.11.8.39:24902'
group_replication_group_seeds = '10.11.8.38:24901,10.11.8.39:24901'
說明:
group_replication_single_primary_mode 是否只有一個主可寫,設置爲ON時,其它節點不可寫
group_replication_start_on_boot 是否在mysql啓動時同時啓動Group Replication
group_replication_bootstrap_group 是否爲Group Replication的引導節點,集羣中第一個節點需要設置爲ON來啓動Group Replication
經過測試,也是操作失誤,發現了一個問題,就是用CRT同時向2個實例中發送命令,drop database xxx,竟然2個實例中數據庫全部刪除,隨之就開始報錯,無法進行同步。同時也找出了在出錯時,沒有重要數據情況下或數據庫量少,快速恢復但爲集羣的辦法(請勿在生產環境中使用,後果自負)。
mysql> stop group_replication;
mysql> reset master;
mysql> start group_replication;
$ mysql < backup.sql