使用Haproxy作Percona XtraDB Cluster或Mariadb Galera Cluster的負載均衡器

環境狀況:mysql

系統:CentOS release 6.4 (Final),2.6.32-358.el6.x86_64linux

haproxy版本:1.4.25redis

haproxy節點:10.0.60.190算法

mysql集羣:10.0.60.104(mariadb01)、10.0.60.105(mariadb02)、10.0.60.106(mariadb03)sql


Haproxy是一個反向代理負載均衡解決方案,支持4層和7層模式,提供後端服務器健康檢查,很是穩定。淘寶前期也使用Haproxy做爲CDN系統負載均衡器。shell


1、安裝haproxy數據庫

tar xvf haproxy-1.4.25.tar.gz
cd haproxy-1.4.25
make TARGET=linux2628
make install

2、配置haproxy後端

mkdir /etc/haproxy
cd examples/
cp haproxy.cfg /etc/haproxy/


簡單配置文件:安全

# cat /etc/haproxy/haproxy.cfg 服務器

# this config needs haproxy-1.1.28 or haproxy-1.2.1
global #全局參數
        log 127.0.0.1   local0 #定義日誌輸出到哪裏,以及日誌級別,格式log <address> <facility> [max level [min level]],使用ip地址,默認使用udp 514端口,能夠配置兩種日誌,一種進程啓動和退出,一種代理日誌
        log 127.0.0.1   local1 notice
        maxconn 4096 #每一個進程的最大併發鏈接數
        #ulimit-n 10240 #每一個進程的文件描述符,默認根據maxconn值自動計算
        chroot /usr/share/haproxy #安全目錄,須要root權限啓動haproxy
        uid 99 #進程的用戶ID,必須使用root用戶運行,交換到指定的用戶,也能夠使用user
        gid 99 #進程的組ID,也能夠使用group指定組名
        daemon #後臺運行,等同於命令行參數-D
        #nbproc 2 多進程模式,默認只開啓一個進程
        pidfile /var/run/haproxy/haproxy.pid
        #stats socket /var/run/haproxy/haproxy.sock level operator #能接收各類狀態輸出,以及能接收命令輸入
        #debug
        #quiet
defaults
        log     global #使用global段的日誌定義
        mode    http #設置實例運行模式或協議,支持http、tcp和health,frontend和backend要一致
        option  tcplog #啓用記錄tcp鏈接的日誌,包含會話狀態和時間,鏈接數,frontend、backend和server name,源地址和端口,當使用tcp模式時能找出客戶端、服務器斷開鏈接或超時。
        option  dontlognull #不記錄來自監控狀態檢查的空鏈接
        retries 3 #鏈接錯誤後,重傳次數
        option  redispatch #鏈接錯誤,啓用會話從新分配
        maxconn 2000
        timeout connect      5000 #單位爲毫秒,等待成功鏈接到服務器的最大時間值
        timeout client      50000 #設置在客戶端側的最大不活躍時間值,在TCP模式,最好跟服務器側一致
        timeout server      50000 #設置在服務端側的最大不活躍時間值,
frontend pxc-front  #描述容許客戶端鏈接的監聽套接字
        bind    *:3306
        mode    tcp
        default_backend pxc-back #當沒有匹配use_backend時,默認的backend
frontend stats-front
        bind    *:80
        mode    http
        default_backend stats-back
backend pxc-back #描述進來的鏈接將轉發到哪些後端服務器
        mode    tcp
        balance leastconn    #負載均衡算法,使用最少鏈接算法,適合長鏈接應用
        option httpchk #啓用HTTP協議檢查服務器監控狀態,經過調用腳本檢查節點的狀態
        server mariadb01 10.0.60.104:3306 check port 9200 inter 12000 rise 3 fall 3 #fall連續3次檢查錯誤後,將代表服務器死亡,默認爲3;inter連續兩次檢查的間隔時間值,單位爲毫秒,默認爲2s;rise連續3次檢查成功,代表服務可用
        server mariadb02 10.0.60.105:3306 check port 9200 inter 12000 rise 3 fall 3
        server mariadb03 10.0.60.106:3306 check port 9200 inter 12000 rise 3 fall 3
        #option  mysql-check user haproxy_check #使用Mysql健康檢查,不檢查數據庫和數據一致性,須要在mysql上建立相應的檢查賬戶
        #server  mariadb01 10.0.60.104:3306 check
        #server  mariadb02 10.0.60.105:3306 check
        #server  mariadb03 10.0.60.106:3306 check
backend stats-back  #開啓haproxy的狀態頁面
        mode http
        balance roundrobin
        stats   uri /haproxy/stats #定義訪問統計信息的URI
        stats   auth    admin:admin #設置查看統計信息的用戶名和密碼


在每一個mysql集羣節點(集羣環境同"部署Mariadb Galera Cluster高可用和多Master集羣")安裝mysql健康狀態檢查腳本:

一、拷貝腳本

cd /opt/PXC/
cp bin/clustercheck /usr/bin/
cp xinetd.d/mysqlchk /etc/xinetd.d/


二、添加服務端口:

echo 'mysqlchk 9200/tcp # mysqlchk' >> /etc/services


三、安裝和啓動xinetd服務

yum -y install xinetd
/etc/init.d/xinetd restart
chkconfig --level 2345 xinetd on


四、建立mysql的檢查賬戶,如不使用默認用戶名和密碼,將須要修改腳本

grant process on *.* to 'clustercheckuser'@'localhost' identified by 'clustercheckpassword!';


五、測試

# clustercheck

HTTP/1.1 200 OK

Content-Type: text/plain

Connection: close

Content-Length: 40


Percona XtraDB Cluster Node is synced.

# curl -I 127.0.0.1:9200

HTTP/1.1 200 OK #要保證返回是200狀態碼

Content-Type: text/plain

Connection: close

Content-Length: 40


3、啓動haproxy

haproxy -f /etc/haproxy/haproxy.cfg


查看狀態界面:


4、擴展部分

一、haproxy能夠安裝在mysql集羣節點,但須要將mysql節點監聽在非3306端口,以讓haproxy監控在3306端口;

二、爲了保證haproxy的高可用,能夠結合keepalived;

三、能夠使用haproxy作mysql只讀庫的負載均衡;


5、使用VIP地址進行Mysql測試

建立測試帳號:

 GRANT ALL PRIVILEGES ON *.* TO 'sysbench'@'%' IDENTIFIED BY PASSWORD 'sysbench'


注:其實能夠只容許haproxy側的IP訪問便可,因用戶經過vip訪問mysql集羣,haproxy根據調度策略使用本身的ip建立與後端mysql服務器的鏈接。


進行測試:

3臺1核心 2G的xen server虛擬機環境

#  ./sysbench --test=tests/db/oltp.lua --mysql-engine-trx=yes --mysql-host=10.0.60.109 --mysql-user=sysbench --mysql-password=sysbench --mysql-db=test --mysql-table-engine=innodb --num-threads=32 --max-time=60 --report-interval=5 run   
sysbench 0.5:  multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 32
Report intermediate results every 5 second(s)
Random number generator seed is 0 and will be ignored
Threads started!
[   5s] threads: 32, tps: 0.00, reads/s: 0.00, writes/s: 0.00, response time: 0.00ms (95%)
[  10s] threads: 32, tps: 0.00, reads/s: 0.00, writes/s: 0.00, response time: 0.00ms (95%)
[  15s] threads: 32, tps: 432.40, reads/s: 9881.39, writes/s: 2725.40, response time: 195.12ms (95%)
[  20s] threads: 32, tps: 421.20, reads/s: 9759.22, writes/s: 2705.60, response time: 179.22ms (95%)
[  25s] threads: 32, tps: 425.20, reads/s: 9728.21, writes/s: 2695.00, response time: 178.74ms (95%)
[  30s] threads: 32, tps: 423.80, reads/s: 9811.41, writes/s: 2709.00, response time: 186.11ms (95%)
OLTP test statistics:
    queries performed:
        read:                            229628
        write:                           63625
        other:                           26402
        total:                           319655
    transactions:                        10000  (298.56 per sec.)
    deadlocks:                           6402   (191.14 per sec.)
    read/write requests:                 293253 (8755.31 per sec.)
    other operations:                    26402  (788.25 per sec.)
General statistics:
    total time:                          33.4943s
    total number of events:              10000
    total time taken by event execution: 749.8922s
    response time:
         min:                                 18.51ms
         avg:                                 74.99ms
         max:                                890.31ms
         approx.  95 percentile:             183.95ms
Threads fairness:
    events (avg/stddev):           312.5000/97.68
    execution time (avg/stddev):   23.4341/0.02


來自爲知筆記(Wiz)

相關文章
相關標籤/搜索