一、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也是一種多主架構,如下圖所示:
要搭建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,增量資料傳輸
從上圖中可以看出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;
2、master2和master3節點分别檢視測試資料:
mysql> show databases;
mysql> show tables;
3、master2節點建立測試資料:
mysql> insert into tb(name) values('wangwu'),('zhaoliu');
4、master1和master3節點分别檢視測試資料:
5、master3節點建立測試資料:
mysql> insert into tb(name) values('jack'),('tom');
6、master1和master2節點分别檢視測試資料:
五、模拟新節點加入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
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
備注:master2節點在使用mysqldump對所有資料庫進行全量熱備時使用了“-F”選項,備份時會自動滾動二進制日志,是以此處指令中使用的二進制日志為mysql-bin.000001,Xid的值為最新的18
22、master2節點檢視grastate.dat檔案的内容,并将grastate.dat檔案複制至slave節點的對應目錄下:
# cat /var/lib/mysql/grastate.dat
Ø 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
備注:修改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節點