RabbitMQ集群部署過(guò)程記錄

0.前言

目前手上的一個(gè)中長(zhǎng)期任務(wù)就是消息隊(duì)列的升級(jí)咒吐,繼RocketMQ之后执庐,開(kāi)始對(duì)RabbitMQ進(jìn)行研究受楼,首先當(dāng)然還是簡(jiǎn)單的原理了解加集群環(huán)境搭建命迈。

1.集群原理

RabbitMQ 是一個(gè)由 Erlang 語(yǔ)言開(kāi)發(fā)的 AMQP (Advanced Message Queue,高級(jí)消息隊(duì)列協(xié)議)的開(kāi)源實(shí)現(xiàn)稳捆,因?yàn)镋rlang自帶集群特性赠法,因此RabbitMQ的集群也是基于此實(shí)現(xiàn)的。RabbitMQ的集群有兩種模式,分別為默認(rèn)集群模式和鏡像模式砖织。

  • 默認(rèn)模式:消息實(shí)體只存在于一個(gè)節(jié)點(diǎn)上款侵,其它節(jié)點(diǎn)僅存儲(chǔ)對(duì)應(yīng)的元數(shù)據(jù),當(dāng)客戶(hù)端連接到未存儲(chǔ)消息實(shí)體的節(jié)點(diǎn)時(shí)侧纯,RabbitMQ會(huì)根據(jù)元數(shù)據(jù)從對(duì)應(yīng)節(jié)點(diǎn)取得消息后再轉(zhuǎn)發(fā)給客戶(hù)端新锈。這樣做有一個(gè)顯而易見(jiàn)的問(wèn)題是,當(dāng)某個(gè)節(jié)點(diǎn)宕機(jī)時(shí)眶熬,無(wú)論該節(jié)點(diǎn)是否有做消息持久化妹笆,存儲(chǔ)在該節(jié)點(diǎn)的未消費(fèi)消息都會(huì)暫時(shí)或者永久無(wú)法被消費(fèi)。

    元數(shù)據(jù)復(fù)制.jpg

  • 鏡像模式:鏡像模式顧名思義就是將一個(gè)節(jié)點(diǎn)存儲(chǔ)的消息在鏡像節(jié)點(diǎn)上進(jìn)行主動(dòng)同步娜氏,以防止單個(gè)節(jié)點(diǎn)宕機(jī)造成的問(wèn)題拳缠。當(dāng)然這種模式的消息高可靠性也是建立在性能損耗上的,適用于對(duì)消息可靠性要求特別高的場(chǎng)合贸弥,如訂單類(lèi)消息窟坐。

本文后面的講解都會(huì)基于默認(rèn)的集群模式來(lái)進(jìn)行。

1.1集群元數(shù)據(jù)的同步

當(dāng)在集群中聲明隊(duì)列绵疲、交換器哲鸳、綁定的時(shí)候,這些操作會(huì)直到所有集群節(jié)點(diǎn)都成功提交元數(shù)據(jù)變更后才返回盔憨。RabbitMQ集群會(huì)始終同步四種類(lèi)型的內(nèi)部元數(shù)據(jù)(類(lèi)似索引):

  • a.隊(duì)列元數(shù)據(jù):隊(duì)列名稱(chēng)和它的屬性徙菠;
  • b.交換器元數(shù)據(jù):交換器名稱(chēng)、類(lèi)型和屬性般渡;
  • c.綁定元數(shù)據(jù):一張簡(jiǎn)單的表格展示了如何將消息路由到隊(duì)列懒豹;
  • d.vhost元數(shù)據(jù):為vhost內(nèi)的隊(duì)列、交換器和綁定提供命名空間和安全屬性驯用;
    因此脸秽,當(dāng)用戶(hù)訪問(wèn)其中任何一個(gè)RabbitMQ節(jié)點(diǎn)時(shí),通過(guò)rabbitmqctl查詢(xún)到的queue/user/exchange/vhost等信息都是相同的蝴乔。
1.2內(nèi)存節(jié)點(diǎn)和磁盤(pán)節(jié)點(diǎn)

集群中的節(jié)點(diǎn)有內(nèi)存節(jié)點(diǎn)和磁盤(pán)節(jié)點(diǎn)兩種類(lèi)型记餐,內(nèi)存節(jié)點(diǎn)雖然不寫(xiě)入磁盤(pán),但是它的執(zhí)行比磁盤(pán)節(jié)點(diǎn)要好薇正。內(nèi)存節(jié)點(diǎn)可以提供出色的性能片酝,磁盤(pán)節(jié)點(diǎn)能保障配置信息在節(jié)點(diǎn)重啟后仍然可用,那集群中如何平衡這兩者呢挖腰?
RabbitMQ 只要求集群中至少有一個(gè)磁盤(pán)節(jié)點(diǎn)雕沿,所有其他節(jié)點(diǎn)可以是內(nèi)存節(jié)點(diǎn),當(dāng)節(jié)點(diǎn)加入火離開(kāi)集群時(shí)猴仑,它們必須要將該變更通知到至少一個(gè)磁盤(pán)節(jié)點(diǎn)审轮。如果只有一個(gè)磁盤(pán)節(jié)點(diǎn),剛好又是該節(jié)點(diǎn)崩潰了,那么集群可以繼續(xù)路由消息疾渣,但不能創(chuàng)建隊(duì)列篡诽、創(chuàng)建交換器、創(chuàng)建綁定榴捡、添加用戶(hù)杈女、更改權(quán)限、添加或刪除集群節(jié)點(diǎn)吊圾。換句話說(shuō)集群中的唯一磁盤(pán)節(jié)點(diǎn)崩潰的話达椰,集群仍然可以運(yùn)行,但知道該節(jié)點(diǎn)恢復(fù)项乒,否則無(wú)法更改任何東西砰碴。

2.集群搭建

我的RabbitMQ集群搭建在兩臺(tái)centos6.9服務(wù)器上。這里我使用了最簡(jiǎn)單的通過(guò)yum方式安裝RabbitMQ板丽,由于RabbitMQ依賴(lài)于Erlang環(huán)境,通過(guò)yum的方式安裝會(huì)自動(dòng)處理依賴(lài)的程序趁尼,所以會(huì)自動(dòng)安裝好Erlang埃碱,對(duì)于不熟悉Erlang的人來(lái)說(shuō)省去了很多麻煩。

2.1單機(jī)安裝

首先看一下yum源中的RabbitMQ版本酥泞,通過(guò)下述命令查詢(xún)

yum list | grep rabbitmq

查到最新的安裝包為rabbitmq-server.noarch砚殿,版本為3.1.5-1.el6,雖然不是最新的芝囤,但暫時(shí)應(yīng)該夠用了似炎,通過(guò)以下命令安裝

yum -y install rabbitmq-server.noarch

安裝完成后首先通過(guò)erl -v命令檢查Erlang環(huán)境是否已安裝

Erlang R14B04 (erts-5.8.5) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [kernel-poll:false]

Eshell V5.8.5  (abort with ^G)

1>

可以看到R14B04版本已經(jīng)安裝完成,這也是目前yum源自帶的最高版本了悯姊,如果要安裝更高版本的RabbitMQ這個(gè)Erlang版本是肯定不夠的羡藐,就需要再另外自行安裝更高版本Erlang。這里順帶提一下悯许,要退出Erlang的控制臺(tái)需要輸入halt().命令仆嗦,否則只能通過(guò)ctrl+z強(qiáng)行退出。

2.2服務(wù)啟動(dòng)

首先打開(kāi)服務(wù)

chkconfig rabbitmq-server on

啟動(dòng)RabbitMQ

service rabbitmq-server start

查看狀態(tài)

rabbitmqctl status

看到如下信息則證明RabbitMQ已正常啟動(dòng)

Status of node rabbit@host05 ...
[{pid,8927},
 {running_applications,[{rabbit,"RabbitMQ","3.1.5"},
                        {os_mon,"CPO  CXC 138 46","2.2.7"},
                        {mnesia,"MNESIA  CXC 138 12","4.5"},
                        {xmerl,"XML parser","1.2.10"},
                        {sasl,"SASL  CXC 138 11","2.1.10"},
                        {stdlib,"ERTS  CXC 138 10","1.17.5"},
                        {kernel,"ERTS  CXC 138 10","2.14.5"}]},
 {os,{unix,linux}},
 {erlang_version,"Erlang R14B04 (erts-5.8.5) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:30] [kernel-poll:true]\n"},
 {memory,[{total,27533368},
          {connection_procs,2704},
          {queue_procs,5408},
          {plugins,0},
          {other_proc,9049416},
          {mnesia,61424},
          {mgmt_db,0},
          {msg_index,34160},
          {other_ets,798568},
          {binary,5312},
          {code,14419209},
          {atom,1355273},
          {other_system,1801894}]},
 {vm_memory_high_watermark,0.4},
 {vm_memory_limit,1607422771},
 {disk_free_limit,1000000000},
 {disk_free,18049622016},
 {file_descriptors,[{total_limit,924},
                    {total_used,3},
                    {sockets_limit,829},
                    {sockets_used,1}]},
 {processes,[{limit,1048576},{used,124}]},
 {run_queue,0},
 {uptime,74460}]
...done.
2.3加入集群

首先有兩個(gè)點(diǎn)需要注意:

  1. RabbitMQ節(jié)點(diǎn)的命名一般是rabbit@服務(wù)器host先壕,因此需要在/etc/hosts文件中配置對(duì)應(yīng)的ip和hostname瘩扼,防止host無(wú)法解析的情況;
  2. RabbitMQ集群是基于Erlang的集群的垃僚,因此需要保證Erlang節(jié)點(diǎn)間的互通集绰。Erlang的節(jié)點(diǎn)互通需要節(jié)點(diǎn)之間有相同的cookie,因此將節(jié)點(diǎn)2的/var/lib/rabbitmq/.erlang.cookie修改為和節(jié)點(diǎn)1一樣谆棺,同時(shí)為保證cookie文件的權(quán)限栽燕,需要執(zhí)行以下命令:
chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie

chmod 400 /var/lib/rabbitmq/.erlang.cookie

接著將節(jié)點(diǎn)2加入到節(jié)點(diǎn)1的集群中,首先需要停止節(jié)點(diǎn)2上的應(yīng)用(不是停止Erlang節(jié)點(diǎn)),否則會(huì)報(bào)以下錯(cuò)誤

Clustering node rabbit@host05 with rabbit@host04 ...
Error: mnesia_unexpectedly_running

在節(jié)點(diǎn)2上運(yùn)行以下命令

rabbitmqctl  stop_app

清楚節(jié)點(diǎn)2上的隊(duì)列信息

rabbitmqctl reset

加入集群

rabbitmqctl join_cluster rabbit@節(jié)點(diǎn)1

如果要以?xún)?nèi)存節(jié)點(diǎn)模式加入則執(zhí)行以下命令

rabbitmqctl join_cluster --ram rabbit@節(jié)點(diǎn)1

重新啟動(dòng)節(jié)點(diǎn)2上的應(yīng)用

rabbitmqctl  start_app

查看集群狀態(tài)

rabbitmqctl cluster_status

看到如下顯示證明集群建立成功

Cluster status of node rabbit@host04 ...
[{nodes,[{disc,[rabbit@host04,rabbit@host05]}]},
 {running_nodes,[rabbit@host05,rabbit@host04]},
 {partitions,[]}]
...done.

3.管理頁(yè)面

3.1頁(yè)面啟動(dòng)
rabbitmq-plugins enable rabbitmq_management

RabbitMQ很貼心的自帶管理頁(yè)面纫谅,該頁(yè)面屬于一種插件功能炫贤,通過(guò)上述命令啟動(dòng),啟動(dòng)后默認(rèn)通過(guò)http://ip:15672登陸訪問(wèn)
這里順帶提一下其它默認(rèn)的端口:

  • 4369 (epmd)
  • 25672 (Erlang distribution)
  • 5672, 5671 (AMQP 0-9-1 without and with TLS)
  • 15672 (if management plugin is enabled)
  • 61613, 61614 (if STOMP is enabled)
  • 1883, 8883 (if MQTT is enabled)
3.2創(chuàng)建賬號(hào)
rabbitmqctl add_user admin admin

登錄管理頁(yè)面需要?jiǎng)?chuàng)建賬號(hào)付秕,如上所示命令用于創(chuàng)建admin/admin賬號(hào)

3.3賦予角色
rabbitmqctl set_user_tags admin administrator

上述命令將administrator角色賦給admin用戶(hù)兰珍,至此就可以通過(guò)admin/admin賬號(hào)進(jìn)行登陸了

管理頁(yè)面.png
3.4其它命令

其它常用用戶(hù)管理命令如下:

  • list_users,用戶(hù)列表
  • add_user {username} {password}询吴,添加用戶(hù)
  • delete_user {username}掠河,刪除用戶(hù)
  • change_password {username} {newpassword},修改密碼
  • clear_password {username}猛计,刪除密碼唠摹,密碼刪除后就不能訪問(wèn)了
  • authenticate_user {username} {password},用戶(hù)認(rèn)證
  • set_user_tags {username} {tag ...}奉瘤,為用戶(hù)設(shè)置角色勾拉,tag可以是0個(gè)、一個(gè)盗温、或多個(gè)

常用權(quán)限管理命令如下:

  • list_vhosts [vhostinfoitem ...]藕赞,獲取vhosts列表
  • add_vhost {vhost}, eg:rabbitmqctl add_vhost test
  • delete_vhost {vhost}
  • set_permissions [-p vhost] {user} {conf} {write} {read}卖局,給用戶(hù)分在對(duì)應(yīng)的vhost上分配相應(yīng)的權(quán)限斧蜕。eg:rabbitmqctl set_permissions -p /myvhost chris "^chris-." "." ".*",這條指令砚偶,給用戶(hù)chris在myvhost分配了權(quán)限批销,權(quán)限包括:以"chris-"開(kāi)頭的全部資源的配置權(quán)限,和所有資源的讀寫(xiě)權(quán)限
  • clear_permissions [-p vhost] {username}染坯,清除權(quán)限
  • list_permissions [-p vhost]均芽,vhost權(quán)限分配列表
  • list_user_permissions {username},user權(quán)限列表

4.遇到的問(wèn)題

服務(wù)無(wú)法啟動(dòng)酒请,并報(bào)了如下的錯(cuò)誤:

BOOT FAILED
===========

Error description:
   {error,{cannot_log_to_file,"/var/log/rabbitmq/rabbit@host04.log",
                              {error,eacces}}}

Log files (may contain more information):
   /var/log/rabbitmq/rabbit@host04.log
   /var/log/rabbitmq/rabbit@host04-sasl.log

Stack trace:
   [{rabbit,ensure_working_log_handler,5},
    {rabbit,ensure_working_log_handlers,0},
    {rabbit,'-boot/0-fun-1-',0},
    {rabbit,start_it,1},
    {init,start_it,1},
    {init,start_em,1}]

{"init terminating in do_boot",{rabbit,failure_during_boot,{error,{cannot_log_to_file,"/var/log/rabbitmq/rabbit@host04.log",{error,eacces}}}}}

Crash dump was written to: erl_crash.dump
init terminating in do_boot ()

查閱資料發(fā)現(xiàn)是rabbitmq沒(méi)有/var/log/rabbitmq目錄的權(quán)限造成的骡技,使用chown -R rabbitmq:rabbitmq /var/log/rabbitmq/賦予權(quán)限后再次啟動(dòng),問(wèn)題解決羞反,但問(wèn)題造成的原因未知布朦。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市昼窗,隨后出現(xiàn)的幾起案子是趴,更是在濱河造成了極大的恐慌,老刑警劉巖澄惊,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唆途,死亡現(xiàn)場(chǎng)離奇詭異富雅,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)肛搬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)没佑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人温赔,你說(shuō)我怎么就攤上這事蛤奢。” “怎么了陶贼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵啤贩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我拜秧,道長(zhǎng)痹屹,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任枉氮,我火速辦了婚禮志衍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘聊替。我一直安慰自己足画,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布佃牛。 她就那樣靜靜地躺著,像睡著了一般医舆。 火紅的嫁衣襯著肌膚如雪俘侠。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天蔬将,我揣著相機(jī)與錄音爷速,去河邊找鬼。 笑死霞怀,一個(gè)胖子當(dāng)著我的面吹牛惫东,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播毙石,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼廉沮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了徐矩?” 一聲冷哼從身側(cè)響起滞时,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滤灯,沒(méi)想到半個(gè)月后坪稽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體曼玩,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年窒百,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了黍判。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡篙梢,死狀恐怖顷帖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庭猩,我是刑警寧澤窟她,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蔼水,受9級(jí)特大地震影響震糖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜趴腋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一吊说、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧优炬,春花似錦颁井、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至葵硕,卻和暖如春眉抬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背懈凹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工蜀变, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人介评。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓库北,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親们陆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寒瓦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • RabbitMQ 原理介紹及安裝部署 標(biāo)簽:RabbitMQ 安裝 簡(jiǎn)介 RabbitMQ 是一個(gè)用 Erlang...
    神仙CGod閱讀 8,569評(píng)論 0 60
  • 關(guān)于消息隊(duì)列,從前年開(kāi)始斷斷續(xù)續(xù)看了些資料坪仇,想寫(xiě)很久了孵构,但一直沒(méi)騰出空,近來(lái)分別碰到幾個(gè)朋友聊這塊的技術(shù)選型烟很,是時(shí)...
    中v中閱讀 1,971評(píng)論 0 20
  • RabbitMQ采用Erlang編寫(xiě)颈墅,需安裝語(yǔ)言庫(kù)才能運(yùn)行RabbitMQ代理服務(wù)器蜡镶。AMQP:高級(jí)消息隊(duì)列協(xié)議。...
    JAVA覓音閣閱讀 3,644評(píng)論 0 7
  • 關(guān)于消息隊(duì)列恤筛,從前年開(kāi)始斷斷續(xù)續(xù)看了些資料官还,想寫(xiě)很久了,但一直沒(méi)騰出空毒坛,近來(lái)分別碰到幾個(gè)朋友聊這塊的技術(shù)選型望伦,是時(shí)...
    預(yù)流閱讀 584,754評(píng)論 51 786
  • 整體架構(gòu) 部署步驟 基于 Docker 基本概念內(nèi)存節(jié)點(diǎn)只保存狀態(tài)到內(nèi)存,例外情況是:持久的 queue 的內(nèi)容將...
    mvictor閱讀 12,756評(píng)論 5 30