Percona XtraDB Cluster

簡介html

Percona XtraDB Cluster是MySQL高可用性和可擴展性的解決方案,Percona XtraDB Cluster提供的特性以下:node

1.同步複製,事務要麼在全部節點提交或不提交。mysql

2.多主複製,能夠在任意節點進行寫操做。sql

3.在從服務器上並行應用事件,真正意義上的並行複製。數據庫

4.節點自動配置。bootstrap

5.數據一致性,再也不是異步複製。服務器

 

Percona XtraDB Cluster徹底兼容MySQL和Percona Server,表如今:架構

1.數據的兼容性併發

2.應用程序的兼容性:無需更改應用程序app

 

1.集羣是有節點組成的,推薦配置至少3個節點,可是也能夠運行在2個節點上。

2.每一個節點都是普通的mysql/percona服務器,能夠將現有的數據庫服務器組成集羣,反之,也能夠將集羣拆分紅單獨的服務器。

3.每一個節點都包含完整的數據副本。

 

優勢以下:

1.當執行一個查詢時,在本地節點上執行。由於全部數據都在本地,無需遠程訪問。

2.無需集中管理。能夠在任什麼時候間點失去任何節點,可是集羣將照常工做,不受影響。

3.良好的讀負載擴展,任意節點均可以查詢。

 

缺點以下:

1.加入新節點,開銷大。須要複製完整的數據。

2.不能有效的解決寫縮放問題,全部的寫操做都將發生在全部節點上。

3.有多少個節點就有多少重複的數據。

 

架構圖以下:

                                      (圖片來源官網

Percona XtraDB Cluster與MySQL Replication區別在於:

分佈式系統的CAP理論。

C— 一致性,全部節點的數據一致。

A— 可用性,一個或多個節點失效,不影響服務請求。

P— 分區容忍性,節點間的鏈接失效,仍然能夠處理請求。

任何一個分佈式系統,須要知足這三個中的兩個。

MySQL Replication: 可用性和分區容忍性

Percona XtraDB Cluster: 一致性和可用性

所以MySQL Replication並不保證數據的一致性,而Percona XtraDB Cluster提供數據一致性。

Percona XtraDB Cluster組件:

Percona XtraDB Cluster基於XtraDB的Percona Server以及包含寫複製集補丁。使用Galera 2.x library,事務型應用下的通用的多主同步複製插件。

Galera 2.x新特性有:

1.IST(Incremental State Transfer)增量狀態傳輸。對於WAN特別有用。

2.RSU(Rolling Schema Update)旋轉更新架構。不會阻止對錶進行操做。

 

侷限性

1.目前的複製僅僅支持InnoDB存儲引擎。任何寫入其餘引擎的表,包括mysql.*表將不會複製。可是DDL語句會被複制的,所以建立用戶將會被複制,可是insert into mysql.user…將不會被複制的。

2.DELETE操做不支持沒有主鍵的表。沒有主鍵的表在不一樣的節點順序將不一樣,若是執行SELECT…LIMIT… 將出現不一樣的結果集。

3.在多主環境下LOCK/UNLOCK TABLES不支持。以及鎖函數GET_LOCK(), RELEASE_LOCK()…

4.查詢日誌不能保存在表中。若是開啓查詢日誌,只能保存到文件中。

5.容許最大的事務大小由wsrep_max_ws_rows和wsrep_max_ws_size定義。任何大型操做將被拒絕。如大型的LOAD DATA操做。

6.因爲集羣是樂觀的併發控制,事務commit可能在該階段停止。若是有兩個事務向在集羣中不一樣的節點向同一行寫入並提交,失敗的節點將停止。對於集羣級別的停止,集羣返回死鎖錯誤代碼(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)).

7.XA事務不支持,因爲在提交上可能回滾。

8.整個集羣的寫入吞吐量是由最弱的節點限制,若是有一個節點變得緩慢,那麼整個集羣將是緩慢的。爲了穩定的高性能要求,全部的節點應使用統一的硬件。

9.集羣節點建議最少3個。2個也能夠運行,可是官方不推薦這麼作,由於3個節點是爲了預防腦裂。

10.若是DDL語句有問題將破壞集羣。建議使用pt-online-schema-change操做DDL。

經過以上的簡單瞭解,相信你們已經有了初步認識,更加深刻的內容,推薦童鞋們閱讀官方文檔。下面咱們進行環境的搭建與測試。測試機器信息以下:

注意:Percona-XtraDB-Cluster在啓動之後會額外啓動端口來進行狀態檢測,因此請開放相應的端口,默認是4567端口。我測試環境關閉了iptables。

node1    192.168.0.100 
node2    192.168.0.101
node3    192.168.0.102

1.安裝軟件依賴包(添加repl源,再安裝依賴,3臺server操做同樣。)

[root@node1 ~]# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@node1 ~]# yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes socat nc -y

2.安裝xtrabackup(PXC同步數據須要用到,爲何使用xtrabackup?本身查詢官方文檔)

[root@node1 ~]# wget -q http://www.percona.com/downloads/XtraBackup/LATEST/binary/redhat/6/x86_64/percona-xtrabackup-2.2.3-4982.el6.x86_64.rpm
[root@node1 ~]# rpm -ivh percona-xtrabackup-2.2.3-4982.el6.x86_64.rpm

3.下載安裝Percona-XtraDB-Cluster

[root@node1 ~]# wget http://www.percona.com/downloads/Percona-XtraDB-Cluster-56/LATEST/binary/tarball/Percona-XtraDB-Cluster-5.6.19-rel67.0-25.6.824.Linux.x86_64.tar.gz
[root@node1 ~]# tar xf Percona-XtraDB-Cluster-5.6.19-rel67.0-25.6.824.Linux.x86_64.tar.gz -C /usr/local/
[root@node1 ~]# cd /usr/local/
[root@node1 local]# ln -s Percona-XtraDB-Cluster-5.6.19-rel67.0-25.6.824.Linux.x86_64/ mysql
[root@node1 local]# cd mysql
[root@node1 mysql]# groupadd mysql
[root@node1 mysql]# useradd -r -g mysql mysql
[root@node1 mysql]# chown -R mysql .
[root@node1 mysql]# chgrp -R mysql .      
[root@node1 mysql]# cp support-files/my-default.cnf /etc/my.cnf
[root@node1 mysql]# mkdir -p /data/mysql
[root@node1 mysql]# chown -R mysql.mysql /data/mysql/
[root@node1 mysql]# ./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/
[root@node1 mysql]# chown -R root .
[root@node1 mysql]# cp support-files/mysql.server /etc/init.d/mysql
[root@node1 mysql]# chmod 755 /etc/init.d/mysql

修改my.cnf配置文件以下:

[root@node1 mysql]# grep dir /etc/my.cnf 
basedir = /usr/local/mysql
datadir = /data/mysql
[root@node1 mysql]# 

並在[mysqld]段落添以下參數:

wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so                             #庫文件 
wsrep_cluster_address=gcomm://192.168.0.100,192.168.0.101,192.168.0.102          #節點中全部ip
wsrep_node_address=192.168.0.100                                                 #節點的ip
wsrep_slave_threads=2                                                            #開啓的複製線程數,cpu核數*2
binlog_format=ROW                                                                #binlog格式必須爲row
default_storage_engine=InnoDB                                                    #暫時不支持其餘存儲引擎,只支持innodb,固然能夠支持myisam,須要另外參數打開
innodb_autoinc_lock_mode=2                                                       #自增鎖的優化
wsrep_cluster_name=pxc-yayun                                                     #集羣名字
wsrep_sst_auth=sst:yayun                                                         #sst模式須要的用戶名和密碼
wsrep_sst_method=xtrabackup-v2                                                   #採用什麼方式複製數據。還支持mysqldump,rsync

啓動,進行受權操做,對於第一個節點必須以特殊方式啓動,以下:

[root@node1 mysql]# /etc/init.d/mysql --help
Usage: mysql {start|stop|restart|restart-bootstrap|reload|force-reload|status|bootstrap-pxc}  [ MySQL (Percona XtraDB Cluster) options ]
[root@node1 mysql]# /etc/init.d/mysql bootstrap-pxc
Bootstrapping PXC (Percona XtraDB Cluster)Starting MySQL (P[  OK  ]traDB Cluster).........
[root@node1 mysql]# 

進行查看,能夠發現啓動兩個端口

[root@node1 ~]# netstat -nltp | grep mysqld
tcp        0      0 0.0.0.0:4567                0.0.0.0:*                   LISTEN      2964/mysqld         
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      2964/mysqld         
[root@node1 ~]# 

進行受權,推薦使用grant方式

mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON * . * TO 'sst'@'localhost' IDENTIFIED BY 'yayun';
Query OK, 0 rows affected (0.03 sec)

mysql> FLUSH PRIVILEGES;  
Query OK, 0 rows affected (0.03 sec)

mysql> 

到這裏咱們的第一個節點就搞定了,剩下的兩個節點配置稍微不一樣,安裝方式都是同樣的,再也不重複。
node2的配置以下:

wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so                             
wsrep_cluster_address=gcomm://192.168.0.100,192.168.0.101,192.168.0.102          
wsrep_node_address=192.168.0.101                                               
wsrep_slave_threads=2                                                            
binlog_format=ROW                                                                
default_storage_engine=InnoDB                                                    
innodb_autoinc_lock_mode=2                                                       
wsrep_cluster_name=pxc-yayun                                                     
wsrep_sst_auth=sst:yayun                                                         
wsrep_sst_method=xtrabackup-v2           

node3的配置以下:

wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so                             
wsrep_cluster_address=gcomm://192.168.0.100,192.168.0.101,192.168.0.102          
wsrep_node_address=192.168.0.102                                              
wsrep_slave_threads=2                                                            
binlog_format=ROW                                                                
default_storage_engine=InnoDB                                                    
innodb_autoinc_lock_mode=2                                                       
wsrep_cluster_name=pxc-yayun                                                     
wsrep_sst_auth=sst:yayun                                                         
wsrep_sst_method=xtrabackup-v2           

node2,node3節點都配置完成之後,咱們啓動,對於第2,3個節點啓動和咱們普通的MySQL啓動方式同樣。

node2啓動:

[root@node2 ~]# /etc/init.d/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  ]
[root@node2 ~]# 

日誌輸出以下:

[root@node2 mysql]# tail -n 20 node2.err  
2014-07-25 10:44:29 33172 [Note] InnoDB:  Percona XtraDB (http://www.percona.com) 5.6.19-67.0 started; log sequence number 1626646
2014-07-25 10:44:29 33172 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 997242b1-13a5-11e4-aa74-000c29fedc91.
2014-07-25 10:44:29 33172 [Note] RSA private key file not found: /data/mysql//private_key.pem. Some authentication plugins will not work.
2014-07-25 10:44:29 33172 [Note] RSA public key file not found: /data/mysql//public_key.pem. Some authentication plugins will not work.
2014-07-25 10:44:29 33172 [Note] Server hostname (bind-address): '*'; port: 3306
2014-07-25 10:44:29 33172 [Note] IPv6 is available.
2014-07-25 10:44:29 33172 [Note]   - '::' resolves to '::';
2014-07-25 10:44:29 33172 [Note] Server socket created on IP: '::'.
2014-07-25 10:44:29 33172 [Note] Event Scheduler: Loaded 0 events
2014-07-25 10:44:29 33172 [Note] WSREP: Signalling provider to continue.
2014-07-25 10:44:29 33172 [Note] WSREP: inited wsrep sidno 1
2014-07-25 10:44:29 33172 [Note] WSREP: SST received: 2dc360e7-135f-11e4-a4e9-126b1471680b:1
2014-07-25 10:44:29 33172 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
Version: '5.6.19-67.0-25.6'  socket: '/tmp/mysql.sock'  port: 3306  Percona XtraDB Cluster binary (GPL) 5.6.19-25.6, Revision 824, wsrep_25.6.r4111
2014-07-25 10:44:30 33172 [Note] WSREP: 1.0 (node2): State transfer from 0.0 (node1) complete.
2014-07-25 10:44:30 33172 [Note] WSREP: Shifting JOINER -> JOINED (TO: 1)
2014-07-25 10:44:30 33172 [Note] WSREP: Member 1.0 (node2) synced with group.
2014-07-25 10:44:30 33172 [Note] WSREP: Shifting JOINED -> SYNCED (TO: 1)
2014-07-25 10:44:30 33172 [Note] WSREP: Synchronized with group, ready for connections
2014-07-25 10:44:30 33172 [Note] WSREP: wsrep_notify_cmd is not defined, skipping notification.
[root@node2 mysql]# 

node3啓動:

[root@node3 ~]# /etc/init.d/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  ]
[root@node3 ~]# 

日誌輸出以下:

[root@node3 mysql]# tail -n 20 node3.err  
2014-07-25 10:49:26 38949 [Note] InnoDB:  Percona XtraDB (http://www.percona.com) 5.6.19-67.0 started; log sequence number 1626646
2014-07-25 10:49:26 38949 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 4ad6df19-13a6-11e4-aae1-000c29d894d0.
2014-07-25 10:49:27 38949 [Note] RSA private key file not found: /data/mysql//private_key.pem. Some authentication plugins will not work.
2014-07-25 10:49:27 38949 [Note] RSA public key file not found: /data/mysql//public_key.pem. Some authentication plugins will not work.
2014-07-25 10:49:27 38949 [Note] Server hostname (bind-address): '*'; port: 3306
2014-07-25 10:49:27 38949 [Note] IPv6 is available.
2014-07-25 10:49:27 38949 [Note]   - '::' resolves to '::';
2014-07-25 10:49:27 38949 [Note] Server socket created on IP: '::'.
2014-07-25 10:49:27 38949 [Note] Event Scheduler: Loaded 0 events
2014-07-25 10:49:27 38949 [Note] WSREP: Signalling provider to continue.
2014-07-25 10:49:27 38949 [Note] WSREP: inited wsrep sidno 1
2014-07-25 10:49:27 38949 [Note] WSREP: SST received: 2dc360e7-135f-11e4-a4e9-126b1471680b:1
2014-07-25 10:49:27 38949 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
Version: '5.6.19-67.0-25.6'  socket: '/tmp/mysql.sock'  port: 3306  Percona XtraDB Cluster binary (GPL) 5.6.19-25.6, Revision 824, wsrep_25.6.r4111
2014-07-25 10:49:28 38949 [Note] WSREP: 0.0 (node3): State transfer from 1.0 (node1) complete.
2014-07-25 10:49:28 38949 [Note] WSREP: Shifting JOINER -> JOINED (TO: 1)
2014-07-25 10:49:28 38949 [Note] WSREP: Member 0.0 (node3) synced with group.
2014-07-25 10:49:28 38949 [Note] WSREP: Shifting JOINED -> SYNCED (TO: 1)
2014-07-25 10:49:28 38949 [Note] WSREP: Synchronized with group, ready for connections
2014-07-25 10:49:28 38949 [Note] WSREP: wsrep_notify_cmd is not defined, skipping notification.
[root@node3 mysql]# 

若是啓動失敗,日誌裏面也會有提示的,一般啓動失敗的緣由有以下:
(1)配置文件錯誤

(2)防火牆沒有開放相應的端口,好比默認的4567端口

(3)忘記進行受權帳號

(4)xtrabackup沒有安裝或者安裝有問題

 

下面咱們進行相關的測試,好比在node節點建立表,插入數據,看另外兩個節點是否有數據。

node1節點建立表t1,插入數據,在另外兩個節點也能夠看見:

mysql> create database yayun;
Query OK, 1 row affected (0.02 sec)

mysql> use yayun
Database changed
mysql> create table t1 ( id int,name char(20)) engine=innodb;
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t1 select 1,'yayun';
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from t1;
+------+-------+
| id   | name  |
+------+-------+
|    1 | yayun |
+------+-------+
1 row in set (0.00 sec)

mysql> 

node2節點:

mysql> select * from yayun.t1;
+------+-------+
| id   | name  |
+------+-------+
|    1 | yayun |
+------+-------+
1 row in set (0.00 sec)

mysql> 

node3節點:

mysql> select * from yayun.t1;
+------+-------+
| id   | name  |
+------+-------+
|    1 | yayun |
+------+-------+
1 row in set (0.00 sec)

mysql> 

到這裏搭建就基本結束了。3個節點同時支持write/read操做。更加詳細的介紹以及細節建議你們參考官方文檔。

 

總結:

Percona XtraDB Cluster如今已經有企業在使用了,我這裏只是簡單的搭建以及測試,若是線上須要使用咱們還須要進行相關壓力測試。好比使用sysbench,或者tpcc-mysql。
一般咱們單獨使用Percona XtraDB Cluster也沒有任何問題的,若是使用經過結合harproxy,或者lvs+keepalived的方式來使用會更加的完美。前面說到的那些侷限性一般咱們不多可以觸發到,因此使用Percona XtraDB Cluster來實現高可用是很是不錯的選擇。後續我會進行一個壓力測試對比。

 

參考資料:

http://www.percona.com/doc/percona-xtradb-cluster/5.6/intro.html

http://www.percona.com/doc/percona-xtradb-cluster/5.6/howtos/cenots_howto.html

相關文章
相關標籤/搜索