溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

centos7.3 rabbitmq集群

發布時間:2020-07-05 01:14:29 來源:網絡 閱讀:1678 作者:yanconggod 欄目:建站服務器

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女