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