1. 程式人生 > >mysql MGR叢集搭建

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清空日誌)