from:http://www.tuicool.com/articles/2UVBba
標(biāo)簽: InnoDB MySQL Percona XtraDB Cluster Percoba XtraDB ClusterPercona Software | 發(fā)表時(shí)間:2014-01-19 13:02 | 作者:appleboy
本篇文章紀(jì)錄安裝 Percona XtraDB Cluster (簡(jiǎn)稱 PXC) 及搭配 HAProxy 做分散流量系統(tǒng),其實(shí)在業(yè)界已經(jīng)很常看到 HAProxy + MySQL Cluster Database 解決方案,HAProxy 幫您解決負(fù)載平衡,並且偵測(cè)系統(tǒng)是否存活,管理者也就不用擔(dān)心 MySQL 服務(wù)是否會(huì)掛掉。本篇會(huì)著重於 HAProxy 設(shè)定部份,並且紀(jì)錄每一步安裝步驟。之前本作者寫過一篇 Galera Cluster for MySQL Multi-master Replication ,也可以參考。今天測(cè)試系統(tǒng)都會(huì)以 CentOS 為主,各位讀者可以直接開 Amazone EC2 來測(cè)試,測(cè)試完成再關(guān)閉即可。
安裝 Percona XtraDB Cluster
我們會(huì)使用官方 Percona 及 EPEL repositories 進(jìn)行軟體安裝,底下是 Yum 安裝步驟
$ yum -y install Percona-XtraDB-Cluster-server Percona-XtraDB-Cluster-client Percona-Server-shared-compat percona-xtrabackup
如果系統(tǒng)已經(jīng)有安裝過 MariaDB + Galera ,請(qǐng)務(wù)必先移除套件
完成安裝 PXC 套件後,接著設(shè)定 my.cnf
設(shè)定檔
[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 臺(tái)或第 3 臺(tái) PXC 服務(wù)的時(shí)候,務(wù)必確認(rèn)第 1 臺(tái)已經(jīng)正確開啟成功。上面設(shè)定檔是針對(duì)第 1 臺(tái)做設(shè)定,之後新增 Node,請(qǐng)務(wù)必修改wsrep_cluster_address
填上你想要 Join 的 Cluster Server IP Address,另外每臺(tái)的 server_id
及 wsrep_node_name
也會(huì)不同,請(qǐng)務(wù)必注意
第 2 臺(tái)設(shè)定值
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 臺(tái)設(shè)定值
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
根據(jù) State Snapshot Transfer (簡(jiǎn)稱 SST),我們使用 Xtrabackup
,當(dāng)新的 Node 連上時(shí),就會(huì)開始複製資料到新的 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
出現(xiàn)正確的 Server 數(shù)量,就代表設(shè)定成功。
設(shè)定 HAProxy 負(fù)載平衡
上述完成了 3 臺(tái) Cluster 設(shè)定,接著所有的 Application 服務(wù)都需要直接跟此 Cluster 溝通,為了完成此需求,我們必須將 HAProxy 安裝在其中一臺(tái)伺服器來做負(fù)載平衡,今天會(huì)介紹兩種設(shè)定方式,第一種是採(cǎi)用 round robin 方式,意思就是說所有的 Application 都可以連上並且寫入資料到三臺(tái)機(jī)器,這狀況其實(shí)沒有錯(cuò)誤,但是如果同時(shí)寫入三臺(tái)機(jī)器,難免會(huì)出現(xiàn) optimistic locking 而產(chǎn)生 rollback,如果可以確定不會(huì)產(chǎn)生 conflict,其實(shí)這方案是不錯(cuò)的。第2種設(shè)定方式就是只寫入單一 Node,但是可以讀取三臺(tái)機(jī)器,也就是 insert
, update
都是在同一臺(tái) Node 完成,所以 Application 不用擔(dān)心會(huì)產(chǎn)生 rollback 情形。第1種設(shè)定在大部份的狀況底下都是可以運(yùn)作很好的,所以其實(shí)也不用擔(dān)心。
底下是 /etc/haproxy/haproxy.cfg
設(shè)定
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
從上述設(shè)定,可以看到我們定義了 3 個(gè) frontend-backend
,其中stats-front
是 HAProxy Status Page,另外兩組則是針對(duì) PXC 設(shè)定??吹酱嗽O(shè)定,可以知道系統(tǒng)會(huì) Listen 3307 及 3308 兩個(gè) port,其中 3308 會(huì)讓 App 使用一臺(tái) PXC Node 而已,此設(shè)定可以避免因?yàn)?nbsp;optimistic locking
而產(chǎn)生 rollbacks,如果 Node 掛點(diǎn),則會(huì)啟動(dòng)其他 Node。然而如果是連接 3307 port,系統(tǒng)會(huì)直接對(duì)3臺(tái) node 寫入或讀取,我們使用 leastconn
取代 round robin
,這代表著 HAProxy 會(huì)偵測(cè)所有機(jī)器,並且取得現(xiàn)在連線數(shù)目最少的 Node 來給下一個(gè)連線。最後stats-front
是顯示 HAProxy 偵測(cè)及連線狀態(tài),請(qǐng)務(wù)必設(shè)定帳號(hào)密碼。
完成設(shè)定,如何偵測(cè) MySQL Server 是否存活,靠著就是 9200 port,透過 Http check 方式,讓 HAProxy 知道 PXC 狀態(tài),安裝完 PXC 後,可以發(fā)現(xiàn)多了clustercheck
指令,我們必須先給 clustercheckuser
使用者帳號(hào)密碼
# Grant privileges required: $ GRANT PROCESS ON *.* TO 'clustercheckuser'@'localhost' IDENTIFIED BY 'clustercheckpassword!';
此 clustercheck
指令會(huì)在 Local 執(zhí)行SHOW STATUS LIKE 'wsrep_local_state'
MySQL 指令,回傳值為 200
或503
,指令確定成功執(zhí)行,最後步驟就是透過 xinetd
產(chǎn)生 9200 port 的服務(wù)。底下先安裝 xinetd
服務(wù)
$ yum -y install xinetd
產(chǎn)生 mysqlchk
設(shè)定
# 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 }
上面步驟全部成功,請(qǐng)打開 URL 輸入 HAProxy Status 頁(yè)面,看到底下狀態(tài),就是代表設(shè)定成功
Related View
- Sysbench 測(cè)試 Percona XtraDB Server 效能 (0)
- Galera Cluster for MySQL Multi-master Replication (2)
- Percona XtraDB Server 出現(xiàn) read only issue (0)
- Percona XtraBackup InnoDB 備份工具 (1)
- MySQL MyISAM Engine 轉(zhuǎn)換成 InnoDB (2)
- MySQL 預(yù)設(shè)儲(chǔ)存引擎: InnoDB 介紹 (11)
- MySQL 用 MySQLDump 備份 InnoDB 注意事項(xiàng) (1)
- [轉(zhuǎn)載]MySQL 的 “SET NAMES xxx” 字元編碼問題分析 (2)
- [MySQL] 實(shí)做 MySQL Master-Master Replication 同步 (1)
- [SQL] MySQL ROW_NUMBER Simulation (0)