PXC簡(jiǎn)介
PXC是Percona XtraDB Cluster的縮寫,是 Percona 公司出品的免費(fèi)MySQL集群產(chǎn)品。PXC的作用是通過(guò)mysql自帶的Galera集群技術(shù),將不同的mysql實(shí)例連接起來(lái),實(shí)現(xiàn)多主集群。在PXC集群中每個(gè)mysql節(jié)點(diǎn)都是可讀可寫的,也就是主從概念中的主節(jié)點(diǎn),不存在只讀的節(jié)點(diǎn)。
PXC實(shí)際上是基于Galera的面向OLTP的多主同步復(fù)制插件,PXC主要用于解決MySQL集群中數(shù)據(jù)同步強(qiáng)一性問(wèn)題。PXC可以集群任何mysql的衍生版本,例如MariaDB和Percona Server。由于Percona Server的性能最接近于mysql企業(yè)版,性能相對(duì)于標(biāo)準(zhǔn)版的mysql有顯著的提升,并且對(duì)mysql基本兼容。所以在搭建PXC集群時(shí),通常建議基于Percona Server進(jìn)行搭建。
關(guān)于數(shù)據(jù)庫(kù)集群方案的選擇可以參考:
PXC的特點(diǎn)
- 同步復(fù)制,事務(wù)在所有集群節(jié)點(diǎn)要么全部提交完成,要么全部失敗
- 多主復(fù)制,不存在主從角色的劃分,可以在任意一個(gè)節(jié)點(diǎn)進(jìn)行讀/寫操作
- 數(shù)據(jù)同步的強(qiáng)一致性,所有節(jié)點(diǎn)的數(shù)據(jù)是實(shí)時(shí)一致的
- PXC集群節(jié)點(diǎn)越多,數(shù)據(jù)同步的速度就越慢,所以PXC集群的規(guī)模不能太大
- PXC集群數(shù)據(jù)同步的速度取決于配置最低的節(jié)點(diǎn),所以PXC集群中所有節(jié)點(diǎn)的硬件配置盡量保持一致
- PXC集群只支持InnoDB引擎,所以只有InnoDB引擎的數(shù)據(jù)才會(huì)被同步
安裝PXC并組建集群
環(huán)境準(zhǔn)備
環(huán)境版本說(shuō)明:
- VMware Workstation Pro 15.5
- Percona XtraDB Cluster 5.7
- CentOS 8
MySQL有幾個(gè)常見(jiàn)的衍生版,Percona Server就是其一。這里選擇Percona Server是因?yàn)樗亲罱咏谄髽I(yè)版的MySQL。各衍生版的對(duì)比圖如下:
本文的PXC集群設(shè)計(jì)如圖:
- Tips:實(shí)際上最小的PXC集群是兩個(gè)節(jié)點(diǎn)的,但課程中設(shè)計(jì)為三個(gè)節(jié)點(diǎn)。這是因?yàn)镻XC集群為了防止腦裂,在一半以上的節(jié)點(diǎn)因意外宕機(jī)無(wú)法訪問(wèn)時(shí),PXC集群就會(huì)自動(dòng)停止運(yùn)行。所以如果設(shè)計(jì)為兩個(gè)節(jié)點(diǎn),其中一個(gè)節(jié)點(diǎn)掛掉了就滿足半數(shù)以上節(jié)點(diǎn)無(wú)法訪問(wèn),那么集群就會(huì)停止運(yùn)行,而另一個(gè)節(jié)點(diǎn)也就無(wú)法使用了。這樣的容災(zāi)性太差,所以這里設(shè)計(jì)為至少三個(gè)節(jié)點(diǎn),以提高PXC集群的可用性。
根據(jù)該圖,我們需要?jiǎng)?chuàng)建三個(gè)虛擬機(jī)來(lái)搭建一個(gè)三節(jié)點(diǎn)的PXC集群:
節(jié)點(diǎn)說(shuō)明:
Node | Host | IP |
---|---|---|
Node1 | PXC-Node1 | 192.168.190.132 |
Node2 | PXC-Node2 | 192.168.190.133 |
Node3 | PXC-Node3 | 192.168.190.134 |
每個(gè)虛擬機(jī)的配置如下圖:
關(guān)于 PXC 集群是以犧牲性能來(lái)保證數(shù)據(jù)的強(qiáng)一致性問(wèn)題。PXC 集群中的節(jié)點(diǎn)越多就意味著數(shù)據(jù)同步的時(shí)間就越長(zhǎng),那么應(yīng)該用幾臺(tái)數(shù)據(jù)庫(kù)服務(wù)器來(lái)做集群最合適,相對(duì)來(lái)說(shuō)算是能達(dá)到一個(gè)性能上最優(yōu)的結(jié)果呢 ?
通常來(lái)說(shuō)不超過(guò)15臺(tái)節(jié)點(diǎn)組成一個(gè)PXC集群,性能上很好,多了就不行。然后這個(gè)PXC集群作為一個(gè)分片,MyCat上多設(shè)置幾個(gè)分片,就能應(yīng)對(duì)數(shù)據(jù)切分和并發(fā)訪問(wèn)了
系統(tǒng)準(zhǔn)備
有些 CentOS 版本默認(rèn)捆綁了mariadb-libs
,在安裝PXC之前需要先將其卸載:
[root@PXC-Node1 ~]# yum -y remove mari*
PXC集群要使用四個(gè)端口:
端口 | 描述 |
---|---|
3306 | MySQL服務(wù)端口 |
4444 | 請(qǐng)求全量同步(SST)端口 |
4567 | 數(shù)據(jù)庫(kù)節(jié)點(diǎn)之間的通信端口 |
4568 | 請(qǐng)求增量同步(IST)端口 |
所以如果系統(tǒng)啟用了防火墻則需要開(kāi)放這些端口:
[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有兩種較為簡(jiǎn)單的安裝方式,一是到官網(wǎng)下載rpm
包到系統(tǒng)本地進(jìn)行安裝,二是使用官方提供的yum
倉(cāng)庫(kù)進(jìn)行在線安裝。本文演示的是本地安裝這種方式,首先打開(kāi)如下網(wǎng)址:
選擇相應(yīng)的版本后,復(fù)制下載鏈接:
然后到CentOS上使用wget
命令進(jìn)行下載,如下示例:
[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
創(chuàng)建存放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提供的倉(cāng)庫(kù)中獲取到相應(yīng)的rpm
包下載鏈接。然后進(jìn)入pxc-rpms
目錄下載這兩個(gè)組件的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
完成以上步驟后,現(xiàn)在就可以通過(guò)yum
命令以本地形式安裝PXC了:
[root@PXC-Node1 /usr/local/src/pxc-rpms]# yum localinstall -y *.rpm
成功安裝后,系統(tǒng)中就會(huì)有mysql
的相關(guān)命令。如下,能正常查看到版本信息代表已安裝成功:
[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集群
安裝后需要進(jìn)行一些配置才能啟動(dòng)集群,PXC的配置文件默認(rèn)位于/etc/percona-xtradb-cluster.conf.d/
目錄下,/etc/my.cnf
文件只是對(duì)其引用:
[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相關(guān)配置
-rw-r--r-- 1 root root 440 12月 13 17:19 mysqld_safe.cnf # mysqld_safe相關(guān)配置
-rw-r--r-- 1 root root 1066 12月 13 17:19 wsrep.cnf # PXC集群的相關(guān)配置
在mysqld.cnf
文件中添加一些字符集等基本配置:
[root@PXC-Node1 /etc/percona-xtradb-cluster.conf.d]# vim mysqld.cnf
[mysqld]
...
# 設(shè)置字符集
character_set_server=utf8
# 設(shè)置監(jiān)聽(tīng)的ip
bind-address=0.0.0.0
# 跳過(guò)DNS解析
skip-name-resolve
然后是配置PXC集群,修改wsrep.cnf
文件中的如下配置項(xiàng):
[root@PXC-Node1 /etc/percona-xtradb-cluster.conf.d]# vim wsrep.cnf
[mysqld]
# PXC集群中MySQL實(shí)例的唯一ID,不能重復(fù),且必須是數(shù)字
server-id=1
# Galera庫(kù)文件的路徑
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
# PXC集群的名稱
wsrep_cluster_name=pxc-cluster
# 集群中所有節(jié)點(diǎn)的ip
wsrep_cluster_address=gcomm://192.168.190.132,192.168.190.133,192.168.190.134
# 當(dāng)前節(jié)點(diǎn)的名稱
wsrep_node_name=pxc-node-01
# 當(dāng)前節(jié)點(diǎn)的IP
wsrep_node_address=192.168.190.132
# 同步方法(mysqldump、 rsync、 xtrabackup)
wsrep_sst_method=xtrabackup-v2
# 同步時(shí)使用的帳戶密碼
wsrep_sst_auth=admin:Abc_123456
# 采用嚴(yán)格的同步模式
pxc_strict_mode=ENFORCING
# 基于ROW復(fù)制(安全可靠)
binlog_format=ROW
# 默認(rèn)引擎
default_storage_engine=InnoDB
# 主鍵自增長(zhǎng)不鎖表
innodb_autoinc_lock_mode=2
啟動(dòng)PXC集群
到此為止,我們?cè)?code>PXC-Node1這臺(tái)虛擬機(jī)上完成了PXC的安裝及配置。然后到其他兩個(gè)節(jié)點(diǎn)上完成同樣的步驟即可,這里就不再重復(fù)了。
當(dāng)所有的節(jié)點(diǎn)都準(zhǔn)備完成后,使用如下命令啟動(dòng)PXC集群。注意這條的命令是用于啟動(dòng)首節(jié)點(diǎn)的,初次啟動(dòng)集群時(shí)首節(jié)點(diǎn)可以是這三個(gè)節(jié)點(diǎn)中的任意一個(gè),這里我采用PXC-Node1
作為首節(jié)點(diǎn)。故在該虛擬機(jī)下執(zhí)行這條命令:
[root@PXC-Node1 ~]# systemctl start mysql@bootstrap.service
而其他節(jié)點(diǎn)只需要正常啟動(dòng)MySQL服務(wù)即可,啟動(dòng)之后會(huì)根據(jù)wsrep.cnf
文件中的配置自動(dòng)加入集群中:
[root@PXC-Node2 ~]# systemctl start mysqld
禁用Percona Server的開(kāi)機(jī)自啟動(dòng):
[root@localhost ~]# systemctl disable mysqld
Removed /etc/systemd/system/multi-user.target.wants/mysqld.service.
Removed /etc/systemd/system/mysql.service.
[root@localhost ~]#
- Tips:之所以要禁用開(kāi)機(jī)自啟,是因?yàn)樵赑XC集群中,當(dāng)一個(gè)節(jié)點(diǎn)宕機(jī)重啟后,它會(huì)隨機(jī)與一個(gè)PXC節(jié)點(diǎn)進(jìn)行數(shù)據(jù)同步。如果該節(jié)點(diǎn)宕機(jī)時(shí)間過(guò)長(zhǎng),那么需要同步的數(shù)據(jù)量就會(huì)比較大。當(dāng)發(fā)生大量數(shù)據(jù)同步時(shí),PXC集群會(huì)限制其他的寫入操作,直到數(shù)據(jù)全部同步成功。所以長(zhǎng)時(shí)間宕機(jī)之后,正確的做法是不要馬上啟動(dòng)節(jié)點(diǎn),而是先從其他節(jié)點(diǎn)拷貝數(shù)據(jù)文件到該節(jié)點(diǎn)中,然后再進(jìn)行啟動(dòng)。這樣需要同步的數(shù)據(jù)就會(huì)少很多,不會(huì)引起長(zhǎng)時(shí)間的限速。
創(chuàng)建數(shù)據(jù)庫(kù)賬戶
接著修改root賬戶的默認(rèn)密碼。我們可以在mysql的日志文件中找到初始的默認(rèn)密碼。下圖紅框標(biāo)注的就是默認(rèn)密碼:
- Tips:默認(rèn)密碼只有在首次啟動(dòng)MySQL服務(wù)后才會(huì)生成
復(fù)制默認(rèn)密碼,然后使用mysql_secure_installation
命令修改root賬戶的密碼:
[root@localhost ~]# mysql_secure_installation
為了安全起見(jiàn),root賬戶一般是不允許遠(yuǎn)程登錄的,所以我們需要單獨(dú)創(chuàng)建一個(gè)用于遠(yuǎn)程訪問(wèn)的數(shù)據(jù)庫(kù)賬戶。這個(gè)賬戶也是用于PXC集群同步數(shù)據(jù)的賬戶,與wsrep.cnf
文件中的wsrep_sst_auth
配置項(xiàng)所對(duì)應(yīng):
[root@localhost ~]# mysql -uroot -p
mysql> create user 'admin'@'%' identified by 'Abc_123456';
mysql> grant all privileges on *.* to 'admin'@'%';
mysql> flush privileges;
創(chuàng)建完賬戶后,使用客戶端工具進(jìn)行遠(yuǎn)程連接測(cè)試看看是否能正常連接成功:
到此為止,我們就算是完成PXC集群的搭建了。現(xiàn)在應(yīng)該是已經(jīng)可以看到PXC集群的同步效果的,因?yàn)樯厦嫘薷膔oot密碼以及新建賬戶的操作都會(huì)被同步到其他兩個(gè)節(jié)點(diǎn)上。也就是說(shuō),此時(shí)其他兩個(gè)節(jié)點(diǎn)的root賬戶密碼已經(jīng)是修改后的密碼,并且也會(huì)有一個(gè)admin賬戶。關(guān)于這一點(diǎn)可以自行驗(yàn)證一下。
除此之外,我們也可以使用如下語(yǔ)句來(lái)確認(rèn)集群的狀態(tài)信息:
show status like 'wsrep_cluster%';
執(zhí)行結(jié)果:
變量說(shuō)明:
-
wsrep_cluster_weight
:該節(jié)點(diǎn)在集群中的權(quán)重值 -
wsrep_cluster_conf_id
:集群節(jié)點(diǎn)關(guān)系改變的次數(shù)(每次增加/刪除都會(huì)+1) -
wsrep_cluster_size
:集群中的節(jié)點(diǎn)個(gè)數(shù) -
wsrep_cluster_state_uuid
:集群當(dāng)前狀態(tài)的UUID,這是集群當(dāng)前狀態(tài)及其所經(jīng)歷的更改序列的唯一標(biāo)識(shí)符。也用于比較兩個(gè)或多個(gè)節(jié)點(diǎn)是否處于同一集群,若兩個(gè)節(jié)點(diǎn)的該變量值一致就代表處于一個(gè)集群,如果該值不一致則表示不處于同一集群 -
wsrep_cluster_status
:集群的目前狀態(tài)
驗(yàn)證集群的數(shù)據(jù)同步
1、驗(yàn)證創(chuàng)建數(shù)據(jù)庫(kù)是否能同步
在節(jié)點(diǎn)1中創(chuàng)建一個(gè)test
庫(kù):
創(chuàng)建完成后,點(diǎn)擊其他節(jié)點(diǎn)也應(yīng)能看到test
這個(gè)庫(kù):
2、驗(yàn)證創(chuàng)建數(shù)據(jù)表是否能同步
在節(jié)點(diǎn)1中的test
庫(kù)里創(chuàng)建一張student
表:
創(chuàng)建完成后,在其他節(jié)點(diǎn)也應(yīng)能看到這張student
表:
3、驗(yàn)證表數(shù)據(jù)是否能同步
往節(jié)點(diǎn)1中的student
表里插入一條數(shù)據(jù):
此時(shí)其他節(jié)點(diǎn)中也應(yīng)能看到這條數(shù)據(jù):
集群的狀態(tài)參數(shù)說(shuō)明
集群的狀態(tài)參數(shù)可以通過(guò)SQL語(yǔ)句進(jìn)行查詢的,如下:
show status like '%wsrep%';
由于查詢出來(lái)的狀態(tài)參數(shù)變量非常的多,這里針對(duì)一些常用的進(jìn)行說(shuō)明。PXC集群參數(shù)可以分為以下幾類:
-
隊(duì)列相關(guān)
-
wsrep_local_send_queue
:發(fā)送隊(duì)列的長(zhǎng)度 -
wsrep_local_send_queue_max
:發(fā)送隊(duì)列的最大長(zhǎng)度 -
wsrep_local_send_queue_min
:發(fā)送隊(duì)列的最小長(zhǎng)度 -
wsrep_local_send_queue_avg
:發(fā)送隊(duì)列的平均長(zhǎng)度 -
wsrep_local_recv_queue
:接收隊(duì)列的長(zhǎng)度 -
wsrep_local_recv_queue_max
:接收隊(duì)列的最大長(zhǎng)度 -
wsrep_local_recv_queue_min
:接收隊(duì)列的最小長(zhǎng)度 -
wsrep_local_recv_queue_avg
:接收隊(duì)列的平均長(zhǎng)度
-
-
復(fù)制相關(guān)
-
wsrep_replicated
:同步數(shù)據(jù)到其他節(jié)點(diǎn)的次數(shù) -
wsrep_replicated_bytes
:同步到其他節(jié)點(diǎn)的數(shù)據(jù)總量,單位字節(jié) -
wsrep_received
:接收到其他節(jié)點(diǎn)同步請(qǐng)求的次數(shù) -
wsrep_received_bytes
:接收到其他節(jié)點(diǎn)的同步數(shù)據(jù)總量,單位字節(jié) -
wsrep_last_applied
:同步應(yīng)用次數(shù) -
wsrep_last_committed
:事務(wù)提交次數(shù)
-
-
流控相關(guān)
-
wsrep_flow_control_paused_ns
:流控暫停狀態(tài)下花費(fèi)的總時(shí)間(納秒) -
wsrep_flow_control_paused
:流控暫停時(shí)間的占比(0 ~ 1) -
wsrep_flow_control_sent
:發(fā)送的流控暫停事件的數(shù)量,即當(dāng)前節(jié)點(diǎn)觸發(fā)流控的次數(shù) -
wsrep_flow_control_recv
:接收的流控暫停事件的數(shù)量 -
wsrep_flow_control_interval
:流控的下限和上限。上限是隊(duì)列中允許的最大請(qǐng)求數(shù)。如果隊(duì)列達(dá)到上限,則拒絕新的請(qǐng)求,即觸發(fā)流控。當(dāng)處理現(xiàn)有請(qǐng)求時(shí),隊(duì)列會(huì)減少,一旦到達(dá)下限,將再次允許新的請(qǐng)求,即解除流控 -
wsrep_flow_control_status
:流控的開(kāi)關(guān)狀態(tài)(開(kāi)啟:ON,關(guān)閉:OFF)
-
-
事務(wù)相關(guān)
-
wsrep_cert_deps_distance
:事務(wù)執(zhí)行的并發(fā)數(shù) -
wsrep_apply_oooe
:接收隊(duì)列中事務(wù)的占比 -
wsrep_apply_oool
:接收隊(duì)列中事務(wù)亂序執(zhí)行的頻率 -
wsrep_apply_window
:接收隊(duì)列中事務(wù)的平均數(shù)量 -
wsrep_commit_oooe
:發(fā)送隊(duì)列中事務(wù)的占比 -
wsrep_commit_oool
:無(wú)任何意義(不存在本地亂序提交) -
wsrep_commit_window
:發(fā)送隊(duì)列中事務(wù)的平均數(shù)量
-
-
狀態(tài)相關(guān)
-
wsrep_local_state_comment
:節(jié)點(diǎn)的當(dāng)前狀態(tài) -
wsrep_cluster_status
:集群的當(dāng)前狀態(tài) -
wsrep_connected
:節(jié)點(diǎn)是否連接到集群 -
wsrep_ready
集群是否正常工作 -
wsrep_cluster_size
:集群中的節(jié)點(diǎn)個(gè)數(shù) -
wsrep_desync_count
:延時(shí)節(jié)點(diǎn)的數(shù)量 -
wsrep_incoming_addresses
:集群中所有節(jié)點(diǎn)的IP地址
-
PXC節(jié)點(diǎn)狀態(tài)圖:
-
OPEN
:節(jié)點(diǎn)啟動(dòng)成功 -
PRIMARY
:節(jié)點(diǎn)成功加入集群 -
JOINER
:與其他節(jié)點(diǎn)同步數(shù)據(jù) -
JOINED
:與其他節(jié)點(diǎn)同步數(shù)據(jù)成功 -
SYNCED
:與集群同步完成,可以對(duì)外提供服務(wù) -
DONER
:接收其他節(jié)點(diǎn)的全量數(shù)據(jù)同步,處于不可用
PXC集群狀態(tài)圖:
-
PRIMARY
:正常狀態(tài) -
NON_PRIMARY
:集群發(fā)生腦裂 -
DISCONNECTED
:集群處于無(wú)法連接狀態(tài)
官方文檔:
關(guān)于PXC節(jié)點(diǎn)的上線與下線
1、PXC節(jié)點(diǎn)的安全下線姿勢(shì)
節(jié)點(diǎn)是怎么啟動(dòng)的,就使用對(duì)應(yīng)的命令去關(guān)閉即可
- 首節(jié)點(diǎn)示例:
- 啟動(dòng)首節(jié)點(diǎn)用的命令是:
systemctl start mysql@bootstrap.service
- 那么對(duì)應(yīng)的關(guān)閉命令就是:
systemctl stop mysql@bootstrap.service
- 啟動(dòng)首節(jié)點(diǎn)用的命令是:
- 其他節(jié)點(diǎn)示例:
- 啟動(dòng)其他節(jié)點(diǎn)的命令是:
systemctl start mysqld
- 那么對(duì)應(yīng)的關(guān)閉命令就是:
systemctl stop mysqld
- 啟動(dòng)其他節(jié)點(diǎn)的命令是:
2、如果所有PXC節(jié)點(diǎn)都是安全下線的,那么在啟動(dòng)集群時(shí),就需要先啟動(dòng)最后下線的節(jié)點(diǎn)
初次啟動(dòng)集群時(shí)可以將任意一個(gè)節(jié)點(diǎn)作為首節(jié)點(diǎn)啟動(dòng)。但如果是一個(gè)已經(jīng)啟動(dòng)過(guò)的集群,那么當(dāng)該集群下線再上線時(shí),就需要將最后下線的節(jié)點(diǎn)作為首節(jié)點(diǎn)來(lái)啟動(dòng)。其實(shí)關(guān)于某個(gè)節(jié)點(diǎn)是否能作為首節(jié)點(diǎn)啟動(dòng),可以通過(guò)查看 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 ~]#
-
說(shuō)明:
safe_to_bootstrap
的值為0
時(shí)表示不能作為首節(jié)點(diǎn)啟動(dòng),為1
時(shí)表示可以作為首節(jié)點(diǎn)啟動(dòng)。PXC集群中最后一個(gè)下線的節(jié)點(diǎn)就會(huì)將safe_to_bootstrap
的值改為1
,下次啟動(dòng)集群時(shí)就需要將該節(jié)點(diǎn)作為首節(jié)點(diǎn)啟動(dòng)。這是因?yàn)樽詈笠粋€(gè)下線的節(jié)點(diǎn)數(shù)據(jù)是最新的。將其作為首節(jié)點(diǎn)啟動(dòng),然后讓其他節(jié)點(diǎn)與該節(jié)點(diǎn)進(jìn)行數(shù)據(jù)同步,這樣才能保證集群中的數(shù)據(jù)是最新的。否則,可能會(huì)導(dǎo)致集群中的數(shù)據(jù)是某個(gè)時(shí)間點(diǎn)之前的舊數(shù)據(jù)。
3、如果PXC節(jié)點(diǎn)都是意外退出的,而且不是在同一時(shí)間退出的情況
在本文開(kāi)頭提到過(guò),PXC集群中一半以上的節(jié)點(diǎn)因意外宕機(jī)而無(wú)法訪問(wèn)時(shí),PXC集群就會(huì)停止運(yùn)行。但如果這些PXC節(jié)點(diǎn)是以安全下線的方式退出,則不會(huì)引發(fā)集群自動(dòng)停止運(yùn)行的問(wèn)題,只會(huì)縮小集群的規(guī)模。只有意外下線一半以上節(jié)點(diǎn)時(shí)集群才會(huì)自動(dòng)停止,意外下線的情況包括:
- 宕機(jī)、掛起、關(guān)機(jī)、重啟、斷電、斷網(wǎng)等等,反正就是沒(méi)有使用相應(yīng)的停止命令安全下線節(jié)點(diǎn)都屬于意外下線
只要PXC集群中的節(jié)點(diǎn)不是同時(shí)意外退出的,那么當(dāng)集群還剩一個(gè)節(jié)點(diǎn)時(shí),該節(jié)點(diǎn)就會(huì)自動(dòng)將grastate.dat
文件中的safe_to_bootstrap
值改為1
。所以在重啟集群時(shí),也是先啟動(dòng)最后一個(gè)退出的節(jié)點(diǎn)。
4、如果PXC節(jié)點(diǎn)都是同時(shí)意外退出的,則需要修改grastate.dat
文件
當(dāng)集群中所有節(jié)點(diǎn)都是在同一時(shí)間因意外情況而退出,那么此時(shí)所有節(jié)點(diǎn)的safe_to_bootstrap
都為0
,因?yàn)闆](méi)有一個(gè)節(jié)點(diǎn)來(lái)得及去修改safe_to_bootstrap
的值。當(dāng)所有節(jié)點(diǎn)的safe_to_bootstrap
均為0
時(shí),PXC集群是無(wú)法啟動(dòng)的。
在這種情況下我們就只能手動(dòng)選擇一個(gè)節(jié)點(diǎn),將safe_to_bootstrap
修改為1
,然后將該節(jié)點(diǎn)作為首節(jié)點(diǎn)進(jìn)行啟動(dòng):
[root@PXC-Node1 ~]# vim /var/lib/mysql/grastate.dat
...
safe_to_bootstrap: 1
[root@PXC-Node1 ~]# systemctl start mysql@bootstrap.service
接著再依次啟動(dòng)其他節(jié)點(diǎn)即可:
[root@PXC-Node2 ~]# systemctl start mysqld
5、如果集群中還有可運(yùn)行的節(jié)點(diǎn),那么其他下線的節(jié)點(diǎn)只需要按普通節(jié)點(diǎn)上線即可
[root@PXC-Node2 ~]# systemctl start mysqld