在CentOS8下搭建PXC集羣

PXC簡介

PXC是Percona XtraDB Cluster的縮寫,是 Percona 公司出品的免費MySQL集羣產品。PXC的作用是通過mysql自帶的Galera集羣技術,將不同的mysql實例連接起來,實現多主集羣。在PXC集羣中每個mysql節點都是可讀可寫的,也就是主從概念中的主節點,不存在只讀的節點。

PXC實際上是基於Galera的面向OLTP的多主同步複製插件,PXC主要用於解決MySQL集羣中數據同步強一性問題。PXC可以集羣任何mysql的衍生版本,例如MariaDB和Percona Server。由於Percona Server的性能最接近於mysql企業版,性能相對於標準版的mysql有顯著的提升,並且對mysql基本兼容。所以在搭建PXC集羣時,通常建議基於Percona Server進行搭建。

關於數據庫集羣方案的選擇可以參考:

PXC的特點

  • 同步複製,事務在所有集羣節點要麼全部提交完成,要麼全部失敗
  • 多主複製,不存在主從角色的劃分,可以在任意一個節點進行讀/寫操作
  • 數據同步的強一致性,所有節點的數據是實時一致的
  • PXC集羣節點越多,數據同步的速度就越慢,所以PXC集羣的規模不能太大
  • PXC集羣數據同步的速度取決於配置最低的節點,所以PXC集羣中所有節點的硬件配置儘量保持一致
  • PXC集羣只支持InnoDB引擎,所以只有InnoDB引擎的數據纔會被同步

安裝PXC並組建集羣

環境準備

環境版本說明:

  • VMware Workstation Pro 15.5
  • Percona XtraDB Cluster 5.7
  • CentOS 8

MySQL有幾個常見的衍生版,Percona Server就是其一。這裏選擇Percona Server是因爲它是最接近於企業版的MySQL。各衍生版的對比圖如下:
在CentOS8下搭建PXC集羣

本文的PXC集羣設計如圖:
在CentOS8下搭建PXC集羣

  • Tips:實際上最小的PXC集羣是兩個節點的,但課程中設計爲三個節點。這是因爲PXC集羣爲了防止腦裂,在一半以上的節點因意外宕機無法訪問時,PXC集羣就會自動停止運行。所以如果設計爲兩個節點,其中一個節點掛掉了就滿足半數以上節點無法訪問,那麼集羣就會停止運行,而另一個節點也就無法使用了。這樣的容災性太差,所以這裏設計爲至少三個節點,以提高PXC集羣的可用性。

根據該圖,我們需要創建三個虛擬機來搭建一個三節點的PXC集羣:
在CentOS8下搭建PXC集羣

節點說明:

Node Host IP
Node1 PXC-Node1 192.168.190.132
Node2 PXC-Node2 192.168.190.133
Node3 PXC-Node3 192.168.190.134

每個虛擬機的配置如下圖:
在CentOS8下搭建PXC集羣

關於 PXC 集羣是以犧牲性能來保證數據的強一致性問題。PXC 集羣中的節點越多就意味着數據同步的時間就越長,那麼應該用幾臺數據庫服務器來做集羣最合適,相對來說算是能達到一個性能上最優的結果呢 ?

通常來說不超過15臺節點組成一個PXC集羣,性能上很好,多了就不行。然後這個PXC集羣作爲一個分片,MyCat上多設置幾個分片,就能應對數據切分和併發訪問了


系統準備

有些 CentOS 版本默認捆綁了mariadb-libs,在安裝PXC之前需要先將其卸載:

[root@PXC-Node1 ~]# yum -y remove mari*

PXC集羣要使用四個端口:

端口 描述
3306 MySQL服務端口
4444 請求全量同步(SST)端口
4567 數據庫節點之間的通信端口
4568 請求增量同步(IST)端口

所以如果系統啓用了防火牆則需要開放這些端口:

[root@PXC-Node1 ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
[root@PXC-Node1 ~]# firewall-cmd --zone=public --add-port=4444/tcp --permanent
[root@PXC-Node1 ~]# firewall-cmd --zone=public --add-port=4567/tcp --permanent
[root@PXC-Node1 ~]# firewall-cmd --zone=public --add-port=4568/tcp --permanent
[root@PXC-Node1 ~]# firewall-cmd --reload

安裝PXC

先上官方文檔:

PXC有兩種較爲簡單的安裝方式,一是到官網下載rpm包到系統本地進行安裝,二是使用官方提供的yum倉庫進行在線安裝。本文演示的是本地安裝這種方式,首先打開如下網址:

選擇相應的版本後,複製下載鏈接:
在CentOS8下搭建PXC集羣

然後到CentOS上使用wget命令進行下載,如下示例:

[root@PXC-Node1 ~]# cd /usr/local/src
[root@PXC-Node1 /usr/local/src]# wget https://www.percona.com/downloads/Percona-XtraDB-Cluster-LATEST/Percona-XtraDB-Cluster-5.7.28-31.41/binary/redhat/8/x86_64/Percona-XtraDB-Cluster-5.7.28-31.41-r514-el8-x86_64-bundle.tar

創建存放rpm文件的目錄,並將下載好的PXC安裝包解壓縮到新建的目錄中:

[root@PXC-Node1 /usr/local/src]# mkdir pxc-rpms
[root@PXC-Node1 /usr/local/src]# tar -xvf Percona-XtraDB-Cluster-5.7.28-31.41-r514-el8-x86_64-bundle.tar -C pxc-rpms
[root@PXC-Node1 /usr/local/src]# ls pxc-rpms
Percona-XtraDB-Cluster-57-5.7.28-31.41.1.el8.x86_64.rpm
Percona-XtraDB-Cluster-57-debuginfo-5.7.28-31.41.1.el8.x86_64.rpm
Percona-XtraDB-Cluster-57-debugsource-5.7.28-31.41.1.el8.x86_64.rpm
Percona-XtraDB-Cluster-client-57-5.7.28-31.41.1.el8.x86_64.rpm
Percona-XtraDB-Cluster-client-57-debuginfo-5.7.28-31.41.1.el8.x86_64.rpm
Percona-XtraDB-Cluster-devel-57-5.7.28-31.41.1.el8.x86_64.rpm
Percona-XtraDB-Cluster-full-57-5.7.28-31.41.1.el8.x86_64.rpm
Percona-XtraDB-Cluster-garbd-57-5.7.28-31.41.1.el8.x86_64.rpm
Percona-XtraDB-Cluster-garbd-57-debuginfo-5.7.28-31.41.1.el8.x86_64.rpm
Percona-XtraDB-Cluster-server-57-5.7.28-31.41.1.el8.x86_64.rpm
Percona-XtraDB-Cluster-server-57-debuginfo-5.7.28-31.41.1.el8.x86_64.rpm
Percona-XtraDB-Cluster-shared-57-5.7.28-31.41.1.el8.x86_64.rpm
Percona-XtraDB-Cluster-shared-57-debuginfo-5.7.28-31.41.1.el8.x86_64.rpm
Percona-XtraDB-Cluster-test-57-5.7.28-31.41.1.el8.x86_64.rpm
Percona-XtraDB-Cluster-test-57-debuginfo-5.7.28-31.41.1.el8.x86_64.rpm

另外,PXC的安裝需要依賴於qpresspercona-xtrabackup-24,可以在percona提供的倉庫中獲取到相應的rpm包下載鏈接。然後進入pxc-rpms目錄下載這兩個組件的rpm包,如下:

[root@PXC-Node1 /usr/local/src]# cd pxc-rpms
[root@PXC-Node1 /usr/local/src/pxc-rpms]# wget https://repo.percona.com/release/8/RPMS/x86_64/qpress-11-1.el8.x86_64.rpm
[root@PXC-Node1 /usr/local/src/pxc-rpms]# wget https://repo.percona.com/release/8/RPMS/x86_64/percona-xtrabackup-24-2.4.18-1.el8.x86_64.rpm

完成以上步驟後,現在就可以通過yum命令以本地形式安裝PXC了:

[root@PXC-Node1 /usr/local/src/pxc-rpms]# yum localinstall -y *.rpm

成功安裝後,系統中就會有mysql的相關命令。如下,能正常查看到版本信息代表已安裝成功:

[root@PXC-Node1 /usr/local/src/pxc-rpms]# mysql --version
mysql  Ver 14.14 Distrib 5.7.28-31, for Linux (x86_64) using  7.0
[root@PXC-Node1 /usr/local/src/pxc-rpms]#

配置PXC集羣

安裝後需要進行一些配置才能啓動集羣,PXC的配置文件默認位於/etc/percona-xtradb-cluster.conf.d/目錄下,/etc/my.cnf文件只是對其引用:

[root@PXC-Node1 ~]# cd /etc/percona-xtradb-cluster.conf.d/
[root@PXC-Node1 /etc/percona-xtradb-cluster.conf.d]# ll
總用量 12
-rw-r--r-- 1 root root  381 12月 13 17:19 mysqld.cnf  # mysql相關配置
-rw-r--r-- 1 root root  440 12月 13 17:19 mysqld_safe.cnf  # mysqld_safe相關配置
-rw-r--r-- 1 root root 1066 12月 13 17:19 wsrep.cnf  # PXC集羣的相關配置

mysqld.cnf文件中添加一些字符集等基本配置:

[root@PXC-Node1 /etc/percona-xtradb-cluster.conf.d]# vim mysqld.cnf
[mysqld]
...

# 設置字符集
character_set_server=utf8
# 設置監聽的ip
bind-address=0.0.0.0
# 跳過DNS解析
skip-name-resolve

然後是配置PXC集羣,修改wsrep.cnf文件中的如下配置項:

[root@PXC-Node1 /etc/percona-xtradb-cluster.conf.d]# vim wsrep.cnf
[mysqld]
# PXC集羣中MySQL實例的唯一ID,不能重複,且必須是數字
server-id=1
# Galera庫文件的路徑
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
# PXC集羣的名稱
wsrep_cluster_name=pxc-cluster
# 集羣中所有節點的ip
wsrep_cluster_address=gcomm://192.168.190.132,192.168.190.133,192.168.190.134
# 當前節點的名稱
wsrep_node_name=pxc-node-01
# 當前節點的IP
wsrep_node_address=192.168.190.132
# 同步方法(mysqldump、 rsync、 xtrabackup)
wsrep_sst_method=xtrabackup-v2
# 同步時使用的帳戶密碼
wsrep_sst_auth=admin:Abc_123456
# 採用嚴格的同步模式
pxc_strict_mode=ENFORCING
# 基於ROW複製(安全可靠)
binlog_format=ROW
# 默認引擎
default_storage_engine=InnoDB
# 主鍵自增長不鎖表
innodb_autoinc_lock_mode=2

啓動PXC集羣

到此爲止,我們在PXC-Node1這臺虛擬機上完成了PXC的安裝及配置。然後到其他兩個節點上完成同樣的步驟即可,這裏就不再重複了。

當所有的節點都準備完成後,使用如下命令啓動PXC集羣。注意這條的命令是用於啓動首節點的,初次啓動集羣時首節點可以是這三個節點中的任意一個,這裏我採用PXC-Node1作爲首節點。故在該虛擬機下執行這條命令:

[root@PXC-Node1 ~]# systemctl start [email protected]

而其他節點只需要正常啓動MySQL服務即可,啓動之後會根據wsrep.cnf文件中的配置自動加入集羣中:

[root@PXC-Node2 ~]# systemctl start mysqld

禁用Percona Server的開機自啓動:

[root@localhost ~]# systemctl disable mysqld
Removed /etc/systemd/system/multi-user.target.wants/mysqld.service.
Removed /etc/systemd/system/mysql.service.
[root@localhost ~]# 
  • Tips:之所以要禁用開機自啓,是因爲在PXC集羣中,當一個節點宕機重啓後,它會隨機與一個PXC節點進行數據同步。如果該節點宕機時間過長,那麼需要同步的數據量就會比較大。當發生大量數據同步時,PXC集羣會限制其他的寫入操作,直到數據全部同步成功。所以長時間宕機之後,正確的做法是不要馬上啓動節點,而是先從其他節點拷貝數據文件到該節點中,然後再進行啓動。這樣需要同步的數據就會少很多,不會引起長時間的限速。

創建數據庫賬戶

接着修改root賬戶的默認密碼。我們可以在mysql的日誌文件中找到初始的默認密碼。下圖紅框標註的就是默認密碼:
在CentOS8下搭建PXC集羣

  • Tips:默認密碼只有在首次啓動MySQL服務後纔會生成

複製默認密碼,然後使用mysql_secure_installation命令修改root賬戶的密碼:

[root@localhost ~]# mysql_secure_installation 

爲了安全起見,root賬戶一般是不允許遠程登錄的,所以我們需要單獨創建一個用於遠程訪問的數據庫賬戶。這個賬戶也是用於PXC集羣同步數據的賬戶,與wsrep.cnf文件中的wsrep_sst_auth配置項所對應:

[root@localhost ~]# mysql -uroot -p
mysql> create user 'admin'@'%' identified by 'Abc_123456';
mysql> grant all privileges on *.* to 'admin'@'%';
mysql> flush privileges;

創建完賬戶後,使用客戶端工具進行遠程連接測試看看是否能正常連接成功:
在CentOS8下搭建PXC集羣

到此爲止,我們就算是完成PXC集羣的搭建了。現在應該是已經可以看到PXC集羣的同步效果的,因爲上面修改root密碼以及新建賬戶的操作都會被同步到其他兩個節點上。也就是說,此時其他兩個節點的root賬戶密碼已經是修改後的密碼,並且也會有一個admin賬戶。關於這一點可以自行驗證一下。

除此之外,我們也可以使用如下語句來確認集羣的狀態信息:

show status like 'wsrep_cluster%';

執行結果:
在CentOS8下搭建PXC集羣

變量說明:

  • wsrep_cluster_weight:該節點在集羣中的權重值
  • wsrep_cluster_conf_id:集羣節點關係改變的次數(每次增加/刪除都會+1)
  • wsrep_cluster_size:集羣中的節點個數
  • wsrep_cluster_state_uuid:集羣當前狀態的UUID,這是集羣當前狀態及其所經歷的更改序列的唯一標識符。也用於比較兩個或多個節點是否處於同一集羣,若兩個節點的該變量值一致就代表處於一個集羣,如果該值不一致則表示不處於同一集羣
  • wsrep_cluster_status:集羣的目前狀態

驗證集羣的數據同步

1、驗證創建數據庫是否能同步

在節點1中創建一個test庫:
在CentOS8下搭建PXC集羣

創建完成後,點擊其他節點也應能看到test這個庫:
在CentOS8下搭建PXC集羣

2、驗證創建數據表是否能同步

在節點1中的test庫裏創建一張student表:
在CentOS8下搭建PXC集羣

創建完成後,在其他節點也應能看到這張student表:
在CentOS8下搭建PXC集羣

3、驗證表數據是否能同步

往節點1中的student表裏插入一條數據:
在CentOS8下搭建PXC集羣

此時其他節點中也應能看到這條數據:
在CentOS8下搭建PXC集羣


集羣的狀態參數說明

集羣的狀態參數可以通過SQL語句進行查詢的,如下:

show status like '%wsrep%';

由於查詢出來的狀態參數變量非常的多,這裏針對一些常用的進行說明。PXC集羣參數可以分爲以下幾類:

  • 隊列相關
    • wsrep_local_send_queue:發送隊列的長度
    • wsrep_local_send_queue_max:發送隊列的最大長度
    • wsrep_local_send_queue_min:發送隊列的最小長度
    • wsrep_local_send_queue_avg:發送隊列的平均長度
    • wsrep_local_recv_queue:接收隊列的長度
    • wsrep_local_recv_queue_max:接收隊列的最大長度
    • wsrep_local_recv_queue_min:接收隊列的最小長度
    • wsrep_local_recv_queue_avg:接收隊列的平均長度
  • 複製相關
    • wsrep_replicated:同步數據到其他節點的次數
    • wsrep_replicated_bytes:同步到其他節點的數據總量,單位字節
    • wsrep_received:接收到其他節點同步請求的次數
    • wsrep_received_bytes:接收到其他節點的同步數據總量,單位字節
    • wsrep_last_applied:同步應用次數
    • wsrep_last_committed:事務提交次數
  • 流控相關
    • wsrep_flow_control_paused_ns:流控暫停狀態下花費的總時間(納秒)
    • wsrep_flow_control_paused:流控暫停時間的佔比(0 ~ 1)
    • wsrep_flow_control_sent:發送的流控暫停事件的數量,即當前節點觸發流控的次數
    • wsrep_flow_control_recv:接收的流控暫停事件的數量
    • wsrep_flow_control_interval:流控的下限和上限。上限是隊列中允許的最大請求數。如果隊列達到上限,則拒絕新的請求,即觸發流控。當處理現有請求時,隊列會減少,一旦到達下限,將再次允許新的請求,即解除流控
    • wsrep_flow_control_status:流控的開關狀態(開啓:ON,關閉:OFF)
  • 事務相關
    • wsrep_cert_deps_distance:事務執行的併發數
    • wsrep_apply_oooe:接收隊列中事務的佔比
    • wsrep_apply_oool:接收隊列中事務亂序執行的頻率
    • wsrep_apply_window:接收隊列中事務的平均數量
    • wsrep_commit_oooe:發送隊列中事務的佔比
    • wsrep_commit_oool:無任何意義(不存在本地亂序提交)
    • wsrep_commit_window:發送隊列中事務的平均數量
  • 狀態相關
    • wsrep_local_state_comment:節點的當前狀態
    • wsrep_cluster_status:集羣的當前狀態
    • wsrep_connected:節點是否連接到集羣
    • wsrep_ready集羣是否正常工作
    • wsrep_cluster_size:集羣中的節點個數
    • wsrep_desync_count:延時節點的數量
    • wsrep_incoming_addresses:集羣中所有節點的IP地址

PXC節點狀態圖:
在CentOS8下搭建PXC集羣

  • OPEN:節點啓動成功
  • PRIMARY:節點成功加入集羣
  • JOINER:與其他節點同步數據
  • JOINED:與其他節點同步數據成功
  • SYNCED:與集羣同步完成,可以對外提供服務
  • DONER:接收其他節點的全量數據同步,處於不可用

PXC集羣狀態圖:
在CentOS8下搭建PXC集羣

  • PRIMARY:正常狀態
  • NON_PRIMARY:集羣發生腦裂
  • DISCONNECTED:集羣處於無法連接狀態

官方文檔:


關於PXC節點的上線與下線

1、PXC節點的安全下線姿勢

節點是怎麼啓動的,就使用對應的命令去關閉即可

  • 首節點示例:
  • 其他節點示例:
    • 啓動其他節點的命令是:systemctl start mysqld
    • 那麼對應的關閉命令就是:systemctl stop mysqld

2、如果所有PXC節點都是安全下線的,那麼在啓動集羣時,就需要先啓動最後下線的節點

初次啓動集羣時可以將任意一個節點作爲首節點啓動。但如果是一個已經啓動過的集羣,那麼當該集羣下線再上線時,就需要將最後下線的節點作爲首節點來啓動。其實關於某個節點是否能作爲首節點啓動,可以通過查看 grastate.dat 文件得知:

[root@PXC-Node1 ~]# cat /var/lib/mysql/grastate.dat 
# GALERA saved state
version: 2.1
uuid:    2c915504-39ac-11ea-bba7-a294386c4285
seqno:   -1
safe_to_bootstrap: 0
[root@PXC-Node1 ~]#
  • 說明:safe_to_bootstrap的值爲0時表示不能作爲首節點啓動,爲1時表示可以作爲首節點啓動。PXC集羣中最後一個下線的節點就會將safe_to_bootstrap的值改爲1,下次啓動集羣時就需要將該節點作爲首節點啓動。這是因爲最後一個下線的節點數據是最新的。將其作爲首節點啓動,然後讓其他節點與該節點進行數據同步,這樣才能保證集羣中的數據是最新的。否則,可能會導致集羣中的數據是某個時間點之前的舊數據。

3、如果PXC節點都是意外退出的,而且不是在同一時間退出的情況

在本文開頭提到過,PXC集羣中一半以上的節點因意外宕機而無法訪問時,PXC集羣就會停止運行。但如果這些PXC節點是以安全下線的方式退出,則不會引發集羣自動停止運行的問題,只會縮小集羣的規模。只有意外下線一半以上節點時集羣纔會自動停止,意外下線的情況包括:

  • 宕機、掛起、關機、重啓、斷電、斷網等等,反正就是沒有使用相應的停止命令安全下線節點都屬於意外下線

只要PXC集羣中的節點不是同時意外退出的,那麼當集羣還剩一個節點時,該節點就會自動將grastate.dat文件中的safe_to_bootstrap值改爲1。所以在重啓集羣時,也是先啓動最後一個退出的節點。


4、如果PXC節點都是同時意外退出的,則需要修改grastate.dat文件

當集羣中所有節點都是在同一時間因意外情況而退出,那麼此時所有節點的safe_to_bootstrap都爲0,因爲沒有一個節點來得及去修改safe_to_bootstrap的值。當所有節點的safe_to_bootstrap均爲0時,PXC集羣是無法啓動的。

在這種情況下我們就只能手動選擇一個節點,將safe_to_bootstrap修改爲1,然後將該節點作爲首節點進行啓動:

[root@PXC-Node1 ~]# vim /var/lib/mysql/grastate.dat 
...
safe_to_bootstrap: 1
[root@PXC-Node1 ~]# systemctl start [email protected]

接着再依次啓動其他節點即可:

[root@PXC-Node2 ~]# systemctl start mysqld

5、如果集羣中還有可運行的節點,那麼其他下線的節點只需要按普通節點上線即可

[root@PXC-Node2 ~]# systemctl start mysqld
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章