使用 docker-compose 部署多機(jī) RabbitMQ 集群

本文介紹 RabbitMQ 集群的 Docker 化部署邪铲,最開始是想通過 DockerSwarm 方式來部署的供汛,但是 RabbitMQ 節(jié)點(diǎn)加入集群時(shí)一直失敗,在網(wǎng)上找了很多辦法东帅,始終沒有解決這個(gè)問題咆爽,無奈只能放棄霞赫。所以最終采用配置 hosts 文件方式來保證節(jié)點(diǎn)之間的通信腮介,下面來進(jìn)行詳細(xì)說明。

部署環(huán)境

  • 系統(tǒng):CentOS8
  • 兩臺(tái)服務(wù)器:10.1.1.1/10.1.1.2

docker-compose 文件

version: '3'

services:
  rabbit1:
    container_name: rabbit1
    image: rabbitmq:3.7-management-alpine
    restart: always
    hostname: rabbit1
    extra_hosts:
      - "rabbit1:10.1.1.1"
      - "rabbit2:10.1.1.2"
    environment:
      - RABBITMQ_ERLANG_COOKIE=MY_COOKIE
      - RABBITMQ_DEFAULT_USER=MY_USER
      - RABBITMQ_DEFAULT_PASS=MY_PASS
    ports:
      - "4369:4369"
      - "5671:5671"
      - "5672:5672"
      - "15671:15671"
      - "15672:15672"
      - "25672:25672"

這樣绩脆,10.1.1.1 上的 docker-compose 文件就寫好了萤厅,部署另一臺(tái)時(shí)橄抹,只要將 rabbit1 改成 rabbit2 就可以了靴迫。如果是更多臺(tái)服務(wù)器的話,也是同樣的道理楼誓,將 IP 配置到 extra_hosts 參數(shù)下即可玉锌。

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

在兩臺(tái)服務(wù)器上分別執(zhí)行:

# docker-compose up -d

加入集群

如果將 rabbit1 作為主節(jié)點(diǎn)的話,需要在 rabbit2 上執(zhí)行命令疟羹,將其加入到集群主守,如下:

# docker exec -it rabbit2 /bin/bash

rabbit2# rabbitmqctl stop_app
rabbit2# rabbitmqctl reset
rabbit2# rabbitmqctl join_cluster rabbit@rabbit1
rabbit2# rabbitmqctl start_app

默認(rèn)情況下禀倔,RabbitMQ 啟動(dòng)后是磁盤節(jié)點(diǎn),如果想以內(nèi)存節(jié)點(diǎn)方式加入参淫,可以加 --ram 參數(shù)救湖。

如果想要修改節(jié)點(diǎn)類型,可以使用命令:

# rabbitmqctl change_cluster_node_type disc(ram)

修改節(jié)點(diǎn)類型之前需要先 rabbitmqctl stop_app涎才。

通過下面命令來查看集群狀態(tài):

# rabbitmqctl cluster_status

注意鞋既,由于 RAM 節(jié)點(diǎn)僅將內(nèi)部數(shù)據(jù)庫表存儲(chǔ)在內(nèi)存中,因此在內(nèi)存節(jié)點(diǎn)啟動(dòng)時(shí)必須從其他節(jié)點(diǎn)同步這些數(shù)據(jù)耍铜,所以一個(gè)集群必須至少包含一個(gè)磁盤節(jié)點(diǎn)邑闺。

HAProxy 負(fù)載均衡

ha 同樣采用 Docker 方式來部署,先看一下 haproxy.cfg 配置文件:

# Simple configuration for an HTTP proxy listening on port 80 on all
# interfaces and forwarding requests to a single backend "servers" with a
# single server "server1" listening on 127.0.0.1:8000

global
    daemon
    maxconn 256

defaults
    mode http
    timeout connect 5000ms
    timeout client 5000ms
    timeout server 5000ms

listen rabbitmq_cluster
    bind 0.0.0.0:5677
    option tcplog
    mode tcp
    balance leastconn
    server  rabbit1 10.1.1.1:5672 weight 1 check inter 2s rise 2 fall 3
    server  rabbit2 10.2.2.2:5672 weight 1 check inter 2s rise 2 fall 3

listen http_front
    bind 0.0.0.0:8002
    stats uri /haproxy?stats

listen rabbitmq_admin
    bind 0.0.0.0:8001
    server rabbit1 10.1.1.1:15672
    server rabbit2 10.1.1.2:15672

再看一下 docker-compose 文件:

version: '3'

services:
  haproxy:
    container_name: rabbit-haproxy
    image: haproxy
    restart: always
    hostname: haproxy
    network_mode: rabbitmq_default
    volumes:
      - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
    ports:
      - "5677:5677"
      - "8001:8001"
      - "8002:8002"

啟動(dòng)之后棕兼,就可以通過 ha 的地址來訪問 RabbitMQ 集群管理頁面了陡舅。

如果公司內(nèi)部有現(xiàn)成的負(fù)載均衡,比如 LVS伴挚,那么也可以省略這一步靶衍。

其實(shí)到這里,集群就可以正常使用了章鲤,但還有很重要的一點(diǎn)需要做些說明摊灭。

集群模式

普通模式

  • 對(duì)于 Queue 來說,消息實(shí)體只存在于其中一個(gè)節(jié)點(diǎn)败徊,A帚呼、B 兩個(gè)節(jié)點(diǎn)僅有相同的元數(shù)據(jù),即隊(duì)列結(jié)構(gòu)皱蹦。
  • 當(dāng)消息進(jìn)入 A 節(jié)點(diǎn)的隊(duì)列中后煤杀,消費(fèi)者從 B 節(jié)點(diǎn)拉取時(shí),RabbitMQ 會(huì)臨時(shí)在 A沪哺、B 間進(jìn)行消息傳輸沈自,把 A 中的消息實(shí)體取出并經(jīng)過 B 發(fā)送給消費(fèi)者。
  • 所以辜妓,消費(fèi)者應(yīng)盡量連接每一個(gè)節(jié)點(diǎn)枯途,從中取消息。即對(duì)于同一個(gè)邏輯隊(duì)列籍滴,要在多個(gè)節(jié)點(diǎn)建立物理隊(duì)列酪夷,否則,無論消費(fèi)者連 A 或者連 B孽惰,出口總在 A晚岭,會(huì)產(chǎn)生瓶頸。
  • 該模式還存在一個(gè)問題就是當(dāng) A 節(jié)點(diǎn)故障后勋功,B 節(jié)點(diǎn)無法取到 A 節(jié)點(diǎn)中還未消費(fèi)的消息實(shí)體坦报。
  • 如果做了消息持久化库说,那么得等 A 節(jié)點(diǎn)恢復(fù),才可被消費(fèi)片择;如果沒有持久化的話潜的,消息會(huì)丟失。

鏡像模式

  • 該模式解決了上述問題字管,其和普通模式不同之處在于夏块,消息實(shí)體會(huì)主動(dòng)在鏡像節(jié)點(diǎn)間同步,而不是在消費(fèi)者取數(shù)據(jù)時(shí)臨時(shí)拉取纤掸。
  • 該模式帶來的副作用也很明顯脐供,除了降低系統(tǒng)性能外,如果鏡像隊(duì)列數(shù)量過多借跪,加之大量的消息進(jìn)入政己,集群內(nèi)部的網(wǎng)絡(luò)帶寬將會(huì)被這種同步通訊大大消耗掉。
  • 所以掏愁,在對(duì)可靠性要求較高的場(chǎng)合中適用于該模式歇由。

個(gè)人感覺,在生產(chǎn)環(huán)境中果港,還是使用鏡像模式比較保險(xiǎn)沦泌。

要想使用鏡像模式,不管是通過管理頁面辛掠,還是命令行方式谢谦,只需要簡(jiǎn)單配置即可完成。管理頁面方式就不過多介紹了萝衩,下面說說如何通過命令行來設(shè)置回挽,一條命令就搞定。

添加:

# rabbitmqctl set_policy -p testvhost testha "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
Setting policy "testha" for pattern "^" to "{"ha-mode":"all","ha-sync-mode":"automatic"}" with priority "0" for vhost "testvhost" ...

清除:

# rabbitmqctl clear_policy -p testvhost testha
Clearing policy "testha" on vhost "testvhost" ...

查看:

# rabbitmqctl list_policies -p testvhost
Listing policies for vhost "testvhost" ...
vhost   name    pattern apply-to        definition      priority
testvhost       testha  ^       all     {"ha-mode":"all","ha-sync-mode":"automatic"}    0

參數(shù)說明:

  • Virtual host:策略應(yīng)用的 vhost猩谊。

  • Name:為策略名稱千劈,可以是任何名稱,但建議使用不帶空格的基于 ASCII 的名稱牌捷。

  • Pattern:與一個(gè)或多個(gè) queue(exchange) 名稱匹配的正則表達(dá)式墙牌,可以使用任何正則表達(dá)式。只有一個(gè) ^ 代表匹配所有暗甥,^test 為匹配名稱為 "test" 的 exchanges 或者 queue喜滨。

  • Apply to:Pattern 應(yīng)用對(duì)象。

  • Priority:配置多個(gè)策略時(shí)的優(yōu)先級(jí)淋袖,值越大鸿市,優(yōu)先級(jí)越高锯梁。沒有指定優(yōu)先級(jí)的消息會(huì)以 0 優(yōu)先級(jí)對(duì)待即碗,對(duì)于超過隊(duì)列所定最大優(yōu)先級(jí)的消息焰情,優(yōu)先級(jí)以最大優(yōu)先級(jí)對(duì)待。

  • Definition:鍵/值對(duì)剥懒,將被插入匹配 queues and exchanges 的可選參數(shù)映射中内舟。

    ha-mode:策略鍵,分為 3 種模式:

    • all :所有的 queue初橘。
    • exctly :部分(需配置 ha-params 參數(shù)验游,此參數(shù)為 int 類型。比如 3保檐,眾多集群中的隨機(jī) 3 臺(tái)機(jī)器)耕蝉。
    • nodes :指定(需配置 ha-params 參數(shù),此參數(shù)為數(shù)組類型夜只。比如 ["rabbit@rabbit2", "rabbit@rabbit3"] 這樣指定為 rabbit2 與 rabbit3 這兩臺(tái)機(jī)器)垒在。

    ha-sync-mode:隊(duì)列同步:

    • manual:手動(dòng)(默認(rèn)模式)。新的隊(duì)列鏡像將不會(huì)收到現(xiàn)有的消息扔亥,它只會(huì)接收新的消息场躯。
    • automatic:自動(dòng)同步。當(dāng)一個(gè)新鏡像加入時(shí)旅挤,隊(duì)列會(huì)自動(dòng)同步踢关。隊(duì)列同步是一個(gè)阻塞操作。

以上就是本篇全部?jī)?nèi)容粘茄,歡迎大家留言交流签舞。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市柒瓣,隨后出現(xiàn)的幾起案子瘪菌,更是在濱河造成了極大的恐慌,老刑警劉巖嘹朗,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件师妙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡屹培,警方通過查閱死者的電腦和手機(jī)默穴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來褪秀,“玉大人蓄诽,你說我怎么就攤上這事∶铰穑” “怎么了仑氛?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我锯岖,道長(zhǎng)介袜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任出吹,我火速辦了婚禮遇伞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捶牢。我一直安慰自己鸠珠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布秋麸。 她就那樣靜靜地躺著渐排,像睡著了一般。 火紅的嫁衣襯著肌膚如雪灸蟆。 梳的紋絲不亂的頭發(fā)上飞盆,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音次乓,去河邊找鬼吓歇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛票腰,可吹牛的內(nèi)容都是我干的城看。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼杏慰,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼测柠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缘滥,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤轰胁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后朝扼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赃阀,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年擎颖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了榛斯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡搂捧,死狀恐怖驮俗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情允跑,我是刑警寧澤王凑,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布搪柑,位于F島的核電站,受9級(jí)特大地震影響索烹,放射性物質(zhì)發(fā)生泄漏工碾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一术荤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧每篷,春花似錦瓣戚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至矗晃,卻和暖如春仑嗅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背张症。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工仓技, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俗他。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓脖捻,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親兆衅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子地沮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359