PXC是Percona XtraDB Cluster的縮寫,是 Percona 公司出品的免費MySQL集羣產品。PXC的做用是經過mysql自帶的Galera集羣技術,將不一樣的mysql實例鏈接起來,實現多主集羣。在PXC集羣中每一個mysql節點都是可讀可寫的,也就是主從概念中的主節點,不存在只讀的節點。html
PXC其實是基於Galera的面向OLTP的多主同步複製插件,PXC主要用於解決MySQL集羣中數據同步強一性問題。PXC能夠集羣任何mysql的衍生版本,例如MariaDB和Percona Server。因爲Percona Server的性能最接近於mysql企業版,性能相對於標準版的mysql有顯著的提高,而且對mysql基本兼容。因此在搭建PXC集羣時,一般建議基於Percona Server進行搭建。node
關於數據庫集羣方案的選擇能夠參考:mysql
環境版本說明:sql
MySQL有幾個常見的衍生版,Percona Server就是其一。這裏選擇Percona Server是由於它是最接近於企業版的MySQL。各衍生版的對比圖以下:數據庫
本文的PXC集羣設計如圖:bootstrap
根據該圖,咱們須要建立三個虛擬機來搭建一個三節點的PXC集羣:vim
節點說明:安全
Node | Host | IP |
---|---|---|
Node1 | PXC-Node1 | 192.168.190.132 |
Node2 | PXC-Node2 | 192.168.190.133 |
Node3 | PXC-Node3 | 192.168.190.134 |
每一個虛擬機的配置以下圖:bash
關於 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有兩種較爲簡單的安裝方式,一是到官網下載rpm
包到系統本地進行安裝,二是使用官方提供的yum
倉庫進行在線安裝。本文演示的是本地安裝這種方式,首先打開以下網址:
選擇相應的版本後,複製下載連接:
而後到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的安裝須要依賴於qpress
和percona-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的配置文件默認位於/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-Node1
這臺虛擬機上完成了PXC的安裝及配置。而後到其餘兩個節點上完成一樣的步驟便可,這裏就再也不重複了。
當全部的節點都準備完成後,使用以下命令啓動PXC集羣。注意這條的命令是用於啓動首節點的,初次啓動集羣時首節點能夠是這三個節點中的任意一個,這裏我採用PXC-Node1
做爲首節點。故在該虛擬機下執行這條命令:
[root@PXC-Node1 ~]# systemctl start mysql@bootstrap.service
而其餘節點只須要正常啓動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 ~]#
接着修改root帳戶的默認密碼。咱們能夠在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;
建立完帳戶後,使用客戶端工具進行遠程鏈接測試看看是否能正常鏈接成功:
到此爲止,咱們就算是完成PXC集羣的搭建了。如今應該是已經能夠看到PXC集羣的同步效果的,由於上面修改root密碼以及新建帳戶的操做都會被同步到其餘兩個節點上。也就是說,此時其餘兩個節點的root帳戶密碼已是修改後的密碼,而且也會有一個admin帳戶。關於這一點能夠自行驗證一下。
除此以外,咱們也可使用以下語句來確認集羣的狀態信息:
show status like 'wsrep_cluster%';
執行結果:
變量說明:
wsrep_cluster_weight
:該節點在集羣中的權重值wsrep_cluster_conf_id
:集羣節點關係改變的次數(每次增長/刪除都會+1)wsrep_cluster_size
:集羣中的節點個數wsrep_cluster_state_uuid
:集羣當前狀態的UUID,這是集羣當前狀態及其所經歷的更改序列的惟一標識符。也用於比較兩個或多個節點是否處於同一集羣,若兩個節點的該變量值一致就表明處於一個集羣,若是該值不一致則表示不處於同一集羣wsrep_cluster_status
:集羣的目前狀態一、驗證建立數據庫是否能同步
在節點1中建立一個test
庫:
建立完成後,點擊其餘節點也應能看到test
這個庫:
二、驗證建立數據表是否能同步
在節點1中的test
庫裏建立一張student
表:
建立完成後,在其餘節點也應能看到這張student
表:
三、驗證表數據是否能同步
往節點1中的student
表裏插入一條數據:
此時其餘節點中也應能看到這條數據:
集羣的狀態參數能夠經過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節點狀態圖:
OPEN
:節點啓動成功PRIMARY
:節點成功加入集羣JOINER
:與其餘節點同步數據JOINED
:與其餘節點同步數據成功SYNCED
:與集羣同步完成,能夠對外提供服務DONER
:接收其餘節點的全量數據同步,處於不可用PXC集羣狀態圖:
PRIMARY
:正常狀態NON_PRIMARY
:集羣發生腦裂DISCONNECTED
:集羣處於沒法鏈接狀態官方文檔:
一、PXC節點的安全下線姿式
節點是怎麼啓動的,就使用對應的命令去關閉便可
systemctl start mysql@bootstrap.service
systemctl stop mysql@bootstrap.service
systemctl start mysqld
systemctl stop mysqld
二、若是全部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
,下次啓動集羣時就須要將該節點做爲首節點啓動。這是由於最後一個下線的節點數據是最新的。將其做爲首節點啓動,而後讓其餘節點與該節點進行數據同步,這樣才能保證集羣中的數據是最新的。不然,可能會致使集羣中的數據是某個時間點以前的舊數據。三、若是PXC節點都是意外退出的,並且不是在同一時間退出的狀況
在本文開頭提到過,PXC集羣中一半以上的節點因意外宕機而沒法訪問時,PXC集羣就會中止運行。但若是這些PXC節點是以安全下線的方式退出,則不會引起集羣自動中止運行的問題,只會縮小集羣的規模。只有意外下線一半以上節點時集羣纔會自動中止,意外下線的狀況包括:
只要PXC集羣中的節點不是同時意外退出的,那麼當集羣還剩一個節點時,該節點就會自動將grastate.dat
文件中的safe_to_bootstrap
值改成1
。因此在重啓集羣時,也是先啓動最後一個退出的節點。
四、若是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 mysql@bootstrap.service
接着再依次啓動其餘節點便可:
[root@PXC-Node2 ~]# systemctl start mysqld
五、若是集羣中還有可運行的節點,那麼其餘下線的節點只須要按普通節點上線便可
[root@PXC-Node2 ~]# systemctl start mysqld