1. 程式人生 > >RabbitMQ高可用性叢集映象實施方案

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的叢集、映象及代理配置完畢