PXC是percona公司的percona xtraDB cluster,簡稱PXC。它是基于Galera協定的高可用叢集方案。可以實作多個節點間的資料同步複制以及讀寫,并且可保障資料庫的服務高可用及資料強一緻性。
PXC架構圖:

三個節點都已經啟動成功,這樣在任意一個節點上面,執行一條DML語句的操作,都會同步到另外兩個節點
PXC就屬于一套近乎完美的MySQL高可用叢集架構方案;
優點總結:
1.可以達到時時同步,無延遲現象發生
2.完全相容MySQL
3.對于叢集中新節點的加入,維護起來很簡單
4.資料的強一緻性
不足之處總結:
1.隻支援Innodb存儲引擎
2.存在多節點update更新問題,也就是寫放大問題
3.線上DDL語句,鎖表問題
4.sst針對新節點加入的傳輸代價過高的問題
實戰過程:
環境介紹:3台centos 7
walt001
192.168.150.138
walt002
192.168.150.139
walt003
192.168.150.143
安裝之前的注意事項:
三台機器的防火牆iptables都要關閉,三台機器的server-id不能一樣。
PXC軟體包下載下傳:
xtrabackup下載下傳位址
https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.6/binary/tarball/percona-xtrabackup-2.4.6-Linux-x86_64.tar.gz
Percona-XtraDB-Cluster下載下傳
https://www.percona.com/downloads/Percona-XtraDB-Cluster-56/Percona-XtraDB-Cluster-5.6.26-25.12/binary/tarball/Percona-XtraDB-Cluster-5.6.26-rel74.0-25.12.1.Linux.x86_64.tar.gz
這裡我下載下傳的是:Percona-XtraDB-Cluster-5.6.26-rel74.0-25.12.1.Linux.x86_64
接下來三台機器上都需要針對基礎軟體包進行安裝,使用yum安裝即可,解決依賴性。
三台機器都需要操作的步驟:
· 把IP和主機名寫到hosts檔案裡(這個不是主要項,友善主機名解析而已,我沒有完全一樣的hosts結果也成功,不成功 不用在這裡糾結)
[root@xxx]# cat /etc/hosts
192.168.150.138 walt001
192.168.150.139 walt002
192.168.150.143 walt003
因為pxc本身包含mysql主程式,為防止端口占用删除多餘資料庫安裝包
yum remove mariadb-* -y
安裝依賴
yum install perl-IO-Socket-SSL.noarch perl-DBD-MySQL.x86_64 perl-Time-HiRes openssl openssl-devel socat -y
提前告訴你,如果系統是最小化安裝事先做這兩個軟連接配接避免初始化報庫檔案缺失錯誤。
[root@xxx ~]# ln -sv /usr/lib64/libcrypto.so.10 /lib64/libcrypto.so.6
[root@xxx ~]# ln -sv /usr/lib64/libssl.so.10 /lib64/libssl.so.6
定位到解壓目錄
[root@xxx ~]# cd /usr/local/
[root@xxx local]# tar xvf /rrot/percona-xtrabackup-2.4.6-Linux-x86_64.tar.gz
[root@xxx local]# tar xvf /root/Percona-XtraDB-Cluster-5.6.26-rel74.0-25.12.1.Linux.x86_64.tar.gz
建個軟連接配接,友善使用
[root@xxx local]# ln -sv Percona-XtraDB-Cluster-5.6.26-rel74.0-25.12.1.Linux.x86_64 mysql
[root@xxx local]# useradd -s /sbin/nologin mysql
[root@xxx local]# chown mysql.mysql -R mysql
[root@xxx local]# cp percona-xtrabackup-2.4.6-Linux-x86_64/bin/* mysql/bin/
[root@xxx local]# mkdir -p /data/mysql
[root@xxx local]# chown mysql.mysql -R /data/mysql/
先配置第一台機器,并成功啟動後再配置其他兩台
在第一台主機上建立配置檔案:
建立配置檔案:
[root@xxx local]# vim /etc/my.cnf
把這個檔案寫好了,傳到其他兩台機器的 /etc 下面,修改 server-id 和 wsrep_node_address
每個主機的server-id 和wsrep_node_address 保持不同即可
初始化資料:
/usr/local/mysql/scripts/mysql_install_db –basedir=/usr/local/mysql –datadir=/data/mysql/ –defaults-file=/etc/my.cnf –user=mysql
複制程序檔案到系統服務目錄,啟動第一節點的服務:
[root@xxx local]#cd /usr/local/mysql/support-files
[root@xxx support-files]#cp mysql.server /etc/init.d/mysql
[root@xxx support-files]# /etc/init.d/mysql bootstrap-pxc
建立環境變量,讓系統變量讀到MySQL的路徑:
[root@xxx opt]# echo “export PATH=$PATH:/usr/local/mysql/bin” > /etc/profile.d/mysql.sh && source /etc/profile.d/mysql.sh
登陸或者初始化的時候提示缺少庫檔案,find指令依次查找庫檔案做軟連接配接到/lib64
[root@xxx ~]# find / -name “libreadline*
/usr/lib64/libreadline.so.6
/usr/lib64/libreadline.so.6.2
[root@xxx ~]# ln -sv /usr/lib64/libreadline.so.6 /lib64/libreadline.so.5
啟動成功之後,維護資料庫環境并建立使用者
進入資料庫 ,預設密碼是空的
#mysql -uroot -p
mysql> delete from mysql.user where user!=’root’ or host!=’localhost’;
mysql> grant all privileges on *.* to ‘sst‘@’%’ identified by ‘zs’;
mysql> grant all privileges on *.* to ‘sst’@’localhost’ identified by ‘zs’;
mysql> flush privileges; #mysql 5.6以後這個指令可以不用,授權都是立即生效的
安裝步驟和上面相同,隻要保證配置檔案的server-id 和wsrep_node_address 不同即可
wsrep_node_address 填寫目前機器的IP
啟動指令和第一台不同,用下面的指令啟動:
[root@xxx mysql]# /etc/init.d/mysql start
第二台動後檢視叢集狀态:
在第一個機器上執行:
[root@xxx mysql]#mysql -v #空密碼的狀态下這個指令可以直接登入mysql
mysql> show status like ‘wsrep%’;
注意:我一開始第二台怎麼都啟動不了, 刷日志發現一直連接配接逾時,各種抓狂,然後試着遠端連接配接mysql 失敗,想到應該是被防火牆擋住了,出現開頭那個報錯
#關閉selinux,防火牆打開pxc所需端口,或者取消注釋直接關閉防火牆
sed -i s/”SELINUX=enforcing”/”SELINUX=disabled”/g /etc/selinux/config #reboot後生效
setenforce 0 #臨時關閉selinux
#systemctl stop firewalld
#systemctl disable firewalld
#iptables -F
firewall-cmd –zone=public –add-port=80/tcp –permanent
firewall-cmd –zone=public –add-port=3306/tcp –permanent
firewall-cmd –zone=public –add-port=4567/tcp –permanent
firewall-cmd –zone=public –add-port=4568/tcp –permanent
firewall-cmd –zone=public –add-port=4444/tcp –permanent
firewall-cmd –reload
生産環境還是添加端口為好,有硬體防火牆,直接關閉系統防火牆即可。
後面的第三台,第xx台就沒什麼問題了。叢集建立成功後,執行 mysql_secure_installation 來安全初始化。
安全初始化如果報錯(機率不大)可以嘗試登入mysql執行:
set global wsrep_provider_options=”pc.bootstrap = yes”;
當然在生産環境,我還是小心的配置了ip通路限制,安全才是王道。
注意:
全部關閉需要采用滾動關閉方式:
1. 關閉node1,修複完後,啟動加回來;
2. 關閉node2, 修複完後,啟動加回來;
3. ………………….,直到最後一個節點
4. 原則要保持Group裡最少一個成員活着
資料庫關閉之後,最會儲存一個last Txid,是以啟動時,先要啟動最後一個關閉的節點,啟動順序和關閉順序剛好相反。
wsrep_recover=on參數在啟動時加入,用于從log中分析gtid。
怎樣避免關閉和啟動時資料丢失?
1. 所有的節點中最少有一個線上,進行滾動重新開機;
2. 利用主從的概念,把一個從節點轉化成PXC裡的節點。
pxc注意的問題
1. 腦裂
任何指令執行出現unkown command ,表示出現腦裂,叢集兩節點間4567端口連不通,無法提供對外服務。
SET GLOBAL wsrep_provider_options=”pc.ignore_sb=true”;
2. 并發寫
三個節點的自增起始值為1、2、3,步長都為3,解決了insert問題,但update同時對一行操作就會有問題,出現:Error: 1213 SQLSTATE: 40001,是以更新和寫入在一個節點上操作。
3. DDL
引起全局鎖,采用:pt-online-schema-change
4. MyISAM引擎不能被複制,隻支援innodb
5. pxc結構裡面必須有主鍵
如果沒有主建,有可能會造成集中每個節點的Data page裡的資料不一樣
6. 不支援表級鎖
不支援lock /unlock tables
7. pxc裡隻能把slow log ,query log 放到File裡
8. 不支援XA事務
9. 性能由叢集中性能最差的節點決定
#cd /data.mysql
#rm -f gvwstate.dat
這樣後面的節點就可以啟動了。