說明
Percona XtraDB Cluster(簡稱PXC),是由percona公司推出的mysql集群解決方案。特點是每個節點都能進行讀寫,且都保存全量的數據。也就是說在任何一個節點進行寫入操作,都會同步給其它所有節點寫入到自己的磁盤。這點跟Oracle Rac有本質的區別,Rac是多個節點連同一個共享存儲,假如Oracle的共享存儲掛了,整個集群就掛了。而Mysql pxc中任何一台機器掛了,集群照常運轉,因為節點間並不共享磁盤。
寫在前面的注意事項(節選自官方手冊)
1. 由於pxc只作用於innodb引擎,而mysql自帶的系統庫(mysql)里面有些表是MyISAM的存儲引擎,因此不能直接對系統庫(mysql)的表進行dml操作,比如INSERT INTO mysql.user...。而是使用CREATE USER...,這個是沒有問題的,而且也是正確的方式。
2. 不支持LOCK TABLES和UNLOCK TABLES語句
mysql> lock tables world write;
ERROR 1105 (HY000): Percona-XtraDB-Cluster prohibits use of LOCK TABLE/FLUSH TABLE <table> WITH READ LOCK/FOR EXPORT with pxc_strict_mode = ENFORCING
3. log_output參數不能是TABLE
4. 不支持分布式事務
5. 新建表必須要有主鍵,否則對表進行dml操作會報以下錯誤
ERROR 1105 (HY000): Percona-XtraDB-Cluster prohibits use of DML command on a table (hello.world) without an explicit primary key with pxc_strict_mode = ENFORCING or MASTER
6. 推薦的節點數最小是3個
安裝
准備三個節點,操作系統使用centos6.10,pxc采用rpm安裝的方式,簡單
節點1 ip: 10.40.16.120 hostname:mysqla
節點2 ip: 10.40.16.121 hostname:mysqlb
節點3 ip: 10.40.16.122 hostname:mysqlc
所有節點關閉防火牆
service iptables stop chkconfig iptables off setenforce 0 sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
所有節點安裝以下rpm包
#安裝percona cluster依賴包 wget ftp://rpmfind.net/linux/atrpms/el6-x86_64/atrpms/stable/libev-4.04-2.el6.x86_64.rpm wget http://www.rpmfind.net/linux/epel/6/x86_64/Packages/s/socat-1.7.2.3-1.el6.x86_64.rpm yum install -y libev-4.04-2.el6.x86_64.rpm yum install -y socat-1.7.2.3-1.el6.x86_64.rpm #配置yum倉庫 yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm #安裝percona cluster yum install -y Percona-XtraDB-Cluster-57
到這里所有的安裝工作就已經完成了,接下來就是修改參數文件,把這三個節點連起來組成集群
修改參數文件
需要修改的參數已經列出來了,其余不用動,注意下面這些參數有的前面有#號,需要去掉
修改節點1的參數文件
vi /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
user=mysql wsrep_cluster_address=gcomm://10.40.16.120,10.40.16.121,10.40.16.122 #集群的所有節點ip wsrep_node_address=10.40.16.120 #本機的ip wsrep_node_name=pxc-cluster-node-1 #本機在集群中的名字 wsrep_sst_auth="sstuser:s3cretPass" #集群間同步的用戶,后面需要在節點1創建該用戶
vi /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
server-id=1 #集群內所有節點的id不能相同
啟動節點1的mysql
/etc/init.d/mysql bootstrap-pxc #集群的第一個節點啟動必須使用該方式。如果手工將整個集群關掉了,那么重新啟動集群時,應該啟動最后一個被關閉的節點,且以該方式。第一個啟動的節點稱為donater,后面啟動的節點為joiner,兩者啟動方式不一樣,需要留意
[root@mysqla ~]# /etc/init.d/mysql bootstrap-pxc Bootstrapping PXC (Percona XtraDB Cluster)MySQL (Percona XtraDB Cluster) is not running, but lock file (/var/lock/subsys/mysql) exists [FAILED] Starting MySQL (Percona XtraDB Cluster).... [ OK ]
前面那個failed忽略,屬於正常情況
找出root的臨時密碼
[root@mysqla ~]# grep "temporary password" /var/log/mysqld.log |awk -F " " '{print $11}'
&enffgG_E8Ty
修改root密碼並創建同步賬號(同步賬號需要跟/etc/percona-xtradb-cluster.conf.d/wsrep.cnf的鍵值wsrep_sst_auth對應)
[root@mysqla ~]# mysql -uroot -p'&enffgG_E8Ty' mysql> alter user root@'localhost' identified by 'root'; mysql> create user 'sstuser'@'localhost' identified by 's3cretPass'; mysql> grant process, reload, lock tables, replication client on *.* to 'sstuser'@'localhost'; mysql> flush privileges;
修改節點2的參數文件
vi /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
user=mysql wsrep_cluster_address=gcomm://10.40.16.120,10.40.16.121,10.40.16.122 wsrep_node_address=10.40.16.121 wsrep_node_name=pxc-cluster-node-2 wsrep_sst_auth="sstuser:s3cretPass"
vi /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
server-id=2
啟動節點2的mysql
service mysql start
[root@mysqlb ~]# service mysql start MySQL (Percona XtraDB Cluster) is not running, but lock fil[FAILED]lock/subsys/mysql) exists Starting MySQL (Percona XtraDB Cluster)......State transfer in progress, setting sleep higher . [ OK ]
修改節點3的參數文件
vi /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
user=mysql wsrep_cluster_address=gcomm://10.40.16.120,10.40.16.121,10.40.16.122 wsrep_node_address=10.40.16.122 wsrep_node_name=pxc-cluster-node-3 wsrep_sst_auth="sstuser:s3cretPass"
vi /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
server-id=3
啟動節點3的mysql
service mysql start
[root@mysqlc ~]# service mysql start MySQL (Percona XtraDB Cluster) is not running, but lock fil[FAILED]lock/subsys/mysql) exists Starting MySQL (Percona XtraDB Cluster)......State transfer in progress, setting sleep higher . [ OK ]
測試
在任意節點創建一張表,注意這里創建的表必須有主鍵,查看其它節點是否有數據,有就表示同步完成,沒有的話去看日志/var/log/mysqld.log查找原因
如果文章幫到了你,還希望你點個贊,你的點贊是我寫作的最大動力,哈哈。