背景
因為客戶有一套PXC(Percona Xtradb Cluster)集群,有運維的需求,所以需要研究和測試PXC,現整理一套完整的搭建PXC標准文檔,以供后面測試和學習用途。
mariadb的MGC(MariaDB Galera Cluster)集群仿造percona的PXC集群的,都是基於Totem協議的第三方插件Galera Cluster的數據同步技術的多主高可用解決方案,原理和搭建步驟都是一樣的,所以本文也可以用於指導MGC集群的搭建。
架構圖
PXC的特點
優點
- 多主架構
- 真正的多點讀寫集群,在任何時候讀寫的數據都是最新的。
- 同步復制
- 集群不同節點之間的數據同步,沒有延遲,在數據庫掛掉之后,數據不會丟失
- 並發復制
- 從節點在APPLY數據時,支持並行執行,有更好的性能表現
- 故障切換
- 因為支持多點寫入,所以在出現數據庫故障時可以很容易地進行故障切換
- 熱插拔
- 在服務期間,如果數據庫掛了,只要監控程序發現得夠快,不可服務時間就會非常少。在節點故障期間,節點本身對集群的影響非常小
- 自動節點克隆
- 在新增節點或停機維護時,增量數據或基礎數據不需要人工手動備份提供,Galera Cluster會自動拉取在線節點數據,集群最終會變為一致。
- 對應用透明
集群的維護,對應用是透明的,幾乎感覺不到。
缺點
- 短板效應
- 集群寫入性能取決於性能最差那台機器,所以建議配置相同
- 鎖沖突嚴重
- 建議單節點寫+負載均衡
- 或者寫不同的庫
- 全量SST時,donor節點性能影響較為嚴重,receiver恢復較慢
- 盡量避免SST
- 維護成本高,限制和注意事項較多
搭建指引
機器准備
Node | Host | IP |
---|---|---|
Node 1 | pxc1 | 192.168.1.101 |
Node 2 | pxc2 | 192.168.1.102 |
Node 3 | pxc3 | 192.168.1.103 |
避免創建具有兩個或任意偶數節點的群集,因為這可能導致腦裂。
安裝前准備
- 三台服務器互相免密登錄
SST全量同步是需要用到xtrabackup的遠程流備份功能,這需要免密登錄
- 關閉iptables/firewall
- 關閉SELinux
#建立免密
略
#關閉selinux
#selinux配置文件修改
vim /etc/selinux/config
SELINUX=disabled
#臨時在線關閉selinux
setenforce 0
#關閉防火牆
systemctl stop firewalld
systemctl disable firewalld
為的是確保以下端口未被防火牆阻止或被其他軟件使用。Percona XtraDB Cluster需要它們進行通信。
默認值如下:
3306 : 數據庫對外服務的端口號
4444 : 請求SST SST: 指數據一個鏡象傳輸 xtrabackup , rsync ,mysqldump
4567 : 組成員之間進行溝通的一個端口號
4568 : 傳輸IST用的。相對於SST來說的一個增量。
安裝
本指引區別於官方文檔的rpm部署方式,本文檔采用是二進制的規范部署方式。
使用yum/rpm安裝是最簡單的,但其有如下缺點:
- 因為其自動解決了軟件依賴問題,不方便新手學習和熟悉PXC架構的組件。
- 有些客戶的內網環境yum源是內部的,不太方便采用yum安裝
- yum安裝后的文件目錄放得太亂,不適合生產環境的規范部署。
安裝依賴
yum install -y libaio
各節點PXC軟件的下載和安裝
請記住,PXC軟件包其實是帶Galera組件的percona server集合,請勿再重復下載percona server,更不要下載其他mysql版本,因為只有percona server可以搭建PXC集群!
#下載ssl102還是ssl102,取決於你openssl的版本
[root@pxc1 /]# openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017
wget https://www.percona.com/downloads/Percona-XtraDB-Cluster-LATEST/Percona-XtraDB-Cluster-5.7.26-31.37/binary/tarball/Percona-XtraDB-Cluster-5.7.26-rel29-31.37.1.Linux.x86_64.ssl102.tar.gz
#解壓安裝
tar -zxvf Percona-XtraDB-Cluster-5.7.26-rel29-31.37.1.Linux.x86_64.ssl102.tar.gz -C /opt
ln -s /opt/Percona-XtraDB-Cluster-5.7.26-rel29-31.37.1.Linux.x86_64.ssl102/ /usr/local/mysql
#添加mysql組和mysql用戶
groupadd mysql
useradd -M -g mysql -s /sbin/nologin -d /usr/local/mysql mysql
#創建MySQL數據目錄
mkdir -p /database/mysql/data/3306
chown mysql:mysql /database/mysql/data/3306 -R
#設置環境變量
echo 'export PATH=/usr/local/mysql/bin/:$PATH' >>/etc/profile
source /etc/profile
創建配置文件
vi /etc/my.cnf
要注意pxc的my.cnf有一些配置是必須的,三台server的my.cnf配置分別如下(只包含最小滿足pxc需求的配置)
三台機器配置的內容分別如下:
### pxc1 | 192.168.1.101
### 右邊#號的是percona server默認值
[mysqld]
####: mysqld基本設置
user =mysql # mysql
basedir =/usr/local/mysql/ # /usr/local/mysql/
datadir =/database/mysql/data/3306 # /usr/local/mysql/data
character_set_server =utf8 # latin1
log_timestamps =system # utc
skip_name_resolve =1 # 0
lower_case_table_names =1 # 0
####: pxc必須滿足的
server-id =101 # 0 #注意三台服務器的設置不同
binlog_format =row # row
default_storage_engine =InnoDB # InnoDB
innodb_autoinc_lock_mode =2 # 1
#### pxc配置
wsrep_node_name=pxc1 #注意三台服務器的設置不同。可以不配置,不配置時默認取hostname
wsrep_node_address=192.168.1.101:4567 #注意三台服務器的設置不同。可以不加端口,默認就是4567的pxc通訊端口,請注意不是mysql的3306監聽端口!
wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so
wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://192.168.1.101:4567,192.168.1.102:4567,192.168.1.103:4567
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sstuser:passw0rd
pxc_strict_mode=ENFORCING
### pxc2 | 192.168.1.102
### 右邊#號的是percona server默認值
[mysqld]
####: mysqld基本設置
user =mysql # mysql
basedir =/usr/local/mysql/ # /usr/local/mysql/
datadir =/database/mysql/data/3306 # /usr/local/mysql/data
character_set_server =utf8 # latin1
log_timestamps =system # utc
skip_name_resolve =1 # 0
lower_case_table_names =1 # 0
####: pxc必須滿足的
server-id =102 # 0 #注意三台服務器的設置不同
binlog_format =row # row
default_storage_engine =InnoDB # InnoDB
innodb_autoinc_lock_mode =2 # 1
#### pxc配置
wsrep_node_name=pxc2 #注意三台服務器的設置不同。可以不配置,不配置時默認取hostname
wsrep_node_address=192.168.1.102:4567 #注意三台服務器的設置不同。可以不加端口,默認就是4567的pxc通訊端口,請注意不是mysql的3306監聽端口!
wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so
wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://192.168.1.101:4567,192.168.1.102:4567,192.168.1.103:4567
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sstuser:passw0rd
pxc_strict_mode=ENFORCING
### pxc3 | 192.168.1.103
### 右邊#號的是percona server默認值
[mysqld]
####: mysqld基本設置
user =mysql # mysql
basedir =/usr/local/mysql/ # /usr/local/mysql/
datadir =/database/mysql/data/3306 # /usr/local/mysql/data
character_set_server =utf8 # latin1
log_timestamps =system # utc
skip_name_resolve =1 # 0
lower_case_table_names =1 # 0
####: pxc必須滿足的
server-id =103 # 0 #注意三台服務器的設置不同
binlog_format =row # row
default_storage_engine =InnoDB # InnoDB
innodb_autoinc_lock_mode =2 # 1
#### pxc配置
wsrep_node_name=pxc3 #注意三台服務器的設置不同。可以不配置,不配置時默認取hostname
wsrep_node_address=192.168.1.103:4567 #注意三台服務器的設置不同。可以不加端口,默認就是4567的pxc通訊端口,請注意不是mysql的3306監聽端口!
wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so
wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://192.168.1.101:4567,192.168.1.102:4567,192.168.1.103:4567
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sstuser:passw0rd
pxc_strict_mode=ENFORCING
安裝xtrabackup
因為底層的底層全量補數據,依靠的是wsrep_sst_xtrabackup-v2腳本,調用的是xtrabackup那一套備份恢復工具,所以我們必須提前安裝xtrabackup了。
# 請到percona官網下載對應操作系統版本的rpm包
# 我這里下載的是centos7版本
# wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.14/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.14-1.el7.x86_64.rpm
# qpress需要百度第三方下載, centos6、centos7通用,直接拷貝可以用
# 實際上測試發現,解壓直接拷貝以下五個文件也可以用,不需要rpm安裝
cp xtrabackup xbstream qpress wsrep_sst_xtrabackup-v2 socat /usr/sbin
chmod +x /usr/sbin/xtrabackup
chmod +x /usr/sbin/xbstream
chmod +x /usr/sbin/qpress
chmod +x /usr/sbin/wsrep_sst_xtrabackup-v2
chmod +x /usr/sbin/socat
快捷通道: https://pan.baidu.com/s/179mV0QidiiMqdROGUFBZXQ 提取碼: vcvg
各個節點無密碼初始化
mysqld --defaults-file=/etc/my.cnf --initialize-insecure
引導第一個節點
### pxc1 | 192.168.1.101
#啟動
mysqld_safe --defaults-file=/etc/my.cnf --wsrep-new-cluster &
#改密碼
mysql #無密碼登錄
mysql> set password='fander';
Query OK, 0 rows affected (0.00 sec)
###創建SST用戶 #SST是什么,文章最后會講
#這個其實是使用xtrabackup的權限。
mysql> CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 'passw0rd';
mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO
'sstuser'@'localhost';
mysql> FLUSH PRIVILEGES;
# 賬號、密碼,要和配置文件的wsrep_sst_auth=sstuser:passw0rd 對應
引導第二、三個節點
#第二、三個節點以正常方式拉起就可以了。
mysqld_safe --defaults-file=/etc/my.cnf &
檢查測試
#主要看下面的參數
mysql> show status like 'wsrep%';
+----------------------------+--------------------------------------+
| Variable_name | Value |
+----------------------------+--------------------------------------+
| wsrep_local_state_uuid | c2883338-834d-11e2-0800-03c9c68e41ec |
| ... | ... |
| wsrep_local_state | 4 |
| wsrep_local_state_comment | Synced |
| ... | ... |
| wsrep_cluster_size | 1 |
| wsrep_cluster_status | Primary #為Primary即正常拉起 |
| wsrep_connected | ON |
| ... | ... |
| wsrep_ready | ON |
+----------------------------+--------------------------------------+
40 rows in set (0.01 sec)
# 如果三台機器以下兩個狀態值均如下,則集群正常
mysql> show status like 'wsrep_local_state_comment';
+---------------------------+--------+
| Variable_name | Value |
+---------------------------+--------+
| wsrep_local_state_comment | Synced |
+---------------------------+--------+
1 row in set (0.00 sec)
mysql> show status like 'wsrep_cluster_status';
+----------------------+---------+
| Variable_name | Value |
+----------------------+---------+
| wsrep_cluster_status | Primary |
+----------------------+---------+
1 row in set (0.00 sec)
測試多點寫入,是否能復制成功。
### pxc1 | 192.168.1.101
mysql> create database fander1;
Query OK, 1 row affected (0.00 sec)
### pxc2 | 192.168.1.102
mysql> create database fander2;
Query OK, 1 row affected (0.00 sec)
### pxc3 | 192.168.1.103
mysql> create database fander3;
Query OK, 1 row affected (0.00 sec)
三台機器查看數據是否一致
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| fander1 |
| fander2 |
| fander3 |
| mysql |
| performance_schema |
| sys |
+--------------------+
7 rows in set (0.02 sec)
補充
PXC傳輸數據有兩種方式
IST: Incremental State Transfer 增量同步
SST:State Snapshot Transfer 全量同步
SST 全量同步底層用的同步方法取決於參數wsrep_sst_method的設置,xtrabackup-v2是最好的方法,其他可選值包括rsync、mysqldump等,rsync速度最快但會阻塞讀寫,mysqldump非常慢根本不建議用。 雖然xtrabackup很好,但數據量大的情況下,對donor的性能影響巨大,同步時間也不可接受,所以應該盡可能避免SST
什么情況下用SST?
答案是,優先使用IST,無法使用IST時,則SST。
IST 發生的條件:This is done using caching mechanism on nodes (即只發生在之前集群里的節點數據還有在緩存中)
所以
- 為了避免SST,建議一:
調大數據緩存的空間,默認值是128M,建議按情況調大,個人建議可以調為2GB
vi /etc/my.cnf
wsrep_provider_options='gcache.size=2G'
down機時間過久,導致緩存沒法緩存所有增量數據時,會走SST,有辦法避免嗎?
- 為了避免SST,建議二:
我們可以讓脫離集群的節點通過建立與主節點建立主從復制,等復制完成后關機,並偽造一個grastate.dat,來記錄備份數據的seqno,這樣當新節點啟動時就會自動用IST的方法來進行,而不是SST(注意gcache.size應該有足夠的容量來保證在備份及恢復這段時間內新產生的數據都被緩存到)
PXC使用的限制
-
復制僅適用於InnoDB存儲引擎。其他存儲引擎的表的寫入都不復制(包括mysql.表)。但是,DDL語句會在statement級別進行復制,對mysql.表的更改將以這種方式進行復制。因此您使用
CREATE USER...
命令,而不應該使用INSERT INTO mysql.user...
。
當然您也可以使用wsrep_replicate_myisam
變量啟用實驗性的MyISAM復制支持。 -
不支持的查詢:
- 在多主設置中,不支持
LOCK TABLES
和UNLOCK TABLES
- 同樣的,Lock functions如
GET_LOCK()
,RELEASE_LOCK()
也不支持
- 在多主設置中,不支持
general.log、slow.log不支持輸出到TABLE,如果啟用general.log、slow.log,則必須將日志輸出到文件:
log_output = FILE
有坑,官檔寫着不支持,實際上可以設置輸出到table,只是會有嚴重的鎖沖突,導致性能問題,嚴重時導致mysqld崩潰。
-
允許的最大事務大小由wsrep_max_ws_rows和wsrep_max_ws_size變量定義。
LOAD DATA INFILE
處理將(按參數設置)每10000行提交一次。因此大事務LOAD DATA
時將被拆分為一系列小事務。 -
由於集群級的樂觀並發控制,事務在COMMIT階段可能仍會中止。可以有兩個事務寫入相同的行並在單獨的Percona XtraDB Cluster節點中提交,並且只有其中一個可以成功提交。失敗的將被中止。對於集群級中止,Percona XtraDB Cluster提供了死鎖錯誤代碼:
(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)).
-
由於可能在提交時回滾,因此不支持XA事務。
-
整個集群的寫吞吐量受最弱節點的限制。如果一個節點變慢,則整個群集速度變慢。如果您對穩定的高性能有要求,則應該由相應的硬件支持。
-
群集的最小建議大小是3個節點。第三個節點會是仲裁者。
-
不支持InnoDB虛假更改功能。
-
enforce_storage_engine=InnoDB與wsrep_replicate_myisam=OFF(默認)不兼容 。
-
在群集模式下運行Percona XtraDB群集時,請避免
ALTER TABLE ... IMPORT/EXPORT
操作。如果未在所有節點上同步執行,則可能導致節點數據不一致。 -
所有表必須具有主鍵。這可確保相同的行在不同節點上以相同的順序出現。DELETE沒有主鍵的表的語句不被支持。