Percona XtraDB Cluster 搭配 HAProxy

本篇文章紀錄安裝 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

  1. 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!
    
  2. 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
    
  3. 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
  4. Start the Percona XtraDB Cluster server:

    $ sudo service mysql start
    
  5. Copy the automatically generated temporary password for the superuser account:

    $ sudo grep 'temporary password' /var/log/mysqld.log
    
  6. Use this password to log in as root:

    $ mysql -u root -p
    
  7. 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 
  8. 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:

 

NodeHostIP
Node 1pxc1192.168.70.61
Node 2pxc2192.168.70.62
Node 3pxc3192.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,但是可以讀取三台機器,也就是 insertupdate 都是在同一台 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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值