Percona XtraDB Cluster (简称PXC) 搭建

(转: http://www.tuicool.com/articles/2UVBba
二.安装配置
1.RHEL or CentOS系统
# rpm -Uhv http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm
# yum install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bison libtool ncurses5-devel
# yum install Percona-XtraDB-Cluster-server Percona-XtraDB-Cluster-client xtrabackup
2.Debian or ubuntu系统
# gpg --keyserver hkp://keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A
# gpg -a --export CD2EFD2A | sudo apt-key add -
# apt-get update
# apt-get install build-essential flex bison automake autoconf bzr libtool cmake libaio-dev mysql-client libncurses-dev zlib1g-dev
# sudo apt-get install percona-xtradb-cluster-client-5.5 percona-xtradb-cluster-server-5.5 percona-xtrabackup
3.初始配置
为了使用XtraDB集群,需要在my.cnf文件中配置以下选项:
wsrep_provider -- a path to Galera library.
wsrep_cluster_address -- cluster connection URL.
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1
# 额外的参数有:
wsrep_slave_threads #指定线程数量
wsrep_sst_method
4.安装XtraBackup SST方法
为了使用Percona XtraBackup的State Transfer method(节点间数据的快照副本拷贝)。可以使用支持Galera信息的脚本的正式的xtrabackup包,可以从innobackupex源码包中得到innobackupex脚本。同时在my.cnf文件中制定:
wsrep_sst_method=xtrabackup

三.局限性
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个。
10.如果DDL语句有问题将破坏集群。




本篇文章紀錄安裝 Percona XtraDB Cluster (簡稱 PXC) 及搭配 HAProxy 做分散流量系統,其實在業界已經很常看到 HAProxy + MySQL Cluster Database 解決方案,HAProxy 幫您解決負載平衡,並且偵測系統是否存活,管理者也就不用擔心 MySQL 服務是否會掛掉。本篇會著重於 HAProxy 設定部份,並且紀錄每一步安裝步驟。之前本作者寫過一篇 Galera Cluster for MySQL Multi-master Replication ,也可以參考。今天測試系統都會以 CentOS 為主,各位讀者可以直接開 Amazone EC2 來測試,測試完成再關閉即可。

安裝 Percona XtraDB Cluster

我們會使用官方 Percona 及 EPEL repositories 進行軟體安裝,底下是 Yum 安裝步驟

$ yum -y install Percona-XtraDB-Cluster-server Percona-XtraDB-Cluster-client Percona-Server-shared-compat percona-xtrabackup
如果系統已經有安裝過 MariaDB + Galera ,請務必先移除套件

完成安裝 PXC 套件後,接著設定 my.cnf 設定檔

[mysqld]
server_id=1
wsrep_provider=/usr/lib64/libgalera_smm.so
wsrep_cluster_address="gcomm://"
wsrep_sst_auth=username:password
wsrep_provider_options="gcache.size=4G"
wsrep_cluster_name=Percona
wsrep_sst_method=xtrabackup
wsrep_node_name=db_01
wsrep_slave_threads=4
log_slave_updates
innodb_locks_unsafe_for_binlog=1
innodb_autoinc_lock_mode=2
再開啟第 2 台或第 3 台 PXC 服務的時候,務必確認第 1 台已經正確開啟成功。上面設定檔是針對第 1 台做設定,之後新增 Node,請務必修改 wsrep_cluster_address 填上你想要 Join 的 Cluster Server IP Address,另外每台的 server_id 及 wsrep_node_name 也會不同,請務必注意

第 2 台設定值

server_id=2
wsrep_cluster_address=gcomm://192.168.1.100 # replace this with the IP of your first node
wsrep_node_name=db_02
第 3 台設定值

server_id=2
wsrep_cluster_address=gcomm://192.168.1.100 # replace this with the IP of your first node
wsrep_node_name=db_03
根據 State Snapshot Transfer (簡稱 SST),我們使用 Xtrabackup ,當新的 Node 連上時,就會開始複製資料到新的 Node 上,成功複製完成,可以看到底下 Log 訊息

140117 11:56:05 [Note] WSREP: Flow-control interval: [28, 28]
140117 11:56:05 [Note] WSREP: Shifting OPEN -> PRIMARY (TO: 678691)
140117 11:56:05 [Note] WSREP: State transfer required:
        Group state: 28e87291-da41-11e2-0800-34a03cad54a7:678691
        Local state: 28e87291-da41-11e2-0800-34a03cad54a7:678684
140117 11:56:05 [Note] WSREP: New cluster view: global state: 28e87291-da41-11e2-0800-34a03cad54a7:678691, view# 33: Primary, number of nodes: 3, my index: 1, protocol version 2
140117 11:56:05 [Warning] WSREP: Gap in state sequence. Need state transfer.
140117 11:56:07 [Note] WSREP: Running: 'wsrep_sst_xtrabackup --role 'joiner' --address '122.146.119.102' --auth 'username:password' --datadir '/var/lib/mysql/' --defaults-file '/etc/my.cnf' --parent '965''
WSREP_SST: [INFO] Streaming with tar (20140117 11:56:07.517)
WSREP_SST: [INFO] Using socat as streamer (20140117 11:56:07.519)
WSREP_SST: [INFO] Evaluating socat -u TCP-LISTEN:4444,reuseaddr stdio | tar xfi - --recursive-unlink -h; RC=( ${PIPESTATUS[@]} ) (20140117 11:56:07.531)
140117 11:56:07 [Note] WSREP: Prepared SST request: xtrabackup|122.146.119.102:4444/xtrabackup_sst
140117 11:56:07 [Note] WSREP: wsrep_notify_cmd is not defined, skipping notification.
140117 11:56:07 [Note] WSREP: Assign initial position for certification: 678691, protocol version: 2
140117 11:56:07 [Note] WSREP: Prepared IST receiver, listening at: tcp://122.146.119.102:4568
140117 11:56:07 [Note] WSREP: Node 1 (db_01) requested state transfer from '*any*'. Selected 0 (db_02)(SYNCED) as donor.
140117 11:56:07 [Note] WSREP: Shifting PRIMARY -> JOINER (TO: 678692)
140117 11:57:36 [Note] WSREP: Synchronized with group, ready for connections
140117 11:57:36 [Note] WSREP: wsrep_notify_cmd is not defined, skipping notification.
140117 11:57:36 [Note] WSREP: 1 (db_02): State transfer from 0 (db_01) complete.
140117 11:57:36 [Note] WSREP: Member 1 (db_02) synced with group.
最後我們可以透過 MySQL Status 來看看是否有建立成功

mysql> show global status like 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+
1 row in set (0.00 sec)
看到 wsrep_cluster_size 出現正確的 Server 數量,就代表設定成功。

設定 HAProxy 負載平衡

上述完成了 3 台 Cluster 設定,接著所有的 Application 服務都需要直接跟此 Cluster 溝通,為了完成此需求,我們必須將 HAProxy 安裝在其中一台伺服器來做負載平衡,今天會介紹兩種設定方式,第一種是採用 round robin 方式,意思就是說所有的 Application 都可以連上並且寫入資料到三台機器,這狀況其實沒有錯誤,但是如果同時寫入三台機器,難免會出現 optimistic locking 而產生 rollback,如果可以確定不會產生 conflict,其實這方案是不錯的。第2種設定方式就是只寫入單一 Node,但是可以讀取三台機器,也就是 insert , update 都是在同一台 Node 完成,所以 Application 不用擔心會產生 rollback 情形。第1種設定在大部份的狀況底下都是可以運作很好的,所以其實也不用擔心。

底下是 /etc/haproxy/haproxy.cfg 設定

frontend stats-front
bind *:8080
mode http
default_backend stats-back

frontend pxc-front
bind *:3307
mode tcp
default_backend pxc-back

frontend pxc-onenode-front
bind *:3308
mode tcp
default_backend pxc-onenode-back

backend stats-back
mode http
balance roundrobin
stats uri /haproxy/stats
stats auth username:password

backend pxc-back
mode tcp
balance leastconn
option httpchk
server c1 192.168.1.100:3306 check port 9200 inter 12000 rise 3 fall 3
server c2 192.168.1.101:3306 check port 9200 inter 12000 rise 3 fall 3
server c3 192.168.1.102:3306 check port 9200 inter 12000 rise 3 fall 3

backend pxc-onenode-back
mode tcp
balance leastconn
option httpchk
server c1 192.168.1.100:3306 check port 9200 inter 12000 rise 3 fall 3
server c2 192.168.1.101:3306 check port 9200 inter 12000 rise 3 fall 3 backup
server c3 192.168.1.102:3306 check port 9200 inter 12000 rise 3 fall 3 backup
從上述設定,可以看到我們定義了 3 個 frontend-backend ,其中 stats-front 是 HAProxy Status Page,另外兩組則是針對 PXC 設定。看到此設定,可以知道系統會 Listen 3307 及 3308 兩個 port,其中 3308 會讓 App 使用一台 PXC Node 而已,此設定可以避免因為 optimistic locking 而產生 rollbacks,如果 Node 掛點,則會啟動其他 Node。然而如果是連接 3307 port,系統會直接對3台 node 寫入或讀取,我們使用 leastconn 取代 round robin ,這代表著 HAProxy 會偵測所有機器,並且取得現在連線數目最少的 Node 來給下一個連線。最後 stats-front 是顯示 HAProxy 偵測及連線狀態,請務必設定帳號密碼。

完成設定,如何偵測 MySQL Server 是否存活,靠著就是 9200 port,透過 Http check 方式,讓 HAProxy 知道 PXC 狀態,安裝完 PXC 後,可以發現多了 clustercheck 指令,我們必須先給 clustercheckuser 使用者帳號密碼

# Grant privileges required:
$ GRANT PROCESS ON *.* TO 'clustercheckuser'@'localhost' IDENTIFIED BY 'clustercheckpassword!';
此 clustercheck 指令會在 Local 執行 SHOW STATUS LIKE 'wsrep_local_state' MySQL 指令,回傳值為 200 或 503 ,指令確定成功執行,最後步驟就是透過 xinetd 產生 9200 port 的服務。底下先安裝 xinetd 服務

$ yum -y install xinetd
產生 mysqlchk 設定

# default: on
# description: mysqlchk
service mysqlchk
{
# this is a config for xinetd, place it in /etc/xinetd.d/
    disable = no
    flags = REUSE
    socket_type = stream
    port = 9200
    wait = no
    user = nobody
    server = /usr/bin/clustercheck
    log_on_failure += USERID
    only_from = 0.0.0.0/0
    # recommended to put the IPs that need
    # to connect exclusively (security purposes)
    per_source = UNLIMITED
}
上面步驟全部成功,請打開 URL 輸入 HAProxy Status 頁面,看到底下狀態,就是代表設定成功

Statistics Report for HAProxy
Related View

Sysbench 測試 Percona XtraDB Server 效能 (0)
Galera Cluster for MySQL Multi-master Replication (2)
Percona XtraDB Server 出現 read only issue (0)
Percona XtraBackup InnoDB 備份工具 (1)
MySQL MyISAM Engine 轉換成 InnoDB (2)
MySQL 預設儲存引擎: InnoDB 介紹 (11)
MySQL 用 MySQLDump 備份 InnoDB 注意事項 (1)
[轉載]MySQL 的 “SET NAMES xxx” 字元編碼問題分析 (2)
[MySQL] 實做 MySQL Master-Master Replication 同步 (1)
[SQL] MySQL ROW_NUMBER Simulation (0)

猜你喜欢

转载自zhouguofeng.iteye.com/blog/2315171