天天看點

CentOS 7.6建構MySQL PXC高可用叢集

一、Percona XtraDB Cluster相關概念及原理:

1、Percona XtraDB Cluster簡介:

Percona XtraDB Cluster是基于Galera協定的MySQL高可用叢集架構。Galera是Codership提供的多主資料同步複制機制,具有高可用性,友善擴充,可以實作多個MySQL節點間的資料同步複制以及讀寫,并且可保障資料庫的服務高可用及資料一緻性。基于Galera的高可用方案主要有MariaDB Galera Cluster和Percona XtraDB Cluster(簡稱PXC)。PXC屬于一套近乎完美的MySQL高可用叢集解決方案,相比那些傳統的基于主從複制模型的叢集架構MHA和MM+Keepalived,Galera Cluster最突出的特點就是解決了诟病已久的資料複制延遲問題,基本上可以達到實時同步,而且節點與節點之間,它們互相的關系是對等的。本身Galera Cluster也是一種多主架構,如下圖所示:

CentOS 7.6建構MySQL PXC高可用叢集
CentOS 7.6建構MySQL PXC高可用叢集

要搭建PXC架構至少需要3個MySQL執行個體來組成一個叢集,3個執行個體之間不是主從模式,而是各自為主,是以三者是對等關系,不分從屬,這就叫multi-master架構。用戶端寫入和讀取資料時,連接配接哪個執行個體都是一樣的,讀取到的資料也都是相同的,寫入任意一個執行個體之後,叢集自身會将新寫入的資料同步到其它執行個體上,這種架構不共享任何資料,是一種高備援架構。

2、PXC原理:

PXC最常使用如下4個端口号:

(1)3306:資料庫對外服務的端口号

(2)4444:請求SST的端口号

(3)4567:組成員之間進行溝通的端口号

(4)4568:用于傳輸IST的端口号

備注:

Ø  SST:State Snapshot Transfer,全量資料傳輸

Ø  IST:Incremental State Transfer,增量資料傳輸

CentOS 7.6建構MySQL PXC高可用叢集

從上圖中可以看出PXC的操作流程,首先用戶端發起一個事務,該事務先在本地執行,執行完成後發起對事務的送出操作。在送出之前需要将産生的複制寫集廣播出去,然後擷取到一個全局的事務ID号,一并傳送到另一節點上。通過驗證合并資料之後,發現沒有沖突資料,執行apply_cb和commit_cb操作,否則就需要取消(discard)此次事務的操作。而目前server節點通過驗證之後,執行送出操作,并傳回OK,如果驗證沒通過,則執行復原。當然在生産中至少要有三個節點的叢集環境,如果其中有一個節點沒有驗證通過,出現了資料沖突,那麼此時采取的方式就是将出現不一緻的節點踢出叢集環境,而且它自己會執行shutdown指令,自動關機。

3、PXC架構的優缺點:

(1)優點:

a、實作MySQL叢集架構的高可用性和資料強一緻性

b、實作真正的多節點讀寫叢集方案

c、改善了傳統意義上的主從複制延遲問題,基本上達到了實時同步

d、新加入的節點可以自動部署,無需提供手動備份,維護友善

e、多節點寫入,資料庫故障切換容易

(2)缺點:

a、隻支援InnoDB引擎,其它存儲引擎的更改不複制,DDL語句在statement級别被複制,并且對mysql.*表的更改會基于此被複制,例如:CREATE USER...語句會被複制,但INSERT INTO mysql.user...語句則不會被複制,可通過wsrep_replicate_myisam參數開啟MyISAM存儲引擎的複制,但這隻是一個實驗性的參數

b、新加入節點采用SST時的代價高

c、存在寫擴大問題

d、任何更新事務都需要全局驗證通過,才會在每個節點庫上執行,叢集性能/吞吐量受限于性能最差的節點,也就是經常說的短闆效應

e、由于需要保證資料的一緻性,是以在多節點并發寫時,鎖沖突及死鎖問題比較嚴重

f、所有表必須含有主鍵

g、不支援LOCK TABLE等顯式表級别的鎖定操作

h、不支援XA

4、PXC中涉及到的重要概念和核心參數:

(1)叢集中節點的數量:整個叢集中節點數量應該控制在最少3個、最多8個的範圍内。最少3個節點是為了防止出現腦裂現象,因為隻有在2個節點下才會出現此現象。腦裂現象的标志就是輸入任何指令,傳回的結果都是unknown command。節點在叢集中,會因新節點的加入或故障、同步失效等原因發生狀态的切換。

(2)節點狀态的變化階段:

a、open:節點啟動成功,嘗試連接配接到叢集時的狀态

b、primary:節點已處于叢集中,在新節點加入并選取donor進行資料同步時的狀态

c、joiner:節點處于等待接收同步檔案時的狀态

d、joined:節點完成資料同步工作,嘗試保持和叢集進度一緻時的狀态

e、synced:節點正常提供服務時的狀态,表示已經同步完成并和叢集進度保持一緻

f、donor:節點處于為新加入的節點提供全量資料時的狀态

備注:donor節點就是資料的貢獻者,如果一個新節點加入叢集,此時又需要大量資料的SST資料傳輸,就有可能是以而拖垮整個叢集的性能,是以在生産環境中,如果資料量較小,還可以使用SST全量資料傳輸,但如果資料量很大就不建議使用這種方式,可以考慮先建立主從關系,然後再加入叢集。

(3)節點的資料傳輸方式:一種叫SST全量資料傳輸,另一種叫IST增量資料傳輸。SST資料傳輸有xtrabackup、mysqldump和rsync三種方式,而增量資料傳輸就隻有一種方式xtrabackup,但生産環境中一般資料量較小時,可以使用SST全量資料傳輸,但也隻使用xtrabackup方法。

(4)GCache子產品:在PXC中一個特别重要的子產品,它的核心功能就是為每個節點緩存目前最新的寫集。如果有新節點加入進來,就可以把新資料的增量傳遞給新節點,而不需要再使用SST傳輸方式,這樣可以讓節點更快地加入叢集中,涉及如下參數:

a、gcache.size:緩存寫集增量資訊的大小,它的預設大小是128MB,通過wsrep_provider_options參數設定,建議調整為2GB~4GB範圍,足夠的空間便于緩存更多的增量資訊。

b、gcache.mem_size:GCache中記憶體緩存的大小,适度調大可以提高整個叢集的性能

c、gcache.page_size:如果記憶體不夠用(GCache不足),就直接将寫集寫入磁盤檔案中

二、準備工作(如無特殊說明,3個節點都需要執行如下操作):

1、示範環境:

IP

作業系統

主機名

角色

資料庫版本

安裝方式

192.168.1.143

CentOS   7.6 x86_64

node1

master1

5.7.25-28-57-log   Percona XtraDB Cluster

yum

192.168.1.144

node2

master2

192.168.1.145

node3

master3

2、關閉SELinux和firewalld

3、配置epel源

4、配置伺服器時間同步

5、配置主機名

6、配置/etc/hosts檔案:

# vim /etc/hosts

192.168.1.143 node1

192.168.1.144 node2

192.168.1.145 node3

三、yum方式安裝配置PXC(如無特殊說明,3個節點都需要執行如下操作):

1、安裝percona yum源:# yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

2、測試percona yum源:# yum list | grep -i percona

3、安裝PXC:# yum -y install Percona-XtraDB-Cluster-57

備注:安裝後生成的比較重要的配置檔案

Ø  /etc/percona-xtradb-cluster.conf.d/mysqld.cnf

Ø  /etc/percona-xtradb-cluster.conf.d/mysqld_safe.cnf

Ø  /etc/percona-xtradb-cluster.conf.d/wsrep.cnf

4、建立軟連結:

# mv /etc/my.cnf /etc/my.cnf.bak

# update-alternatives --install /etc/my.cnf my.cnf "/etc/percona-xtradb-cluster.cnf" 200

5、master1節點修改mysqld.cnf配置檔案:

# vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf

[mysqld]

server-id=1

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

log_bin=mysql-bin

log_bin_index=mysql-bin.index

log_slave_updates

expire_logs_days=7

symbolic-links=0

port=3306

lower_case_table_names=1

character_set_server=utf8mb4

collation_server=utf8mb4_general_ci

innodb_file_per_table=1

skip_name_resolve=1

slow_query_log=1

slow_query_log_file=mysql-slow.log

Ø  master2節點中的server-id=2,master3節點中的server-id=3

Ø  盡管Galera Cluster不再需要通過binlog的形式進行同步,但還是建議在配置檔案中開啟二進制日志功能,原因是後期如果有新節點需要加入,老節點通過SST全量傳輸的方式向新節點傳輸資料,很可能會拖垮叢集性能,是以讓新節點先通過binlog方式完成同步後再加入叢集會是一種更好的選擇

6、master1節點修改wsrep.cnf配置檔案:

# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf

wsrep_provider=/usr/lib64/galera3/libgalera_smm.so

wsrep_provider_options="gcache.size=2G"

wsrep_cluster_address="gcomm://192.168.1.143,192.168.1.144,192.168.1.145"

binlog_format=ROW

default_storage_engine=InnoDB

wsrep_slave_threads=8

wsrep_log_conflicts

innodb_autoinc_lock_mode=2

wsrep_node_address=192.168.1.143

wsrep_cluster_name=pxc-cluster

wsrep_node_name=node1

pxc_strict_mode=ENFORCING

wsrep_sst_method=xtrabackup-v2

wsrep_sst_auth="sstuser:s3cretPass"

常用配置參數說明:

(1)wsrep_provider:Galera庫的路徑和檔案名

(2)wsrep_provider_options:Galera庫的額外參數

(3)wsrep_cluster_address:叢集中各節點IP

(4)binlog_format:二進制日志的記錄格式

(5)default_storage_engine:預設使用的存儲引擎

(6)wsrep_slave_threads:使用的從屬線程個數

(7)wsrep_node_address:本節點IP

(8)wsrep_cluster_name:叢集名稱

(9)wsrep_node_name:本節點在叢集中的名稱

(10)wsrep_sst_method:SST傳輸資料的方式,有xtrabackup、mysqldump和rsync三種,前兩者在傳輸時都需要對donor加全局隻讀鎖(FLUSH TABLES WITH READ LOCK),而xtrabackup則不需要(它使用percona自己提供的backup lock),強烈推薦使用xtrabackup-v2方式

(11)wsrep_sst_auth:在SST傳輸時需要使用的認證憑據,格式為“使用者:密碼”

Ø  master2節點中的wsrep_node_address=192.168.1.144,wsrep_node_name=node2

Ø  master3節點中的wsrep_node_address=192.168.1.145,wsrep_node_name=node3

7、初始化MySQL資料:# mysqld --initialize --user=mysql

備注:確定初始化前/var/lib/mysql目錄為空,初始化完成後會在此目錄中生成各類檔案

8、master1節點啟動MySQL服務:

# systemctl start [email protected]

# ss -tunlp | grep mysqld

# systemctl enable [email protected]

# systemctl status [email protected]

# tail -100 /var/log/mysqld.log

9、master1節點配置MySQL安全向導:

# grep "password" /var/log/mysqld.log --> sIw4lWaqXy+X

# mysql_secure_installation

10、master1節點授權root使用者遠端登入和建立PXC傳輸使用者sstuser:

# mysql -uroot -p

mysql> create user 'root'@'192.168.1.%' identified by '123456';

mysql> grant all on *.* to 'root'@'192.168.1.%';

mysql> flush privileges;

mysql> create user 'sstuser'@'localhost' identified by 's3cretPass';

mysql> grant reload, lock tables, process, replication client on *.* to 'sstuser'@'localhost';

備注:之後的MySQL版本将不支援grant授權的同時建立使用者,而是需要先建立使用者,再進行授權

11、master2和master3節點分别啟動MySQL服務:

# systemctl start mysql.service

# systemctl enable mysql.service

# systemctl status mysql.service

備注:master2和master3節點無需分别配置MySQL安全向導,也無需分别授權root使用者遠端登入,已從master1節點處同步

12、檢視PXC叢集狀态:

mysql> show global status like 'wsrep%';

常用PXC叢集狀态監控名額說明:

(1)wsrep_local_state_uuid:與wsrep_cluster_state_uuid的值一緻,且所有節點該值都相同

(2)wsrep_cluster_state_uuid:所有節點該值都相同,如果有不同值的節點,說明該節點沒有與叢集建立連接配接

(3)wsrep_last_committed:叢集已經送出事務的數量,是一個累計值,所有節點該值都相同,如果出現不一緻,說明事務有延遲,可以用來計算延

(4)wsrep_replicated:從本節點複制出去的寫集數量,wsrep_replicated_bytes為寫集的總位元組數,可以用于參考節點間的負載均衡是否平衡,該值較大的節點較為繁忙

(5)wsrep_received:與wsrep_replicated對應,本節點接收來自其它節點的寫集數量

(6)wsrep_local_state:所有節點該值都應該為4,表示正常,節點狀态有如下6個取值

     a、取值1:節點啟動并與叢集建立連接配接

     b、取值2:當節點成功執行狀态傳輸請求時,該節點開始緩存寫集

          c、取值3:節點接收了SST全量資料傳輸,該節點現在擁有所有叢集資料,并開始應用已緩存的寫集

     d、取值4:節點完成與叢集資料的同步,它的從屬隊列現在是空的,并啟用流控使其保持為空

     e、取值5:節點接收了狀态傳輸請求,該節點現在對donor不執行流控,該節點已緩存所有的寫集但無法應用

     f、取值6:節點完成對joiner節點的狀态傳輸

(7)wsrep_incoming_addresses:叢集中所有節點的IP,且每個節點該值都相同

(8)wsrep_cluster_size:叢集中的節點數量,所有節點該值都相同

(9)wsrep_cluster_conf_id:所有節點該值都相同,如果值不同,說明該節點被臨時“分區”了

(10)wsrep_cluster_status:叢集組成的狀态,所有節點該值都為“Primary”,如果該值不為“Primary”,說明該節點出現“分區”或“腦裂”現象

(11)wsrep_connected:所有節點該值都為“ON”,表示本節點已經與叢集建立連接配接

(12)wsrep_ready:所有節點該值都為“ON”,表示本節點可以正常提供服務

四、測試PXC:

1、master1節點建立測試資料:

mysql> create database db;

mysql> use db;

mysql> create table tb(id int unsigned auto_increment primary key not null,name char(20) not null);

mysql> desc tb;

mysql> insert into tb(name) values('zhangsan'),('lisi');

mysql> select * from tb;

CentOS 7.6建構MySQL PXC高可用叢集

2、master2和master3節點分别檢視測試資料:

mysql> show databases;

mysql> show tables;

CentOS 7.6建構MySQL PXC高可用叢集

3、master2節點建立測試資料:

mysql> insert into tb(name) values('wangwu'),('zhaoliu');

CentOS 7.6建構MySQL PXC高可用叢集

4、master1和master3節點分别檢視測試資料:

CentOS 7.6建構MySQL PXC高可用叢集

5、master3節點建立測試資料:

mysql> insert into tb(name) values('jack'),('tom');

CentOS 7.6建構MySQL PXC高可用叢集

6、master1和master2節點分别檢視測試資料:

CentOS 7.6建構MySQL PXC高可用叢集

五、模拟新節點加入PXC:

将一個新節點加入PXC叢集,需要SST全量資料傳輸,很有可能拖垮叢集整體性能,可以考慮讓新節點先成為PXC叢集中某個節點(此處以master2節點為例)的從節點,然後線上快速通過IST方式加入叢集。

192.168.1.146

CentOS 7.6 x86_64

node4

slave

5.7.25-28-57-log Percona XtraDB Cluster

2、slave節點關閉SELinux和firewalld、配置epel源、配置伺服器時間同步、配置主機名

3、四個節點配置/etc/hosts檔案:

192.168.1.146 node4

4、slave節點安裝percona yum源:# yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

5、slave節點安裝PXC:# yum -y install Percona-XtraDB-Cluster-57

6、slave節點建立軟連結:

7、slave節點修改mysqld.cnf配置檔案:

server-id=4

relay_log=relay-log

relay_log_index=relay-log.index

read_only=1

8、slave節點暫時不啟用PXC的相關配置:# cd /etc/percona-xtradb-cluster.conf.d  # mv wsrep.cnf wsrep.cnf.bak

9、slave節點初始化MySQL資料:# mysqld --initialize --user=mysql

10、slave節點啟動MySQL服務:

11、slave節點配置MySQL安全向導:

# grep "password" /var/log/mysqld.log --> 7gk0ti?jf*(M

12、slave節點授權root使用者遠端登入:

13、master2節點建立具有複制權限的使用者repluser:

mysql> create user 'repluser'@'192.168.1.%' identified by '123456';

mysql> grant replication slave on *.* to 'repluser'@'192.168.1.%';

14、master2節點使用mysqldump對所有資料庫進行全量熱備,并将導出的sql檔案複制至slave節點:

# mkdir -pv /backup

# mysqldump -E -F -R -q --single-transaction --master-data=2 -A -uroot -p > /backup/all_`date +%F`.sql

# less /backup/all_2019-06-06.sql,找到已被注釋的CHANGE MASTER TO語句:

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=154;

# scp -p /backup/all_2019-06-06.sql node4:/backup/

15、slave節點還原資料:

mysql> show variables like 'sql_log_bin';

mysql> set sql_log_bin=0;

mysql> source /backup/all_2019-06-06.sql

mysql> set sql_log_bin=1;

16、slave節點使用具有複制權限的使用者連接配接至master2:

mysql> change master to master_host='192.168.1.144',master_user='repluser',master_password='123456',master_port=3306,master_log_file='mysql-bin.000002',master_log_pos=154;

mysql> start slave;

mysql> show slave status\G

CentOS 7.6建構MySQL PXC高可用叢集

17、slave節點停止MySQL服務:

# systemctl stop mysql.service

18、slave節點注釋/etc/percona-xtradb-cluster.conf.d/mysqld.cnf的[mysqld]配置段中read_only=1選項

19、slave節點啟用PXC的相關配置:# cd /etc/percona-xtradb-cluster.conf.d  # mv wsrep.cnf.bak wsrep.cnf

20、slave節點修改wsrep.cnf配置檔案:

wsrep_cluster_address="gcomm://192.168.1.143,192.168.1.144,192.168.1.145,192.168.1.146"

wsrep_node_address=192.168.1.146

wsrep_node_name=node4

21、master2節點确認PXC需要同步的位置:# mysqlbinlog /var/lib/mysql/mysql-bin.000001 | grep Xid

CentOS 7.6建構MySQL PXC高可用叢集

備注:master2節點在使用mysqldump對所有資料庫進行全量熱備時使用了“-F”選項,備份時會自動滾動二進制日志,是以此處指令中使用的二進制日志為mysql-bin.000001,Xid的值為最新的18

22、master2節點檢視grastate.dat檔案的内容,并将grastate.dat檔案複制至slave節點的對應目錄下:

# cat /var/lib/mysql/grastate.dat

CentOS 7.6建構MySQL PXC高可用叢集

Ø  uuid:叢集中wsrep_cluster_state_uuid的值

Ø  seqno:叢集中swrep_last_committed的值,根據此值可以直接判斷下次節點啟動時做增量傳輸的位置,目前master2節點處于正常運作的狀态,是以值為-1

# scp -p /var/lib/mysql/grastate.dat node4:/var/lib/mysql/

23、slave節點修改grastate.dat檔案的屬主屬組為mysql使用者:# chown mysql.mysql /var/lib/mysql/grastate.dat

24、slave節點設定同步開始位置:# vim /var/lib/mysql/grastate.dat

CentOS 7.6建構MySQL PXC高可用叢集

備注:修改seqno的值,将seqno: -1修改為剛才擷取的position 1967對應Xid的值18,這就是PXC同步開始的位置

25、slave節點啟動MySQL服務:

26、slave節點停止主從複制:

mysql> stop slave;

27、檢視PXC叢集狀态:

(2)wsrep_cluster_state_uuid:所有節點該值都相同

(3)wsrep_last_committed:所有節點該值都相同

(4)wsrep_local_state:所有節點該值都應該為4,表示正常

(5)wsrep_incoming_addresses:叢集中所有節點的IP(192.168.1.143~146),且每個節點該值都相同

(6)wsrep_cluster_size:叢集中的節點數量,所有節點該值都相同

(7)wsrep_cluster_conf_id:所有節點該值都相同

(8)wsrep_cluster_status:叢集組成的狀态,所有節點該值都為“Primary”

(9)wsrep_connected:所有節點該值都為“ON”,表示本節點已經與叢集建立連接配接

(10)wsrep_ready:所有節點該值都為“ON”,表示本節點可以正常提供服務

28、新叢集中無論哪個節點寫入資料,都會複制給其它三個節點

六、模拟PXC中某個節點故障并恢複:

1、master3節點停止MySQL服務:

2、檢視PXC叢集狀态:

(1)wsrep_incoming_addresses:目前叢集中所有節點的IP(143、144、146),且每個節點該值都相同

(2)wsrep_cluster_size:叢集中的節點數量(3),所有節點該值都相同

3、叢集剩餘節點中無論哪個節點寫入資料,都會複制給其它兩個節點

4、master3節點修改wsrep.cnf配置檔案:

5、master3節點啟動MySQL服務:

6、檢視PXC叢集狀态:

備注:叢集已恢複正常

7、當機時在其它可用節點中寫入的資料,已複制給master3節點

繼續閱讀