RabbitMQ負載均衡(2)——HAProxy
HAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支援虛擬主機,它是免費、快速並且可靠的一種解決方案,包括Twitter,Reddit,StackOverflow,GitHub在內的多家知名網際網路公司在使用。HAProxy實現了一種事件驅動、單一程序模型,此模型支援非常大的併發連線數。
安裝HAProxy
將haproxy-1.7.8.tar.gz拷貝至/opt目錄下,與RabbitMQ存放在同一個目錄中。之後解壓縮:
[root@node1 opt]# tar zxvf haproxy-1.7.8.tar.gz
將原始碼解壓之後,需要執行make來將HAProxy編譯為可執行程式。在執行make之前需要先選擇目標平臺,通常對於UNIX系的作業系統可以選擇TARGET=generic。下面是詳細操作:
[[email protected] opt]# cd haproxy-1.7.8
[[email protected] haproxy-1.7.8]# make TARGET=generic
gcc -Iinclude -Iebtree -Wall -O2 -g -fno-strict-aliasing -Wdeclaration-after-statement -fwrapv
-DTPROXY -DENABLE_POLL
-DCONFIG_HAPROXY_VERSION=\"1.7.8\"
-DCONFIG_HAPROXY_DATE=\"2017/07/07\" \
-DBUILD_TARGET='"generic"' \
-DBUILD_ARCH='""' \
-DBUILD_CPU='"generic"' \
-DBUILD_CC='"gcc"' \
-DBUILD_CFLAGS='"-O2 -g -fno-strict-aliasing -Wdeclaration-after-statement -fwrapv"' \
-DBUILD_OPTIONS='""' \
-c -o src/haproxy.o src/haproxy.c
gcc -Iinclude -Iebtree -Wall -O2 -g -fno-strict-aliasing -Wdeclaration-after-statement -fwrapv...
...
gcc -g -o haproxy src/haproxy.o src/base64.o src/protocol.o src/uri_auth.o ...
編譯完目錄下有名為“haproxy”的可執行檔案。之後再/etc/profile中加入haproxy的路徑,內容如下:
export PATH=$PATH:/opt/haproxy-1.7.8/haproxy
最後執行source /etc/profile讓此環境變數生效。
配置HAProxy
HAProxy使用單一配置檔案來定義所有屬性,包括從前端IP到後端伺服器。下面展示了用於3個RabbitMQ節點組成叢集的負載均衡配置。這3個節點的IP地址分別為192.168.02、192.168.0.3、192.168.0.4,HAProxy執行在192.168.0.9這臺機器上。
#全域性配置
global
#日誌輸出配置,所有日誌都記錄在本機,通過local0輸出
log 127.0.0.1 local0 info
#最大連線數
maxconn 4096
#改變當前的工作目錄
chroot /opt/haproxy-1.7.8
#以指定的UID執行haproxy程序
uid 99
#以指定的GID執行haproxy程序
gid 99
#以守護程序方式執行haproxy #debug #quiet
daemon
#debug
#當前程序pid檔案
pidfile /opt/haproxy-1.7.8/haproxy.pid
#預設配置
defaults
#應用全域性的日誌配置
log global
#預設的模式mode{tcp|http|health}
#tcp是4層,http是7層,health只返回OK
mode tcp
#日誌類別tcplog
option tcplog
#不記錄健康檢查日誌資訊
option dontlognull
#3次失敗則認為服務不可用
retries 3
#每個程序可用的最大連線數
maxconn 2000
#連線超時
timeout connect 5s
#客戶端超時
timeout client 120s
#服務端超時
timeout server 120s
#繫結配置
listen rabbitmq_cluster 5671
#配置TCP模式
mode tcp
#簡單的輪詢
balance roundrobin
#RabbitMQ叢集節點配置
server rmq_node1 192.168.0.2:5672 check inter 5000 rise 2 fall 3 weight 1
server rmq_node2 192.168.0.3:5672 check inter 5000 rise 2 fall 3 weight 1
server rmq_node3 192.168.0.4:5672 check inter 5000 rise 2 fall 3 weight 1
#haproxy監控頁面地址
listen monitor :8100
mode http
option httplog
stats enable
stats uri /stats
stats refresh 5s
在上面的配置中“listen rabbitmq_cluster bind 192.168.0.9.5671”這裡定義了客戶端連線IP地址和埠號。這裡配置的負載均衡演算法是roundrobin,注意這裡的roundrobin是加權輪詢。和RabbitMQ最相關的是“ server rmq_node1 192.168.0.2:5672 check inter 5000 rise 2 fall 3 weight 1”這種,它定義了RabbitMQ服務,每個RabbitMQ服務定義指令包含6個部分:
server <name>:定義RabbitMQ服務的內部標示,注意這裡的“rmq_node”是指包含有含義的字串名稱,不是指RabbitMQ的節點名稱。
<ip>:<port>:定義RabbitMQ服務的連線的IP地址和埠號。
check inter <value>:定義了每隔多少毫秒檢查RabbitMQ服務是否可用。
rise <value>:定義了RabbitMQ服務在發生故障之後,需要多少次健康檢查才能被再次確認可用。
fall <value>:定義需要經歷多少次失敗的健康檢查之後,HAProxy才會停止使用此RabbitMQ服務。
weight <value>:定義了當前RabbitMQ服務的權重。
最後一段配置定義的是HAProxy的資料統計頁面。資料統計頁面包含各個服務節點的狀態、連線、負載等資訊。在呼叫:
[root@node1 haproxy-1.7.8]# haproxy -f haproxy.cfg
歡迎支援《RabbitMQ實戰指南》以及關注微信公眾號:朱小廝的部落格。