RabbitMQ集群概述
通過 Erlang 的分布式特性(通過 magic cookie 認證節點)進行 RabbitMQ 集群,各 RabbitMQ 服務為對等節點,即每個節點都提供服務給客戶端連接,進行消息發送與接收。
這些節點通過 RabbitMQ HA 隊列(鏡像隊列)進行消息隊列結構復制。本方案中搭建 3 個節點,并且都是磁盤節點(所有節點狀態保持一致,節點完全對等),只要有任何一個節點能夠工作,RabbitMQ 集群對外就能提供服務。
安裝 Erlang、RabbitMQ
http://yanconggod.blog.51cto.com/1351649/1933009
修改 /etc/hosts
加入集群 3 個節點的對應關系:
10.0.0.231 node1
10.0.0.232 node2
10.0.0.233 node3
設置 Erlang Cookie
RabbitMQ節點之間和命令行工具 (e.g. rabbitmqctl)是使用Cookie互通的,Cookie是一組隨機的數字+字母的字符串。當RabbitMQ服務器啟動的時候,Erlang VM會自動創建一個隨機內容的Cookie文件。如果是通過yum源安裝RabbitMQ的話,Erlang Cookie 文件在/var/lib/rabbitmq/.erlang.cookie。如果是通過源碼安裝的RabbitMQ,Erlang Cookie文件$HOME/.erlang.cookie。
本文演示的實例是用源碼安裝,由于這個文件權限是 400,所以需要先修改 node2、node3 中的該文件權限為 777:
node1: yancongadmin@node1:~$ chmod 777 .erlang.cookie node2: yancongadmin@node2:~$ chmod 777 .erlang.cookie yancongadmin@node2:~$ scp -r node1:/home/yancongadmin/.erlang.cookie ~/ yancongadmin@node1's password: .erlang.cookie 100% 20 0.0KB/s 00:00 node3: yancongadmin@node3:~$ chmod 777 .erlang.cookie yancongadmin@node3:~$ scp -r node1:/home/yancongadmin/.erlang.cookie ~/ yancongadmin@node1's password: .erlang.cookie 100% 20 0.0KB/s 00:00
分別在node1、node2、node3將權限恢復過來:
yancongadmin@node1:~$ chmod 400 .erlang.cookie
最后分別在確認三臺機器上的.erlang.cookie的值是一致的
yancongadmin@node1:~$ cat .erlang.cookie VORMVSAAOFOFEQKTNWBB yancongadmin@node2:~$ cat .erlang.cookie VORMVSAAOFOFEQKTNWBB yancongadmin@node3:~$ cat .erlang.cookie VORMVSAAOFOFEQKTNWBB
使用detached參數,在后臺啟動Rabbit Node
yancongadmin@node1:~$ rabbitmqctl stop Stopping and halting node rabbit@node1 ... Gracefully halting Erlang VM yancongadmin@node1:~$ rabbitmq-server -detached
通過rabbitmqctl cluster_status命令,可以查看和個節點的狀態,節點的名稱是rabbit@shorthostname,
node1: yancongadmin@node1:~$ rabbitmqctl cluster_status Cluster status of node rabbit@node1 ... [{nodes,[{disc,[rabbit@node1]}]}, {running_nodes,[rabbit@node1]}, {cluster_name,<<"rabbit@node1">>}, {partitions,[]}, {alarms,[{rabbit@node1,[]}]}] node2: yancongadmin@node2:~$ rabbitmqctl cluster_status Cluster status of node rabbit@node2 ... [{nodes,[{disc,[rabbit@node2]}]}, {running_nodes,[rabbit@node2]}, {cluster_name,<<"rabbit@node2">>}, {partitions,[]}, {alarms,[{rabbit@node2,[]}]}] node3: yancongadmin@node3:~$ rabbitmqctl cluster_status Cluster status of node rabbit@node3 ... [{nodes,[{disc,[rabbit@node3]}]}, {running_nodes,[rabbit@node3]}, {cluster_name,<<"rabbit@node3">>}, {partitions,[]}, {alarms,[{rabbit@node3,[]}]}]
將node1、node2、node3組成集群
因為rabbitmq-server啟動時,會一起啟動節點和應用,它預先設置RabbitMQ應用為standalone模式。要將一個節點加入到現有的集群中,你需要停止這個應用并將節點設置為原始狀態,然后就為加入集群準備好了。如果使用./rabbitmqctl stop,應用和節點都將被關閉。所以使用rabbitmqctl stop_app僅僅關閉應用。
node2: yancongadmin@node2:~$ rabbitmqctl stop_app Stopping node rabbit@node2 ... yancongadmin@node2:~$ rabbitmqctl join_cluster rabbit@node1 Clustering node rabbit@node2 with rabbit@node1 ... yancongadmin@node2:~$ rabbitmqctl start_app Starting node rabbit@node2 ... node3: yancongadmin@node3:~$ rabbitmqctl stop_app Stopping node rabbit@node3 ... yancongadmin@node3:~$ rabbitmqctl join_cluster rabbit@node1 Clustering node rabbit@node3 with rabbit@node1 ... yancongadmin@node3:~$ rabbitmqctl start_app Starting node rabbit@node3 ...
此時 node2 與 node3 也會自動建立連接。
如果要使用內存節點,則可以使用以下命令:
yancongadmin@node2:~$ rabbitmqctl join_cluster --ram rabbit@node1
集群配置好后,可以在 RabbitMQ 任意節點上執行 rabbitmqctl cluster_status 來查看是否集群配置成功。
node1: yancongadmin@node1:~$ rabbitmqctl cluster_status Cluster status of node rabbit@node1 ... [{nodes,[{disc,[rabbit@node1,rabbit@node2,rabbit@node3]}]}, {running_nodes,[rabbit@node1]}, {cluster_name,<<"rabbit@node1">>}, {partitions,[]}, {alarms,[{rabbit@node1,[]}]}] node2: yancongadmin@node2:~$ rabbitmqctl cluster_status Cluster status of node rabbit@node2 ... [{nodes,[{disc,[rabbit@node1,rabbit@node2]}]},{alarms,[{rabbit@node1,[]}]}] node3: yancongadmin@node3:~$ rabbitmqctl cluster_status Cluster status of node rabbit@node3 ... [{nodes,[{disc,[rabbit@node1,rabbit@node2,rabbit@node3]}]}, {alarms,[{rabbit@node1,[]}]}]
RabbitMQ鏡像功能
使用Rabbit鏡像功能,需要基于RabbitMQ策略來實現,策略是用來控制和修改群集范圍的某個vhost隊列行為和Exchange行為
yancongadmin@node2:~$ rabbitmqctl set_policy -p hrsystem ha-allqueue"^" '{"ha-mode":"all"}'
這行命令在vhost名稱為hrsystem創建了一個策略,策略名稱為ha-allqueue,策略模式為 all 即復制到所有節點,包含新增節點,策略正則表達式為 “^” 表示所有匹配所有隊列名稱。
例如下面的命令,^message 這個規則要根據自己修改,這個是指同步”message”開頭的隊列名稱,我們配置時使用的應用于所有隊列,所以表達式為”^”。
yancongadmin@node2:~$ rabbitmqctl set_policy -p hrsystem ha-allqueue "^message" '{"ha-mode":"all"}'
在任意一個節點上執行:
yancongadmin@node2:# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}' Setting policy "ha-all" for pattern "^" to "{\"ha-mode\":\"all\"}" with priority "0"
將所有隊列設置為鏡像隊列,即隊列會被復制到各個節點,各個節點狀態保持一直。
我使用過的例子,僅供參考:
rabbitmqctl set_policy ha-xxx "^cn\.xxx" \ '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic","ha-promote-on-shutdown":"always","ha-sync-batch-size":20}' rabbitmqctl set_policy queue-xxx "^queue" \ '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic","ha-promote-on-shutdown":"always","ha-sync-batch-size":20}'
如果需要負載均衡器,需要安裝并配置 HAProxy
例如:
listen rabbitmq_cluster 0.0.0.0:5672 mode tcp balance roundrobin server node1 10.0.0.231:5672 check inter 2000 rise 2 fall 3 server node2 10.0.0.232:5672 check inter 2000 rise 2 fall 3 server node3 10.0.0.233:5672 check inter 2000 rise 2 fall 3
參考:http://idoall.org/blog/post/lion/15
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。