溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

centos7.3 rabbitmq集群

發(fā)布時(shí)間:2020-07-05 01:14:29 來(lái)源:網(wǎng)絡(luò) 閱讀:1641 作者:yanconggod 欄目:建站服務(wù)器

RabbitMQ集群概述

     通過(guò) Erlang 的分布式特性(通過(guò) magic cookie 認(rèn)證節(jié)點(diǎn))進(jìn)行 RabbitMQ 集群,各 RabbitMQ 服務(wù)為對(duì)等節(jié)點(diǎn),即每個(gè)節(jié)點(diǎn)都提供服務(wù)給客戶端連接,進(jìn)行消息發(fā)送與接收。

     這些節(jié)點(diǎn)通過(guò) RabbitMQ HA 隊(duì)列(鏡像隊(duì)列)進(jìn)行消息隊(duì)列結(jié)構(gòu)復(fù)制。本方案中搭建 3 個(gè)節(jié)點(diǎn),并且都是磁盤(pán)節(jié)點(diǎn)(所有節(jié)點(diǎn)狀態(tài)保持一致,節(jié)點(diǎn)完全對(duì)等),只要有任何一個(gè)節(jié)點(diǎn)能夠工作,RabbitMQ 集群對(duì)外就能提供服務(wù)。


安裝 Erlang、RabbitMQ

http://yanconggod.blog.51cto.com/1351649/1933009

修改 /etc/hosts

加入集群 3 個(gè)節(jié)點(diǎn)的對(duì)應(yīng)關(guān)系:

10.0.0.231  node1

10.0.0.232  node2

10.0.0.233  node3


設(shè)置 Erlang Cookie

  RabbitMQ節(jié)點(diǎn)之間和命令行工具 (e.g. rabbitmqctl)是使用Cookie互通的,Cookie是一組隨機(jī)的數(shù)字+字母的字符串。當(dāng)RabbitMQ服務(wù)器啟動(dòng)的時(shí)候,Erlang VM會(huì)自動(dòng)創(chuàng)建一個(gè)隨機(jī)內(nèi)容的Cookie文件。如果是通過(guò)yum源安裝RabbitMQ的話,Erlang Cookie 文件在/var/lib/rabbitmq/.erlang.cookie。如果是通過(guò)源碼安裝的RabbitMQ,Erlang Cookie文件$HOME/.erlang.cookie。

本文演示的實(shí)例是用源碼安裝,由于這個(gè)文件權(quán)限是 400,所以需要先修改 node2、node3 中的該文件權(quán)限為 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將權(quán)限恢復(fù)過(guò)來(lái):

yancongadmin@node1:~$ chmod 400 .erlang.cookie

最后分別在確認(rèn)三臺(tái)機(jī)器上的.erlang.cookie的值是一致的

yancongadmin@node1:~$ cat .erlang.cookie
VORMVSAAOFOFEQKTNWBB
yancongadmin@node2:~$ cat .erlang.cookie
VORMVSAAOFOFEQKTNWBB
yancongadmin@node3:~$ cat .erlang.cookie
VORMVSAAOFOFEQKTNWBB

使用detached參數(shù),在后臺(tái)啟動(dòng)Rabbit Node

yancongadmin@node1:~$ rabbitmqctl stop
Stopping and halting node rabbit@node1 ...
Gracefully halting Erlang VM
yancongadmin@node1:~$ rabbitmq-server -detached

通過(guò)rabbitmqctl cluster_status命令,可以查看和個(gè)節(jié)點(diǎn)的狀態(tài),節(jié)點(diǎn)的名稱是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組成集群

因?yàn)閞abbitmq-server啟動(dòng)時(shí),會(huì)一起啟動(dòng)節(jié)點(diǎn)和應(yīng)用,它預(yù)先設(shè)置RabbitMQ應(yīng)用為standalone模式。要將一個(gè)節(jié)點(diǎn)加入到現(xiàn)有的集群中,你需要停止這個(gè)應(yīng)用并將節(jié)點(diǎn)設(shè)置為原始狀態(tài),然后就為加入集群準(zhǔn)備好了。如果使用./rabbitmqctl stop,應(yīng)用和節(jié)點(diǎn)都將被關(guān)閉。所以使用rabbitmqctl stop_app僅僅關(guān)閉應(yīng)用。 

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 ...

此時(shí) node2 與 node3 也會(huì)自動(dòng)建立連接。


如果要使用內(nèi)存節(jié)點(diǎn),則可以使用以下命令:

yancongadmin@node2:~$ rabbitmqctl join_cluster --ram rabbit@node1

集群配置好后,可以在 RabbitMQ 任意節(jié)點(diǎn)上執(zhí)行 rabbitmqctl cluster_status 來(lái)查看是否集群配置成功。

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策略來(lái)實(shí)現(xiàn),策略是用來(lái)控制和修改群集范圍的某個(gè)vhost隊(duì)列行為和Exchange行為

yancongadmin@node2:~$ rabbitmqctl set_policy -p hrsystem ha-allqueue"^" '{"ha-mode":"all"}'

這行命令在vhost名稱為hrsystem創(chuàng)建了一個(gè)策略,策略名稱為ha-allqueue,策略模式為 all 即復(fù)制到所有節(jié)點(diǎn),包含新增節(jié)點(diǎn),策略正則表達(dá)式為 “^” 表示所有匹配所有隊(duì)列名稱。

例如下面的命令,^message 這個(gè)規(guī)則要根據(jù)自己修改,這個(gè)是指同步”message”開(kāi)頭的隊(duì)列名稱,我們配置時(shí)使用的應(yīng)用于所有隊(duì)列,所以表達(dá)式為”^”。

yancongadmin@node2:~$ rabbitmqctl set_policy -p hrsystem ha-allqueue "^message" '{"ha-mode":"all"}'

在任意一個(gè)節(jié)點(diǎn)上執(zhí)行:

yancongadmin@node2:#  rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "^" to "{\"ha-mode\":\"all\"}" with priority "0"

將所有隊(duì)列設(shè)置為鏡像隊(duì)列,即隊(duì)列會(huì)被復(fù)制到各個(gè)節(jié)點(diǎn),各個(gè)節(jié)點(diǎn)狀態(tài)保持一直。

我使用過(guò)的例子,僅供參考:

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}'


如果需要負(fù)載均衡器,需要安裝并配置 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問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI