mysql MGR叢集搭建
一、環境
centos7 mysql5.7
二 MGR介紹
MySQL Group Replication(簡稱MGR)是MySQL官方於2016年12月推出的一個全新的高可用與高擴充套件的解決方案。MySQL組複製提供了高可用、高擴充套件、高可靠的MySQL叢集服務。
1)高一致性,基於原生複製及paxos協議的組複製技術,並以外掛的方式提供,提供一致資料安全保證;
2)高容錯性,只要不是大多數節點壞掉就可以繼續工作,有自動檢測機制,當不同節點產生資源爭用衝突時,不會出現錯誤,按照先到者優先原則進行處理,並且內建了自動化腦裂防護機制;
3)高擴充套件性,節點的新增和移除都是自動的,新節點加入後,會自動從其他節點上同步狀態,直到新節點和其他節點保持一致,如果某節點被移除了,其他節點自動更新組資訊,自動維護新的組資訊;
4)高靈活性,有單主模式和多主模式,單主模式下,會自動選主,所有更新操作都在主上進行;多主模式下,所有server都可以同時處理更新操作。
MGR是MySQL資料庫未來發展的一個重要方向。
MGR基礎結構要求:
1)引擎必須為innodb,因為需事務支援在commit時對各節點進行衝突檢查
2)每個表必須有主鍵,在進行事務衝突檢測時需要利用主鍵值對比
3)必須開啟binlog且為row格式
4)開啟GTID,且主從狀態資訊存於表中(--master-info-repository=TABLE 、--relay-log-info-repository=TABLE),--log-slave-updates開啟
5)一致性檢測設定--transaction-write-set-extraction=XXHASH64
MGR使用限制:
1)RP和普通複製binlog校驗不能共存,需設定--binlog-checksum=none
2)不支援gap lock(間隙鎖),隔離級別需設定為read_committed
3)不支援對錶進行鎖操作(lock /unlock table),不會發送到其他節點執行 ,影響需要對錶進行加鎖操作的情況,列入mysqldump全表備份恢復操作
4)不支援serializable(序列化)隔離級別
5)DDL語句不支援原子性,不能檢測衝突,執行後需自行校驗是否一致
不支援外來鍵:多主不支援,單主模式不存在此問題
最多支援9個節點:超過9臺server無法加入組
環境準備
2.1 資料庫伺服器規劃
序 號 |
IP地址 |
主機名 |
資料庫 |
埠 |
Server ID |
作業系統 |
1 |
10.10.10.68 |
Xuegod68 |
mysql-5.7.20 |
3306 |
100 |
CentOS7.4 |
2 |
10.10.10.69 |
Xuegod69 |
mysql-5.7.20 |
3306 |
101 |
CentOS7.4 |
3 |
10.10.10.70 |
Xuegod70 |
mysql-5.7.20 |
3306 |
102 |
CentOS7.4 |
2.2 安裝mysql5.7.20
安裝MySQL請參照之mysql5.7安裝
在這裡就不詳細介紹。
2.3 設定hostname和IP對映
在三臺資料庫伺服器上都設定:
注意檢查hostname與uname –n輸出的結果是否一致。
三 建立複製環境
伺服器xuegod68.cn
配置/etc/my.cnf
vim /etc/my.cnf
[mysqld]
# Group Replication
server_id = 100 #服務ID
gtid_mode = ON #全域性事務
enforce_gtid_consistency = ON #強制GTID的一致性
master_info_repository = TABLE #將master.info元資料儲存在系統表中
relay_log_info_repository = TABLE #將relay.info元資料儲存在系統表中
binlog_checksum = NONE #禁用二進位制日誌事件校驗
log_slave_updates = ON #級聯複製
log_bin = binlog #開啟二進位制日誌記錄
binlog_format= ROW #以行的格式記錄
transaction_write_set_extraction = XXHASH64 #使用雜湊演算法將其編碼為雜湊
loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212844f856' #加入的組名
loose-group_replication_start_on_boot = off #不自動啟用組複製叢集
loose-group_replication_local_address = 'xuegod68.cn:33061' #以本機埠33061接受來自組中成員的傳入連線
loose-group_replication_group_seeds =' xuegod68.cn:33061, xuegod69.cn:33062, xuegod70.cn:33063' #組中成員訪問表
loose-group_replication_bootstrap_group = off #不啟用引導組
重啟MySQL服務
伺服器xuegod68.cn上建立複製賬號:
mysql> set SQL_LOG_BIN=0; #停掉日誌記錄
mysql> grant replication slave on *.* to [email protected]'10.10.10.%' identified by '123456';
mysql> flush privileges;
mysql> set SQL_LOG_BIN=1; #開啟日誌記錄
mysql> change master to master_user='repl',master_password='123456' for channel 'group_replication_recovery'; #構建group replication叢集
在MySQL伺服器xuegod68.cn上安裝group replication外掛
-- 安裝外掛
mysql> install PLUGIN group_replication SONAME 'group_replication.so';
-- 檢視group replication元件
mysql> show plugins;
啟動伺服器xuegod68.cn上MySQL的group replication
-- 設定group_replication_bootstrap_group為ON是為了標示以後加入叢集的伺服器以這臺伺服器為基準,以後加入的就不需要設定。
mysql> set global group_replication_bootstrap_group=ON;
-- 作為首個節點啟動mgr叢集
mysql> start group_replication;
mysql> set global group_replication_bootstrap_group=OFF;
檢視mgr的狀態
-- 查詢表performance_schema.replication_group_members
mysql> select * from performance_schema.replication_group_members;
測試伺服器xuegod68.cn上的MySQL
mysql> create database test;
Query OK, 1 row affected (0.01 sec)
mysql> use test;
Database changed
mysql> create table t1 (id int primary key,name varchar(20)); #注意建立主鍵
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t1 values (1,'man');
Query OK, 1 row affected (0.01 sec)
複製組新增新例項xuegod69.cn
修改/etc/my.cnf 配置檔案,方法和之前相同
[mysqld]
# Group Replication
server_id = 101 #注意服務ID不一樣
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log_bin = binlog
binlog_format= ROW
transaction_write_set_extraction = XXHASH64
loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212844f856'
loose-group_replication_start_on_boot = off
loose-group_replication_local_address = 'xuegod69.cn:33062'
loose-group_replication_group_seeds = 'xuegod68.cn:33061, xuegod69.cn:33062, xuegod70.cn:33063'
loose-group_replication_bootstrap_group = off
重啟MySQL服務
3.2 使用者授權
mysql> set SQL_LOG_BIN=0; #停掉日誌記錄
mysql> grant replication slave on *.* to [email protected]'10.10.10.%' identified by '123456';
mysql> flush privileges;
mysql> set SQL_LOG_BIN=1; #開啟日誌記錄
mysql> change master to master_user='repl',master_password='123456' for channel 'group_replication_recovery'; #構建group replication叢集
安裝group replication外掛
mysql> install PLUGIN group_replication SONAME 'group_replication.so';
3.3 把例項添回到之前的複製組
mysql> set global group_replication_allow_local_disjoint_gtids_join=ON;
Query OK, 0 rows affected (0.00 sec)
mysql> start group_replication;
Query OK, 0 rows affected (6.65 sec)
在xuegod68.cn上檢視複製組狀態
mysql> select * from performance_schema.replication_group_members;
在新回的例項上檢視資料庫發現test庫和t1表已經同步
以同樣方法新增xuegod70.cn
這裡只給出配置檔案/etc/my.cnf:
[mysqld]
# Group Replication
server_id = 102 #注意服務id不一樣
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log_bin = binlog
binlog_format= ROW
transaction_write_set_extraction = XXHASH64
loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212844f856'
loose-group_replication_start_on_boot = off
loose-group_replication_local_address = 'xuegod70.cn:33063'
loose-group_replication_group_seeds ='xuegod68.cn:33061, xuegod69.cn:33062, xuegod70.cn:33063'
loose-group_replication_bootstrap_group = off
重啟mysql服務 然後參照第二個節點步驟操作加入組複製。
檢視複製組狀態
mysql> select * from performance_schema.replication_group_members;
以上單master節點的叢集就搭建完畢!
檢視叢集引數設定列表show variables like 'group_replication%';
multi-primary模式(多主master模式):
1、該模式啟用需設定兩個引數
group_replication_single_primary_mode=0 #這個引數很好理解,就是關閉單master模式
group_replication_enforce_update_everywhere_checks=1 #這個引數設定多主模式下各個節點嚴格一致性檢查
2、 預設啟動的都是單master模式,其他節點都設定了read_only、super_read_only這兩個引數,需要修改這兩個配置
3、 完成上面的配置後就可以執行多點寫入了,多點寫入會存在衝突檢查,這耗損效能挺大的,官方建議採用網路分割槽功能,在程式端把相同的業務定位到同一節點,儘量減少衝突發生機率。
由單主模式修改為多主模式方法
在原來單主模式的主節點執行操作如下:
stop GROUP_REPLICATION;
set global group_replication_single_primary_mode=off;
set global group_replication_enforce_update_everywhere_checks=ON;
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
而對於其他的節點,執行下面的操作即可。
stop GROUP_REPLICATION;
set global group_replication_allow_local_disjoint_gtids_join=ON;(即使含有組中不存在的事務,也允許當前server加入組)
set global group_replication_single_primary_mode=off;
set global group_replication_enforce_update_everywhere_checks=ON;
start group_replication;
直接搭建多主master模式
my.cnf配置檔案:
# Group Replication
server_id = 100 #服務ID
gtid_mode = ON #全域性事務
enforce_gtid_consistency = ON #強制GTID的一致性
master_info_repository = TABLE #將master.info元資料儲存在系統表中
relay_log_info_repository = TABLE #將relay.info元資料儲存在系統表中
binlog_checksum = NONE #禁用二進位制日誌事件校驗
log_slave_updates = ON #級聯複製
log_bin = binlog #開啟二進位制日誌記錄
binlog_format= ROW #以行的格式記錄
transaction_write_set_extraction = XXHASH64 #使用雜湊演算法將其編碼為雜湊
loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212844f856' #加入的組名
loose-group_replication_start_on_boot = off #不自動啟用組複製叢集
loose-group_replication_local_address = 'xuegod68.cn:33061' #以本機埠33061接受來自組中成員的傳入連線
loose-group_replication_group_seeds = 'xuegod68.cn:33061,xuegod69.cn:33062,xuegod70.cn:33063' #組中成員訪問表
loose-group_replication_bootstrap_group = off #不啟用引導組
group_replication_single_primary_mode = off #關閉單master模式
group_replication_enforce_update_everywhere_checks = ON #多主一致性檢查
如果日誌不一致(先停止叢集 reset master清空日誌)