RabbitMQ高可用性叢集映象實施方案
在我們使用rabbitmq作為訊息服務時,在服務負載不是很大的情況下,一般我們只需要一個rabbitmq節點便能為我們提供服務,可這難免會發生單點故障,要解決這個問題,我們便需要配置rabbitmq的叢集和映象,以下便是使用兩臺伺服器進行rabbitmq叢集和映象的實施步驟。
1、環境準備
a、兩臺安裝有rabbitmq例項的主機(假定主機ip分別為192.168.1.2、192.168.1.3); b、配置兩臺主機的hosts(/etc/hosts) 主機192.168.1.2 的hosts檔案新增配192.168.1.3 rabbitmq_cluster_3 主機192.168.1.3 的hosts檔案新增配192.168.1.2 rabbitmq_cluster_2 c、複製erlang的cookie檔案(rabbitmq/erlang使用cookie進行相互認證) 該檔案一般為:/var/lib/rabbitmq/.erlang.cookie 任意選擇一臺主機上面的該檔案複製到另一臺主機即可
注意目的主機更改該檔案的許可權及屬性如:
chown rabbitmq /var/lib/rabbitmq/.erlang.cookie & chmod 400 /var/lib/rabbitmq/.erlang.cookie
2、高可用部署
因為我們使用兩臺機器進行rabbitmq的高可用配置,所以需要在兩臺叢集配置後的主機上進行映象的配置,以便在一臺主機宕機後,還能繼續提供服務,同時兩個主機上的節點都使用磁碟節點,以便在兩臺主機都宕機的情況下訊息不能丟失。
a、叢集配置
# 停止應用 通過rabbitmqctl status 可以檢視當前rabbitmactl預設操作的節點資訊
rabbitmqctl stop_app
# 將當前節點加入到一個叢集中 預設磁碟節點被加入的節點只要是叢集中的一員,其他節點都能夠馬上感受到叢集節點的變化
rabbitmqctl join_cluster rabbit@rabbitmq_cluster_3
# 重新啟動當前節點
rabbitmqctl start_app
#檢視叢集資訊
rabbitmqctl cluster_status
以後其他節點想要加入叢集,都可以通過上面的操作進行配置
b、映象配置
要保證叢集的高可用,就必須進行叢集的映象的配置,映象其實是佇列的一個副本,如果佇列進行了映象的配置,那麼佇列都有最多一個master和任意多個slave(由配置策略和叢集中的例項個數決定),生產者傳送的訊息必須在所有副本複製完成後,才會與生產者確認訊息傳送成功,而每個消費者都只能與master連線(叢集會自動將消費者重連到master),消費者消費一個訊息時,在消費者確認訊息被接收後,master會通知所有slave刪除該訊息;
配置方式有兩種,一是使用rabbitmqctl,二是使用rabbitmq_management(非常簡單,此外還提供豐富的restapi),在一個節點上配置後,會在所有節點生效,這裡使用management,步驟如下:
首先啟用rabbitmq_management外掛 預設埠15672 可在啟動節點時配置
rabbitmq-plugins enable rabbitmq_management
登陸rabbitmq_management http://127.0.0.1:15672/
在節點所在機器環境可以直接使用賬號/密碼 guest/guest 登陸
針對我們目前的情況配置策略如截圖
3、使用haproxy代理
haproxy代理的配置非常簡單,可以單獨找臺機器部署,也可以直接在其中一個rabbitmq節點配置,之後客戶端使用時,直接連結haproxy代理服務即可,簡單配置樣例如下(/etc/haproxy/haproxy.cfg haproxy的預設配置檔案,啟動時也可以通過引數指定配置檔案位置):
global
log 127.0.0.1 local0
maxconn 4096 #最大連線數
chroot /opt/haproxy
stats socket /tmp/haproxy.socket uid haproxy mode 770 level admin
daemon #後臺執行haproxy
nbproc 1 #啟動1個haproxy例項
pidfile /opt/haproxy/haproxy.pid #將所有程序PID寫入pid檔案
defaults #預設設定
#log global
log 127.0.0.1 local3 #日誌檔案的輸出定向
#預設的模式:tcp|http|health
mode tcp #所處理的類別,預設採用http模式
option tcplog #日誌類別,採用http日誌格式`
option dontlognull
retries 3 #3次連線失敗就認為伺服器不可用,主要通過後面的check檢查
option redispatch #當serverid對應的伺服器掛掉後,強制定向到其他健康伺服器
option abortonclose #當伺服器負載很高時,自動結束掉當前佇列中處理比較久的連結
maxconn 2000 #預設最大連線數
timeout connect 5000 #連線超時時間
timeout client 50000 #客戶端連線超時時間
timeout server 50000 #伺服器端連線超時時間
# Haproxy統計頁面
listen haproxy_stats
bind 0.0.0.0:8100 #偵聽IP:Port
mode http
log 127.0.0.1 local0 info #err|warning|info|debug]
stats refresh 5s
stats uri /haproxy-stats
stats realm Haproxy\ Statistics
stats auth admin:admin
stats hide-version
stats admin if TRUE #手工啟用/禁用後端伺服器
listen haproxy_rabbitmq_cluster #rabbitmq代理配置
mode tcp
bind 0.0.0.0:5672 #該埠為客戶端使用的埠
balance roundrobin
server rabbit_1 192.168.1.2:5672 check inter 5000 rise 2 fall 3
server rabbit_2 192.168.1.3:5672 check inter 5000 rise 2 fall 3
配置完成後 通過http訪問haprox的主機埠8100即可查詢所代理伺服器的狀態
到此 rabbitmq的叢集、映象及代理配置完畢