1. PXC簡介
Percona XtraDB Cluster(下文簡稱PXC)是一個開源的MySQL高可用的解決方案,它內建了Percona伺服器和Percona XtraBackup和Galera庫共同運用的同步多主複制,也就是說PXC是基于Galere協定的高可用方案,Galera是Codership提供的多主資料同步複制機制,可以實作多個節點間的資料同步複制以及讀寫,并且可保障資料庫的服務高可用及資料一緻性。基于Galera的高可用方案主要有MariaDB Galera Cluster和Percona XtraDB Cluster,目前PXC用的會比較多一些,
- PXC是由節點組成的,推薦配置至少3個節點,但是也可以運作在2個節點上;
- 每個節點都是普通的MySQL/Percona伺服器,可以将現有的資料庫伺服器組成叢集,反之,也可以将叢集拆分成單獨的伺服器;
- 每個節點都包含完整的資料副本;
- MariaDB的叢集原理跟PXC一樣,maridb-cluster其實就是PXC,兩者原理是一樣的。
2. PXC特性
- 同步複制,事務要麼在節點中都送出要麼不送出;
- 多主複制,可以在任意節點進行Write-Read操作;
- 在從伺服器上并行應用事件,真正意義上的并行複制;
- 節點自動配置,資料一緻性,不再是異步複制;
- PXC最大的優勢:強一緻性、無同步延遲
3. PXC優缺點
- 優點:
- 服務高可用;
- 資料同步複制(并發複制),幾乎無延遲;
- 多個節點支援同時讀寫,可實作寫擴充,不過最好事先進行分庫分表,讓各個節點分别寫不同的庫或者表,避免讓galera解決資料沖突;
- 新節點可以自動部署,部署操作簡單;
- 資料嚴格一緻性,尤其适合電商類應用(訂單,金額等敏感資料);
- 完全相容MySQL。
- 缺點:
- 隻支援InnoDB引擎;低版本(5.6.20)的複制隻支援InnoDB引擎,其他存儲引擎的更改不複制。然而,DDL(Data Definition Language) 語句在statement級别被複制,并且,對mysql.*表的更改會基于此被複制。例如CREATE USER…語句會被複制,但是 INSERT INTO mysql.user…語句則不會;
- PXC叢集一緻性控制機制,事有可能被終止,原因如下:叢集允許在兩個節點上同時執行操作同一行的兩個事務,但是隻有一個能執行成功,另一個會被終止,叢集會給被終止的。用戶端傳回死鎖錯誤(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK));
- 寫入效率取決于節點中最弱的一台,因為PXC叢集采用的是強一緻性原則,一個更改操作在所有節點都成功才算執行成功;
- 所有表都需要有主鍵;
- 叢集吞吐量/性能取決于短闆;
- 新加入節點采用SST時代價高;
- 鎖沖突、死鎖問題相對更多。
4. PXC常識
-
端口号
3306:資料庫對外服務的端口号;
4444:請求SST SST: 指資料一個鏡像傳輸 xtrabackup , rsync ,mysqldump;
4567: 組成員之間進行溝通的一個端口号;
4568: 傳輸IST用的。相對于SST來說的一個增量。
-
名詞介紹
WS:write set 寫資料集
IST: Incremental State Transfer 增量同步
SST:State Snapshot Transfer 全量同步
-
狀态機變化階段
OPEN: 節點啟動成功,嘗試連接配接到叢集,如果失敗則根據配置退出或建立新的叢集;
PRIMARY: 節點處于叢集PC中,嘗試從叢集中選取donor進行資料同步;
JOINER: 節點處于等待接收/接收資料檔案狀态,資料傳輸完成後在本地加載資料;
JOINED: 節點完成資料同步工作,嘗試保持和叢集進度一緻;
SYNCED:節點正常提供服務:資料的讀寫,叢集資料的同步,新加入節點的sst請求;
DONOR(貢獻資料者):節點處于為新節點準備或傳輸叢集全量資料狀态,對用戶端不可用。
-
狀态機變化因素
新節點加入叢集;
節點故障恢複;
節點同步失敗。
-
傳輸SST的方法
mysqldump、xtrabackup、rsync
-
配置檔案各項配置意義
wsrep_provider:指定Galera庫的路徑
wsrep_cluster_name:Galera叢集的名稱
wsrep_cluster_address:Galera叢集中各節點位址。位址使用組通信協定gcomm://(group communication)
wsrep_node_name:本節點在Galera叢集中的名稱
wsrep_node_address:本節點在Galera叢集中的通信位址
wsrep_sst_method:state_snapshot_transfer(SST)使用的傳輸方法,可用方法有mysqldump、rsync和xtrabackup,前兩者在傳輸時都需要對Donor加全局隻讀鎖(FLUSH TABLES WITH READ LOCK),xtrabackup則不需要(它使用percona自己提供的backup lock)。強烈建議采用xtrabackup
wsrep_sst_auth:在SST傳輸時需要用到的認證憑據,格式為:“使用者:密碼”
pxc_strict_mode:是否限制PXC啟用正在試用階段的功能,ENFORCING是預設值,表示不啟用
binlog_format:二進制日志的格式。Galera隻支援row格式的二進制日志
default_storage_engine:指定預設存儲引擎。Galera的複制功能隻支援InnoDB
innodb_autoinc_lock_mode:隻能設定為2,設定為0或1時會無法正确處理死鎖問題
5. PXC叢集搭建
5.1 環境描述
本文檔所涉及IP均為虛假IP。
Name | IP |
---|---|
master | 192.168.5.139 |
test1 | 192.168.5.138 |
test2 | 192.168.5.137 |
三個節點上的iptables與firewalld需先關閉,否則應開放3306、4444、4567、4568端口的通路,同時應關閉selinux。
5.2 安裝PXC
# 三台主機都需執行,安裝Persona倉庫
$ yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
# 執行指令修改SELINUX項
$ vi /etc/selinux/config
SELINUX=disabled # 修改該項為disabled
# Seliux安全子產品可能會對Percona XtraDB叢集的資料進行限制通路,最好的方法是更改模式為許可
$ setenforce 0
# 安裝PXC
$ yum -y --nogpgcheck install Percona-XtraDB-Cluster-57
# 開放相應端口(如無開啟防火牆可忽略)
$ firewall-cmd --zone=public --add-port=3306/tcp --permanent
$ firewall-cmd --zone=public --add-port=4444/tcp --permanent
$ firewall-cmd --zone=public --add-port=4567/tcp --permanent
$ firewall-cmd --zone=public --add-port=4568/tcp --permanent
$ firewall-cmd --reload
# 開啟PXC服務
$ systemctl start mysqld.service
5.3 接入MySQL
# 查詢MySQL臨時生成密碼
$ cat /var/log/mysqld.log | grep password
2019-06-28T10:02:12.733076Z 5 [Note] [MY-010454] [Server] A temporary password is generated for [email protected]: rldW%6_5J3h<
# 進入MySQL登入
$ mysql -u root -p
# 使用上述的臨時密碼進行登入
Enter password: rldW%6_5J3h<
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.7.26-29-57-log Percona XtraDB Cluster (GPL), Release rel29, Revision 03540a3, WSREP version 31.37, wsrep_31.37
# 通過指令修改登入密碼
mysql> alter user 'root'@'localhost' identified with mysql_native_password by '所要修改的密碼需包含大小寫字母、數字及特殊符号';
預設密碼檢查政策要求必須包含:大小寫字母、數字和特殊符号,并且長度不能少于8位,否則會提示ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。
5.4 遠端通路授權
# 建立遠端通路使用者
mysql> create user 'root'@'%' identified with mysql_native_password by '遠端通路密碼';
Query OK, 0 rows affected (0.01 sec)
# 允許通路權限
mysql> grant all privileges on *.* to 'root'@'%' with grant option;
Query OK, 0 rows affected (0.01 sec)
# 重新整理權限清單
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
5.5 PXC配置
下述配置根據節點不同進行配置。
# 停止MySQL服務
$ systemctl stop mysqld
# 修改配置檔案 配置節點
$ vi /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
# 叢集中節點的IP位址(本機填最後)
wsrep_cluster_address=gcomm://ip位址,IP位址,本機IP位址(用,号隔開)
# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW
# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB
# Slave thread to use
wsrep_slave_threads= 8
wsrep_log_conflicts
# This changes how InnoDB autoincrement locks are managed and is a requirement for Galera
innodb_autoinc_lock_mode=2
# Node IP address
# 目前節點IP
wsrep_node_address=IP位址
# Cluster name
# 叢集名稱
wsrep_cluster_name=pxc-cluster
#If wsrep_node_name is not specified, then system hostname will be used
# 目前節點名稱
wsrep_node_name=pxc-cluster-node-1
#pxc_strict_mode allowed values: DISABLED,PERMISSIVE,ENFORCING,MASTER
# 不使用實驗功能
pxc_strict_mode=ENFORCING
# SST method
#狀态快照傳輸(sst)方法,官方建議
wsrep_sst_method=xtrabackup-v2
#Authentication for SST method
# 使用者憑證——用于同步(mysql的使用者名和密碼)
wsrep_sst_auth="使用者名:密碼"
6. PXC初始化主節點
# 其中一個節點使用以下指令啟動
$ systemctl start [email protected]
# 登入MySQL
$ mysql -u root -p
# 開啟wsrep_causal_reads
mysql> set wsrep_causal_reads =1;
# 建立配置檔案中對應的使用者(此步驟所有節點的IP都需要建立)
mysql> create user '對應配置檔案的使用者名'@'%' identified with mysql_native_password by '對應配置檔案的密碼';
# 給予權限
mysql> grant all privileges on *.* to '使用者名'@'%' with grant option;
# 重新整理權限表
mysql> flush privileges;
7. 啟動其他節點
# 其他節點采用以下指令進行啟動
$ systemctl start mysqld
# 同時根據上述 6 步驟進行配置
# 開啟wsrep_causal_reads
mysql> set wsrep_causal_reads =1;
# 建立配置檔案中對應的使用者(此步驟所有節點的IP都需要建立)
mysql> create user '對應配置檔案的使用者名'@'%' identified with mysql_native_password by '對應配置檔案的密碼';
# 給予權限
mysql> grant all privileges on *.* to '使用者名'@'%' with grant option;
# 重新整理權限表
mysql> flush privileges;
# 驗證叢集
mysql> show status like 'wsrep%';
+----------------------------------+---------------------------------------+
| Variable_name | Value |
+----------------------------------+---------------------------------------+
| wsrep_local_state_uuid | 8cae2eb0-9ccb-11e9-afcb-5ea6cd71dc63 |
| wsrep_protocol_version | 9 |
...
| wsrep_incoming_addresses | 192.168.5.137:3306,192.168.5.138,192.168.5.139:3306 |
| wsrep_cluster_weight | 3 |
| wsrep_desync_count | 0 |
| wsrep_evs_delayed | |
| wsrep_evs_evict_list | |
| wsrep_evs_repl_latency | 0/0/0/0/0 |
| wsrep_evs_state | OPERATIONAL |
| wsrep_gcomm_uuid | 380130ce-9ccd-11e9-9386-6a21f3d1896f |
| wsrep_cluster_conf_id | 6 |
| wsrep_cluster_size | 3 |
| wsrep_cluster_state_uuid | 8cae2eb0-9ccb-11e9-afcb-5ea6cd71dc63 |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| wsrep_local_bf_aborts | 0 |
...
| wsrep_ready | ON |
+----------------------------------+---------------------------------------+
71 rows in set (0.05 sec)
至此PXC叢集搭建完成,可通過建庫驗證節點是否同步。
服務的啟動和停止要對應
systemctl stop mysqld ------> 啟動時用systemctl start mysqld
或者
systemctl stop [email protected] -----> 啟用是用 systemctl start [email protected]
如果忘記root密碼,則按以下操作恢複:
在[mysqld]的段中加上一句:skip-grant-tables 儲存并且退出vi。
mysql -u root
update mysql.user set authentication_string=password('123qwe') where user='root' and Host = 'localhost';
flush privileges