1. 程式人生 > >搭建PXC叢集,實現MySQL高可用叢集

搭建PXC叢集,實現MySQL高可用叢集

Percona XtraDB Cluster(下文簡稱PXC叢集)提供了MySQL高可用的一種實現方法。PXC叢集以節點組成(推薦至少3節點,便於故障恢復),每個節點都是基於常規的 MySQL/Percona Server,意味著你可以從叢集中分離出某節點單獨使用。叢集中每個節點都包含完整的資料。     PXC叢集主要由兩部分組成:Percona Server with XtraDB和Write Set Replication patches(使用了Galera library,一個通用的用於事務型應用的同步、多主複製外掛)。 PXC的特性和優點:     1、同步複製     2、支援多主複製     3、支援並行複製     4、作為高可用方案,相比其他方案其結構和實施相對簡單明瞭  PXC的侷限和劣勢:     1、 版本(5.6.20)的複製只支援InnoDB引擎,其他儲存引擎的更改不復制。然而,DDL(Data Definition Language) 語句在statement級別被複制,並且,對mysql.*表的更改會基於此被複制。例如CREATE USER...語句會被複制,但是 INSERT INTO mysql.user...語句則不會。(也可以通過wsrep_replicate_myisam引數開啟myisam引擎的 複製,但這是一個實驗性的引數)。     2、 由於PXC叢集內部一致性控制的機制,事務有可能被終止,原因如下:叢集允許在兩個節點上通知執行操作同一行的兩個事務,但是隻有一個能執行成功,另一個 會被終止,同時叢集會給被終止的客戶端返回死鎖錯誤(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)).

    3、寫入效率取決於節點中最弱的一臺,因為PXC叢集採用的是強一致性原則,一個更改操作在所有節點都成功才算執行成功。

部署環境: CentOS7.X

文件沒講如何配IP,如有需要的朋友自己上網查,謝謝!

共3臺虛擬機器,分配1cpu1g記憶體20硬碟即可。為逼免發生“腦裂”,叢集使用奇數臺數。 172.25.0.131 pxc1 172.25.0.132 pxc2 172.25.0.133 pxc3 上傳安裝指令碼和安裝包“Percona-XtraDB-Cluster-5.7.22-29.26-r422-el7-x86_64-bundle.tar”到虛擬機器的root目錄 ssh到虛擬主機上 分別執行pxcX.txt檔案 如 sh pxc1.txt

pxc1做為主節點。等所有指令碼執行完成,在pxc2、pxc3執行 systemctl start mysql 開啟服務。

pxc1.txt程式碼

#!/bin/bash
yum remove mariadb-libs -y
echo  "正在配置源為192.168.239.241……"
sed -e "s/^metalink=/#metalink=/g" \
        -e "s/^mirrorlist=http/#mirrorlist=http/g" \
        -e "[email protected]^#[email protected][email protected]
" \ -e "[email protected]://[email protected]://[email protected]" \ -i /etc/yum.repos.d/*.repo > /dev/null 2>&1 if [ $? -eq 0 ];then echo -n "已經配置源為192.168.239.241!" fi #更新系統 yum update -y #配置selinux sed -i '/^SELINUX=/s/=.*/=disabled/' /etc/selinux/config setenforce 0 if [ $? -eq 0 ];then echo "SELinux初始化完畢!" fi #配置防火牆 firewall-cmd --add-port={3306,4567,4568,4444}/tcp --permanent firewall-cmd --reload if [ $? -eq 0 ];then echo "Iptables防火牆初始化完畢!" fi ##配置主機名及hosts #echo `ip add show ens33 |grep 'inet '|awk '{print $2}'|awk -F / '{print $1}'` pxc1 >>/etc/hosts echo 172.25.0.131 pxc1 >>/etc/hosts echo 172.25.0.132 pxc2 >>/etc/hosts echo 172.25.0.133 pxc3 >>/etc/hosts hostnamectl set-hostname pxc1 #安裝Percona-XtraDB-Cluster tar xvf Percona-XtraDB-Cluster-5.7.22-29.26-r422-el7-x86_64-bundle.tar yum install http://www.percona.com/downloads/percona-release/redhat/0.1-6/percona-release-0.1-6.noarch.rpm -y yum localinstall Percona-XtraDB-Cluster*.rpm -y if [ $? -eq 0 ];then echo "PXC安裝包安裝完成!" fi chkconfig mysql off systemctl start mysql mysql -u root -p`grep 'temporary password' /var/log/mysqld.log|awk '{print $11}'|tail -n1 ` --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'rootPass';flush privileges;" if [ $? -eq 0 ];then echo "設定mysql的root密碼為'rootPass'!" fi systemctl stop mysql ##停止mysql服務,配置wsrep ##下面三行跟據實際填寫 ##wsrep_cluster_address=gcomm://x.x.x.x,x.x.x.x, ##wsrep_node_name=xxx ## ##wsrep_node_address=x.x.x.x## ##下面是我的配置 mv /etc/percona-xtradb-cluster.conf.d/wsrep.cnf /etc/percona-xtradb-cluster.conf.d/wsrep.cnf.bak cat << EOF >/etc/percona-xtradb-cluster.conf.d/wsrep.cnf [mysqld] wsrep_provider=/usr/lib64/galera3/libgalera_smm.so wsrep_cluster_name=pxc-cluster wsrep_cluster_address=gcomm://172.25.0.131,172.25.0.132,172.25.0.133 wsrep_node_name=pxc1 wsrep_node_address=172.25.0.131 wsrep_sst_method=xtrabackup-v2 wsrep_sst_auth=sstuser:passw0rd pxc_strict_mode=ENFORCING binlog_format=ROW default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 EOF #only run on first node #After you configure all PXC nodes systemctl start [email protected] #show status like 'wsrep%'; mysql -u root -p'rootPass' --connect-expired-password -e "CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 'passw0rd';GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';FLUSH PRIVILEGES;" if [ $? -eq 0 ];then echo "設定sstuser的密碼為'passw0rd'!" fi #only run on first node #第一節目啟動完,再啟動其它節點 #在隨便節點建立測試資料庫 mysql -u root -p'rootPass' --connect-expired-password -e "show status like 'wsrep%';" mysql -u root -p'rootPass' --connect-expired-password -e "CREATE DATABASE percona;USE percona;CREATE TABLE example (node_id INT PRIMARY KEY, node_name VARCHAR(30));INSERT INTO percona.example VALUES (1, 'percona1');SELECT * FROM percona.example;" ## #在其它節點執行 # #mysql -u root -p'rootPass' --connect-expired-password -e "USE percona;SELECT * FROM percona.example;"

pxc2.txt程式碼

#!/bin/bash
yum remove mariadb-libs -y
echo  "正在配置源為192.168.239.241……"
sed -e "s/^metalink=/#metalink=/g" \
        -e "s/^mirrorlist=http/#mirrorlist=http/g" \
        -e "[email protected]^#[email protected][email protected]" \
        -e "[email protected]://[email protected]://[email protected]" \
-i /etc/yum.repos.d/*.repo  > /dev/null 2>&1
if [ $? -eq 0 ];then
        echo -n "已經配置源為192.168.239.241!"
fi
#更新系統
yum update -y

#配置selinux
sed -i '/^SELINUX=/s/=.*/=disabled/' /etc/selinux/config
setenforce 0
if [ $? -eq 0 ];then
        echo  "SELinux初始化完畢!"
fi
#配置防火牆
firewall-cmd --add-port={3306,4567,4568,4444}/tcp --permanent
firewall-cmd --reload
if [ $? -eq 0 ];then
echo "Iptables防火牆初始化完畢!"
fi
##配置主機名及hosts
#echo `ip add show ens33 |grep 'inet '|awk '{print $2}'|awk -F / '{print $1}'` pxc1 >>/etc/hosts
echo 172.25.0.131 pxc1 >>/etc/hosts
echo 172.25.0.132 pxc2 >>/etc/hosts
echo 172.25.0.133 pxc3 >>/etc/hosts
hostnamectl set-hostname pxc2
#安裝Percona-XtraDB-Cluster
tar xvf Percona-XtraDB-Cluster-5.7.22-29.26-r422-el7-x86_64-bundle.tar
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-6/percona-release-0.1-6.noarch.rpm -y
yum localinstall Percona-XtraDB-Cluster*.rpm -y
if [ $? -eq 0 ];then
echo  "PXC安裝包安裝完成!"
fi
chkconfig mysql off
systemctl start mysql
mysql -u root -p`grep 'temporary password' /var/log/mysqld.log|awk '{print $11}'|tail -n1 ` --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'rootPass';flush privileges;" 
if [ $? -eq 0 ];then
echo "設定mysql的root密碼為'rootPass'!"
fi

systemctl stop mysql
##停止mysql服務,配置wsrep
##下面三行跟據實際填寫
##wsrep_cluster_address=gcomm://x.x.x.x,x.x.x.x,
##wsrep_node_name=xxx ##
##wsrep_node_address=x.x.x.x##
##下面是我的配置
mv /etc/percona-xtradb-cluster.conf.d/wsrep.cnf /etc/percona-xtradb-cluster.conf.d/wsrep.cnf.bak
cat << EOF >/etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://172.25.0.131,172.25.0.132,172.25.0.133
wsrep_node_name=pxc2
wsrep_node_address=172.25.0.132
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sstuser:passw0rd
pxc_strict_mode=ENFORCING
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
EOF


#After you configure all PXC nodes
#systemctl start mysql
#show status like 'wsrep%';

pxc3.txt程式碼

#!/bin/bash
yum remove mariadb-libs -y
echo  "正在配置源為192.168.239.241……"
sed -e "s/^metalink=/#metalink=/g" \
        -e "s/^mirrorlist=http/#mirrorlist=http/g" \
        -e "[email protected]^#[email protected][email protected]" \
        -e "[email protected]://[email protected]://[email protected]" \
-i /etc/yum.repos.d/*.repo  > /dev/null 2>&1
if [ $? -eq 0 ];then
        echo -n "已經配置源為192.168.239.241!"
fi
#更新系統
yum update -y

#配置selinux
sed -i '/^SELINUX=/s/=.*/=disabled/' /etc/selinux/config
setenforce 0
if [ $? -eq 0 ];then
        echo  "SELinux初始化完畢!"
fi
#配置防火牆
firewall-cmd --add-port={3306,4567,4568,4444}/tcp --permanent
firewall-cmd --reload
if [ $? -eq 0 ];then
echo "Iptables防火牆初始化完畢!"
fi
##配置主機名及hosts
#echo `ip add show ens33 |grep 'inet '|awk '{print $2}'|awk -F / '{print $1}'` pxc1 >>/etc/hosts
echo 172.25.0.131 pxc1 >>/etc/hosts
echo 172.25.0.132 pxc2 >>/etc/hosts
echo 172.25.0.133 pxc3 >>/etc/hosts
hostnamectl set-hostname pxc1
#安裝Percona-XtraDB-Cluster
tar xvf Percona-XtraDB-Cluster-5.7.22-29.26-r422-el7-x86_64-bundle.tar
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-6/percona-release-0.1-6.noarch.rpm -y
yum localinstall Percona-XtraDB-Cluster*.rpm -y
if [ $? -eq 0 ];then
echo  "PXC安裝包安裝完成!"
fi
chkconfig mysql off
systemctl start mysql
mysql -u root -p`grep 'temporary password' /var/log/mysqld.log|awk '{print $11}'|tail -n1 ` --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'rootPass';flush privileges;" 
if [ $? -eq 0 ];then
echo "設定mysql的root密碼為'rootPass'!"
fi

systemctl stop mysql
##停止mysql服務,配置wsrep
##下面三行跟據實際填寫
##wsrep_cluster_address=gcomm://x.x.x.x,x.x.x.x,
##wsrep_node_name=xxx ##
##wsrep_node_address=x.x.x.x##
##下面是我的配置
mv /etc/percona-xtradb-cluster.conf.d/wsrep.cnf /etc/percona-xtradb-cluster.conf.d/wsrep.cnf.bak
cat << EOF >/etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://172.25.0.131,172.25.0.132,172.25.0.133
wsrep_node_name=pxc3
wsrep_node_address=172.25.0.133
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sstuser:passw0rd
pxc_strict_mode=ENFORCING
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
EOF

#After you configure all PXC nodes
#systemctl start mysql
#show status like 'wsrep%';