本篇文章紀錄安裝 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
官网安装文档:https://www.percona.com/doc/percona-xtradb-cluster/LATEST/install/yum.html#yum
Installing from Percona Repository
-
Install the Percona repository package:
$ sudo yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
You should see the following if successful:
Installed: percona-release.noarch 0:0.1-4 Complete!
-
Check that the packages are available:
$ sudo yum list | grep Percona-XtraDB-Cluster-57 Percona-XtraDB-Cluster-57.x86_64 5.7.14-26.17.1.el7 percona-release-x86_64 Percona-XtraDB-Cluster-57-debuginfo.x86_64 5.7.14-26.17.1.el7 percona-release-x86_64
-
Install the Percona XtraDB Cluster packages:
$ sudo yum install Percona-XtraDB-Cluster-57
Note
Alternatively you can install the Percona-XtraDB-Cluster-full-57 meta package, which contains the following additional packages:
- Percona-XtraDB-Cluster-devel-57
- Percona-XtraDB-Cluster-test-57
- Percona-XtraDB-Cluster-debuginfo-57
- Percona-XtraDB-Cluster-galera-3-debuginfo
- Percona-XtraDB-Cluster-shared-57
-
Start the Percona XtraDB Cluster server:
$ sudo service mysql start
-
Copy the automatically generated temporary password for the superuser account:
$ sudo grep 'temporary password' /var/log/mysqld.log
-
Use this password to log in as root:
$ mysql -u root -p
-
Change the password for the superuser account and log out. For example:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'rootPass'; Query OK, 0 rows affected (0.00 sec) mysql> exit Bye
-
Stop the mysql service:
$ sudo service mysql stop
如果系統已經有安裝過 MariaDB + Galera,請務必先移除套件
完成安裝 PXC 套件後,接著設定 my.cnf
設定檔
$ sudo service mysql stop
Configuration examples assume there are three Percona XtraDB Cluster nodes:
Node | Host | IP |
---|---|---|
Node 1 | pxc1 | 192.168.70.61 |
Node 2 | pxc2 | 192.168.70.62 |
Node 3 | pxc3 | 192.168.70.63 |
[mysqld] server_id=1
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so wsrep_cluster_name=pxc-cluster wsrep_cluster_address=gcomm://192.168.70.61,192.168.70.62,192.168.70.63 wsrep_node_name=pxc1 wsrep_node_address=192.168.70.61 wsrep_sst_method=xtrabackup-v2 wsrep_sst_auth=sstuser:passw0rd pxc_strict_mode=ENFORCING binlog_format=ROW default_storage_engine=InnoDB innodb_autoinc_lock_mode=2
再開啟第 2 台或第 3 台 PXC 服務的時候,務必確認第 1 台已經正確開啟成功。上面設定檔是針對第 1 台做設定,之後新增 Node,請務必修改 wsrep_cluster_address
填上你想要 Join 的 Cluster Server IP Address,另外每台的 server_id
及 wsrep_node_name
也會不同,請務必注意。
mysql@pxc1> CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 'passw0rd'; mysql@pxc1> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost'; mysql@pxc1> FLUSH PRIVILEGES;
第 2 台設定值
server_id=2 wsrep_cluster_address=gcomm://192.168.70.62 wsrep_node_name=pxc2
第 3 台設定值
server_id=2 wsrep_cluster_address=gcomm://192.168.70.63 wsrep_node_name=pxc3
根據 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%'; +--------------------+-------+ | 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 頁面,看到底下狀態,就是代表設定成功
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)
http://itindex.net/detail/47688-percona-xtradb-cluster
啟動 Percona XtraDB Cluster 注意事項
在 Percona XtraDB Cluster 推出 5.5.28 以前,最簡單的啟動方式就是打開 my.cnf
設定 wsrep_urls
在 [mysqld_safe]
section 內。假設我們有三台 Node 分別為底下 IP:
- node1 = 192.168.1.100
- node2 = 192.168.1.101
- node3 = 192.168.1.102
以前的設定方式為
wsrep_urls=gcomm://192.168.1.100:4567,gcomm://192.168.1.101:4567,gcomm://192.168.1.102:4567
當啟動 MySQL 時,Percona 會先去偵測 Cluster 內的 192.168.1.100 是否存在,如果不存在就在往下找,最後偵測 192.168.1.102 也不存在時,這時候 MySQL 就是啟動失敗,為了避免這情形,也就是全部的 Node Crash 狀況下,還是可以將 Cluster 啟動,可以改成底下設定
wsrep_urls=gcomm://192.168.1.100:4567,gcomm://192.168.1.101:4567,gcomm://192.168.1.102:4567,gcomm://
這在網路上很常看到此設定,如果全部的 Node 都不存在,表示此 Cluster 也就不存在,這時候我們就重新啟動 Cluster。但是 wsrep_urls
在 5.5.28 版本已經被列為 deprecated,所以請改用 wsrep_cluster_address
參數
wsrep_cluster_address=gcomm://192.168.1.100,192.168.1.101,192.168.1.102
大家看到此設定可以知道,不用在重複宣告 4567
port 以及 gcomm://
,但是這時候也會遇到如果全部的 Node 都關閉了,這樣 Cluster 也就消失了,有兩種方式可以啟動 Cluster。
- 使用任何一個 Node 將
wsrep_cluster_address
改成gcomm://
,但是這樣很麻煩,等其他 Node 啟動後,還是要在改回來 - 使用底下的 command 來啟動
$ /etc/init.d/myslqd start --wsrep-cluster-address="gcomm://"
此方式不用修改 my.cnf
設定,其他 Node 啟動成功後,再將此 Node 重新啟動即可。
Reference: How to start a Percona XtraDB Cluster