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 127.0.0.1 local1 notice
  #log loghost local0 info
  maxconn 4096
  uid 99
  gid 99
  daemon
  #debug
  #quiet

defaults
  log global
  mode http
  option tcplog
  option dontlognull
  retries 3
  option redispatch
  maxconn 2000
  timeout connect 5000
  timeout client 50000
  timeout server 50000
frontend pxc-front
  bind *:3308
  mode tcp
default_backend pxc-back


frontend statas-front
  bind *:8088
  mode http
default_backend stats-back

backend pxc-back
mode tcp
balance leastconn
option httpchk
server taotao 192.168.79.3:3306 check port 9200 inter 12000 rise 3 fall 3
server candidate 192.168.79.4:3306 check port 9200 inter 12000 rise 3 fall 3
server slave 192.168.79.5:3306 check port 9200 inter 12000 rise 3 fall 3

backend stats-back
mode http
balance roundrobin
stats uri /haproxy/stats
stats auth admin:admin

配置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只讀庫的負載均衡;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM