搭建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%';