1. 程式人生 > >RabbitMQ負載均衡(2)——HAProxy

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實戰指南》以及關注微信公眾號:朱小廝的部落格。