您好,登錄后才能下訂單哦!
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
免責(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)容。