mysql高可用之PXC(Percona XtraDB Cluster)


簡介

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

1).同步復制,事務要么在所有節點提交或不提交。

2).多主復制,可以在任意節點進行寫操作。

3).在從服務器上並行應用事件,真正意義上的並行復制。

4).節點自動配置。

5).數據一致性,不再是異步復制。

 

Percona XtraDB Cluster完全兼容MySQL和Percona Server,表現在:

1).數據的兼容性

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

 

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 ~]# yuminstallperl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes socat nc libaio rsync -y

2.安裝xtrabackup(PXC同步數據需要用到,為什么使用xtrabackup?自己查詢官方文檔)

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.2.11/binary/redhat/6/x86_64/percona-xtrabackup-2.2.11-1.el6.x86_64.rpm

rpm -ivh percona-xtrabackup-2.2.11-1.el6.x86_64.rpm

 

3.下載安裝Percona-XtraDB-Cluster

wget https://www.percona.com/downloads/Percona-XtraDB-Cluster-56/Percona-XtraDB-Cluster-5.6.24-25.11/binary/tarball/Percona-XtraDB-Cluster-5.6.24-rel72.2-25.11..Linux.x86_64.tar.gz

 

無法下載軟件包的請先翻牆或者去官方網站查找最新版本

 

tar xf Percona-XtraDB-Cluster-5.6.24-rel72.2-25.11..Linux.x86_64.tar.gz -C /usr/local/services/

cd /usr/local/services/

ln -s Percona-XtraDB-Cluster-5.6.24-rel72.2-25.11..Linux.x86_64/ mysql

cd mysql

groupadd mysql

useradd -r -g mysql mysql

chown -R mysql .

chgrp -R mysql .     

cp support-files/my-default.cnf /etc/my.cnf

mkdir -p /data/mysql/data

chown -R mysql.mysql /data/mysql/data

./scripts/mysql_install_db --user=mysql --basedir=/usr/local/services/mysql --datadir=/data/mysql/data/

 

chown -R root .

cp support-files/mysql.server /etc/init.d/mysqld

chmod 755 /etc/init.d/mysqld

以上安裝步驟三個節點都安裝,如果在初始化的時候報libssl.so.6和libcrypto.so.6兩個動態庫文件不存在的,就做下鏈接:

ln -s /usr/lib64/libssl.so /usr/lib64/libssl.so.6

ln -s /usr/lib64/libcrypto.so /usr/lib64/libcrypto.so.6

 

node1的配置和啟動如下:

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

/etc/my.cnf添加如下內容:

[mysqld]

basedir = /usr/local/services/mysql

datadir = /data/mysql/data

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

wsrep_provider=/usr/local/services/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-xiaoboluo   #集群名字

wsrep_sst_auth=sst:xiaoboluo       #sst模式需要的用戶名和密碼

wsrep_sst_method=xtrabackup-v2  #采用什么方式復制數據。還支持mysqldump,rsync

 

啟動,進行授權操作,對於第一個節點必須以特殊方式啟動,如下:

查看啟動選項:/etc/init.d/mysqld --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/mysqld bootstrap-pxc

Bootstrapping PXC (Percona XtraDB Cluster)Starting MySQL (P[  OK  ]traDB Cluster).........

[root@node1 mysql]#

 

進行查看,可以發現啟動兩個端口

[root@node1 ~]# netstat -nltp | grep mysqld

tcp        0      00.0.0.0:4567                0.0.0.0:*                   LISTEN      2964/mysqld        

tcp        0      00.0.0.0:3306                0.0.0.0:*                   LISTEN      2964/mysqld        

[root@node1 ~]#

 

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

mysql登錄:

mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON * . * TO 'sst'@'localhost' IDENTIFIED BY 'xiaoboluo';

Query OK, 0 rows affected (0.03 sec)

 

mysql> FLUSH PRIVILEGES; 

Query OK, 0 rows affected (0.03 sec)

 

mysql>

 

到這里我們的第一個節點就搞定了,剩下的兩個節點配置稍微不同,安裝方式都是一樣的,不再重復。

 

node2的配置如下:

 

[mysqld]

basedir = /usr/local/services/mysql

datadir = /data/mysql/data

 

wsrep_provider=/usr/local/services/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-xiaoboluo                                                     

wsrep_sst_auth=sst:xiaoboluo                                                        

wsrep_sst_method=xtrabackup-v2          

 

node3的配置如下:

[mysqld]

basedir = /usr/local/services/mysql

datadir = /data/mysql/data

 

wsrep_provider=/usr/local/services/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-xiaoboluo                                                    

wsrep_sst_auth=sst:xiaoboluo                                                        

wsrep_sst_method=xtrabackup-v2          

 

node2,node3節點都配置完成以后,我們啟動,對於第2,3個節點啟動和我們普通的MySQL啟動方式一樣。

node2啟動:

[root@node2 ~]# /etc/init.d/mysqld 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-2510:44:2933172 [Note] InnoDB:  Percona XtraDB (http://www.percona.com) 5.6.19-67.0 started; log sequence number 1626646

2014-07-2510:44:2933172 [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-2510:44:2933172 [Note] RSA private key file not found: /data/mysql//private_key.pem. Some authentication plugins will not work.

2014-07-2510:44:2933172 [Note] RSA public key file not found: /data/mysql//public_key.pem. Some authentication plugins will not work.

2014-07-2510:44:2933172 [Note] Server hostname (bind-address): '*'; port: 3306

2014-07-2510:44:2933172 [Note] IPv6 is available.

2014-07-2510:44:2933172 [Note]   - '::' resolves to '::';

2014-07-2510:44:2933172 [Note] Server socket created on IP: '::'.

2014-07-2510:44:2933172 [Note] Event Scheduler: Loaded 0 events

2014-07-2510:44:2933172 [Note] WSREP: Signalling provider to continue.

2014-07-2510:44:2933172 [Note] WSREP: inited wsrep sidno 1

2014-07-2510:44:2933172 [Note] WSREP: SST received: 2dc360e7-135f-11e4-a4e9-126b1471680b:1

2014-07-2510:44:2933172 [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-2510:44:3033172 [Note] WSREP: 1.0 (node2): State transfer from 0.0 (node1) complete.

2014-07-2510:44:3033172 [Note] WSREP: Shifting JOINER -> JOINED (TO: 1)

2014-07-2510:44:3033172 [Note] WSREP: Member 1.0 (node2) synced with group.

2014-07-2510:44:3033172 [Note] WSREP: Shifting JOINED -> SYNCED (TO: 1)

2014-07-2510:44:3033172 [Note] WSREP: Synchronized with group, ready for connections

2014-07-2510:44:3033172 [Note] WSREP: wsrep_notify_cmd is not defined, skipping notification.

[root@node2 mysql]#

 

node3啟動:

[root@node3 ~]# /etc/init.d/mysqld 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-2510:49:2638949 [Note] InnoDB:  Percona XtraDB (http://www.percona.com) 5.6.19-67.0 started; log sequence number 1626646

2014-07-2510:49:2638949 [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-2510:49:2738949 [Note] RSA private key file not found: /data/mysql//private_key.pem. Some authentication plugins will not work.

2014-07-2510:49:2738949 [Note] RSA public key file not found: /data/mysql//public_key.pem. Some authentication plugins will not work.

2014-07-2510:49:2738949 [Note] Server hostname (bind-address): '*'; port: 3306

2014-07-2510:49:2738949 [Note] IPv6 is available.

2014-07-2510:49:2738949 [Note]   - '::' resolves to '::';

2014-07-2510:49:2738949 [Note] Server socket created on IP: '::'.

2014-07-2510:49:2738949 [Note] Event Scheduler: Loaded 0 events

2014-07-2510:49:2738949 [Note] WSREP: Signalling provider to continue.

2014-07-2510:49:2738949 [Note] WSREP: inited wsrep sidno 1

2014-07-2510:49:2738949 [Note] WSREP: SST received: 2dc360e7-135f-11e4-a4e9-126b1471680b:1

2014-07-2510:49:2738949 [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-2510:49:2838949 [Note] WSREP: 0.0 (node3): State transfer from 1.0 (node1) complete.

2014-07-2510:49:2838949 [Note] WSREP: Shifting JOINER -> JOINED (TO: 1)

2014-07-2510:49:2838949 [Note] WSREP: Member 0.0 (node3) synced with group.

2014-07-2510:49:2838949 [Note] WSREP: Shifting JOINED -> SYNCED (TO: 1)

2014-07-2510:49:2838949 [Note] WSREP: Synchronized with group, ready for connections

2014-07-2510:49:2838949 [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 xiaoboluo;

Query OK, 1 row affected (0.02 sec)

 mysql> use xiaoboluo

Database changed

mysql> create table t1 ( idint,name char(20)) engine=innodb;

Query OK, 0 rows affected (0.03 sec)

 mysql> insert into t1 select1,'xiaoboluo';

Query OK, 1 row affected (0.00 sec)

Records: 1  Duplicates: 0  Warnings: 0

 mysql> select * from t1;

+------+-------+

| id   | name  |

+------+-------+

|    1 | xiaoboluo |

+------+-------+

1 row in set (0.00 sec)

 mysql>

 

node2節點:

 

mysql>select*from xiaoboluo.t1;

+------+-------+

| id   | name  |

+------+-------+

|    1| xiaoboluo |

+------+-------+

1 row inset (0.00 sec)

 mysql>

 

node3節點:

mysql>select*from xiaoboluo.t1;

+------+-------+

| id   | name  |

+------+-------+

|    1| xiaoboluo |

+------+-------+

1 row inset (0.00 sec)

 mysql>

 

到這里搭建就基本結束了。3個節點同時支持write/read操作。最大節點數量不建議超過8個,更加詳細的介紹以及細節建議大家參考官方文檔。

 

總結:

Percona XtraDB Cluster現在已經有企業在使用了,我這里只是簡單的搭建以及測試,如果線上需要使用我們還需要進行相關壓力測試。比如使用sysbench,或者tpcc-mysql。

通常我們單獨使用Percona XtraDB Cluster也沒有任何問題的,如果使用通過結合harproxy,或者lvs+keepalived的方式來使用會更加的完美。前面說到的那些局限性通常我們很少能夠觸發到,所以使用Percona XtraDB Cluster來實現高可用是非常不錯的選擇。后續我會進行一個壓力測試對比。

 

PXC參考PPT資料:

 

參考資料:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM