MySQL高可用PXC

PXC是percona公司的percona  xtraDB  cluster,簡稱PXC。它是基於Galera協議的高可用集羣方案。能夠實現多個節點間的數據同步複製以及讀寫,而且可保障數據庫的服務高可用及數據強一致性。node

PXC架構圖:mysql

image.png

三個節點都已經啓動成功,這樣在任意一個節點上面,執行一條DML語句的操做,都會同步到另外兩個節點linux

image.png

PXC就屬於一套近乎完美的MySQL高可用集羣架構方案;
sql

優勢總結:數據庫

1.能夠達到時時同步,無延遲現象發生bootstrap

2.徹底兼容MySQLvim

3.對於集羣中新節點的加入,維護起來很簡單centos

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

[mysqld]
datadir=/data/mysql
socket = /tmp/mysql.sock
pid-file=/data/mysql/mysql.pid
character_set_server = utf8
max_connections = 3000
back_log= 3000
skip-name-resolve
sync_binlog=0
innodb_flush_log_at_trx_commit=1
server-id = 1
#pxc主要配置項
default_storage_engine=Innodb
innodb_autoinc_lock_mode=2
binlog_format=row
wsrep_cluster_name=pxc_zs  #集羣名稱
wsrep_slave_threads=4   #開啓的複製線程數,cpu核數*2
wsrep_cluster_address=gcomm://192.168.150.138,192.168.150.39,192.168.150.143 #集羣全部服務器ip都加進來
wsrep_node_address=192.168.150.138 #本機ip
wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sst:zs

把這個文件寫好了,傳到其餘兩臺機器的 /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

image.png

建立環境變量,讓系統變量讀到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

[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

啓動成功以後,維護數據庫環境並建立用戶

進入數據庫 ,默認密碼是空的

#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%’;

image.png

注意:我一開始第二臺怎麼都啓動不了,  刷日誌發現一直鏈接超時,各類抓狂,而後試着遠程鏈接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. 併發寫

三個節點的自增起始值爲一、二、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. 性能由集羣中性能最差的節點決定

若是不幸PXC所有節點宕機,沒法鏈接,那麼先啓動第一節點,後面的節點cd到mysql,data目錄下:

如:

#cd /data.mysql

#rm -f gvwstate.dat

這樣後面的節點就能夠啓動了。

相關文章
相關標籤/搜索