Haproxy+PXC實現負載均衡
軟件負載均衡一般通過兩種方式來實現:基于操作系統的軟負載實現和基于第 三方應用的軟負載實現。
LVS就是基于Linux操作系統實現的一種軟負載,HAProxy就是開源的并且基于第三應用實現的軟負載。
HAProxy相比LVS的使用要簡單很多,功能方面也很豐富。當前,HAProxy支持兩種主要的代理模式:"tcp"也即4層(大多用于郵件服務器、
內部協議通信服務器等),和7層(HTTP)。在4層模式下,HAproxy僅在客戶端和服務器之間轉發雙向流量。7層模式下,HAProxy會分析協議,
并且能通過允許、拒絕、交換、增加、修改或者刪除請求(request)或者回應(response)里指定內容來控制協議,這種操作要基于特定規則。
HAProxy提供高可用性、負載均衡以及基于TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速并且可靠的一種解決方案。HAProxy特別適用于
那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬件上,完全可以支持數以萬計的并發連接。并且它的
運行模式使得它可以很簡單安全的整合進您當前的架構中,同時可以保護你的web服務器不被暴露到網絡上。
環境情況:
OS:centos release 6.6
pxc三個節點:192.168.79.3:3306、192.168.79.4:3306、192.168.79.5:3306
HAPproxy節點:192.168.79.128 (已搭建完成)
HAproxy版本:1.5.2
PXC集群安裝完成后,需要一個負載均衡器來分發連接,我們這里采用haproxy,這也是percona推薦的方式
一、安裝haproxy(僅安裝在haproxy的節點上,如果安裝在pxcmysql節點注意端口號)
wget http://www.haproxy.org/download/1.5/src/haproxy-1.5.2.tar.gz
#tar -zxvf haproxy-1.5.2.tar.gz
#cd haproxy-1.5.2
#make TARGET=linux2628
#make install
ps:默認安裝到/usr/local/sbin/下面,可以用PREFIX指定軟件安裝路徑
也可以直接使用yum安裝:yum install –y haproxy
二、在haproxy服務器上安裝配置HAproxy
配置文件存/etc/haproxy/haproxy.cfg 內容如下:
#mkdir /etc/haproxy
# cp examples/haproxy.cfg /etc/haproxy/
# cat /etc/haproxy/haproxy.cfg
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 *:8088
mode http
default_backend stats-back
backend pxc-back #描述進來的連接將轉發到哪些后端服務器
mode tcp
balance leastconn #負載均衡算法,使用最少連接算法,適合長連接應用
option httpchk #啟用HTTP協議檢查服務器監控狀態,通過調用腳本檢查節點的狀態
server node1 10.0.60.3:3306 check port 9200 inter 12000 rise 3 fall 3
server node2 10.0.60.4:3306 check port 9200 inter 12000 rise 3 fall 3
server node3 10.0.60.5:3306 check port 9200 inter 12000 rise 3 fall 3
#ps:#fall連續3次檢查錯誤后,將表明服務器死亡,默認為3;inter連續兩次檢查的間隔時間值,單位為毫秒,默認為2s;rise連續3次檢查成功,表明服務可用
#option mysql-check user haproxy_check #使用Mysql健康檢查,不檢查數據庫和數據一致性,需要在mysql上創建相應的檢查帳戶
#server node1 10.0.60.3:3306 check
#server node2 10.0.60.4:3306 check
#server node3 10.0.60.5:3306 check
backend stats-back #開啟haproxy的狀態頁面
mode http
balance roundrobin
stats uri /haproxy/stats #定義訪問統計信息的URI
stats auth admin:admin #設置查看haproxy狀態統計信息的用戶名和密碼
配置haproxy的日志:
安裝完HAProxy后,默認情況下,HAProxy為了節省讀寫IO所消耗的性能,默認情況下沒有日志輸出,一下是開啟日志的過程
# rpm -qa |grep rsyslog
rsyslog-5.8.10-8.el6.x86_64
# rpm -ql rsyslog |grep conf$
# vim /etc/rsyslog.conf
...........
$ModLoad imudp
$UDPServerRun 514 //rsyslog 默認情況下,需要在514端口監聽UDP,所以可以把這兩行注釋掉
.........
local0.* /var/log/haproxy.log //和haproxy的配置文件中定義的log level一致
# service rsyslog restart
Shutting down system logger: [ OK ]
Starting system logger: [ OK ]
# service rsyslog status
rsyslogd (pid 11437) is running...
三、在每個PXC 每個mysql節點安裝mysql健康狀態檢查腳本:
1)腳本拷貝
# cp /usr/local/mysql/bin/clustercheck /usr/bin/
# cp /usr/local/mysql/xinetd.d/mysqlchk /etc/xinetd.d/
2)創建mysql用戶,用于mysql健康檢查(在任一節點即可):
> grant process on *.* to 'clustercheckuser'@'localhost' identified by 'clustercheckpassword!';
> flush privileges;
ps:如不使用clustercheck中默認用戶名和密碼,將需要修改clustercheck腳本,MYSQL_USERNAME和MYSQL_PASSWORD值
3)更改/etc/services添加mysqlchk的服務端口號:
# echo 'mysqlchk 9200/tcp # mysqlchk' >> /etc/services
4)安裝xinetd服務
# yum -y install xinetd
# /etc/init.d/xinetd restart
Stopping xinetd: [FAILED]
Starting xinetd: [ OK ]
# chkconfig --level 2345 xinetd on
# chkconfig --list |grep xinetd
xinetd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
測試檢測腳本:
# clustercheck
HTTP/1.1 200 OK
Content-Type: text/plain
Connection: close
Content-Length: 40
Percona XtraDB Cluster Node is synced.
# curl -I 192.168.79.5:9200
HTTP/1.1 503 Service Unavailable
Content-Type: text/plain
Connection: close
Content-Length: 57
# cp /usr/local/mysql/bin/mysql /usr/bin/
# curl -I 192.168.79.5:9200
HTTP/1.1 200 OK
Content-Type: text/plain
Connection: close
Content-Length: 40
ps:要保證狀態為200,否則檢測不通過,可能是mysql服務不正常,或者環境不對致使haproxy無法使用mysql
在mysql集群的其他節點執行上面操作,保證各個節點返回狀態為200,如下:
# curl -I 192.168.79.4:9200
HTTP/1.1 200 OK
Content-Type: text/plain
Connection: close
Content-Length: 40
# curl -I 192.168.79.5:9200
HTTP/1.1 200 OK
Content-Type: text/plain
Connection: close
Content-Length: 40
四、HAproxy啟動和關閉
在haproxy服務器上啟動haproxy服務:
# /usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg
關閉:
#pkill haproxy
# /usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg
# ps -ef |grep haproxy
nobody 5751 1 0 21:18 ? 00:00:00 /usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg
root 5754 2458 0 21:19 pts/0 00:00:00 grep haproxy
]# netstat -nlap |grep haproxy
tcp 0 0 0.0.0.0:8088 0.0.0.0:* LISTEN 5751/haproxy
tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 5751/haproxy
tcp 0 0 0.0.0.0:3308 0.0.0.0:* LISTEN 5751/haproxy
udp 0 0 0.0.0.0:45891 0.0.0.0:* 5751/haproxy
五、haproxy測試
在mysql pxc創建測試賬號:
#grant all privileges on *.* to 'taotao'@’%’ identified by ‘taotao’;
#for i in `seq 1 1000`; do mysql -h 192.168.79.128 -P3307 -utaotao -ptaotao -e "select @@hostname;"; done
#for i in `seq 1 1000`; do mysql -h 192.168.79.128 -P3308 -utaotao -ptaotao -e "select @@hostname;"; done
注:其實可以只允許haproxy側的IP訪問即可,因用戶通過vip訪問mysql集群,haproxy根據調度策略使用自己的ip創建與后端mysql服務器的連接。
查看Haproxy狀態:
http://192.168.199.75:8088/haproxy/stats
輸入用戶密碼:stats auth admin admin
補充內容:
1、haproxy可以安裝在mysql集群節點,但需要將mysql節點監聽在非3306端口,以讓haproxy監控在3306端口;
2、為了保證haproxy的高可用,可以結合keepalived;
3、可以使用haproxy做mysql只讀庫的負載均衡;