環境狀況: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