Haproxy+PXC實現負載均衡

er74 9年前發布 | 39K 次閱讀 Web服務器 HAproxy
 

軟件負載均衡一般通過兩種方式來實現:基于操作系統的軟負載實現和基于第 三方應用的軟負載實現。

LVS就是基于Linux操作系統實現的一種軟負載,HAProxy就是開源的并且基于第三應用實現的軟負載。

HAProxy相比LVS的使用要簡單很多,功能方面也很豐富。當前,HAProxy支持兩種主要的代理模式:"tcp"也即4層(大多用于郵件服務器、

內部協議通信服務器等),和7層(HTTP)。在4層模式下,HAproxy僅在客戶端和服務器之間轉發雙向流量。7層模式下,HAProxy會分析協議,

并且能通過允許、拒絕、交換、增加、修改或者刪除請求(request)或者回應(response)里指定內容來控制協議,這種操作要基于特定規則。

Haproxy+PXC實現負載均衡

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

Haproxy+PXC實現負載均衡

補充內容:

1、haproxy可以安裝在mysql集群節點,但需要將mysql節點監聽在非3306端口,以讓haproxy監控在3306端口;

2、為了保證haproxy的高可用,可以結合keepalived;

3、可以使用haproxy做mysql只讀庫的負載均衡;

 本文由用戶 er74 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!