分布式專(zhuān)題|女朋友突然問(wèn)我如何使用Docker搭建RabbitMQ集群并實(shí)現(xiàn)高可用赊时?

在女朋友的再三追問(wèn)下吨铸,于是就有了這篇文章!5暗稹焊傅!

集群搭建

如果還不會(huì)docker的話(huà)剂陡,可以先自行學(xué)習(xí)下哦

  • 創(chuàng)建rabbitmq需要的網(wǎng)絡(luò)
docker network create rabbtimane
  • 安裝三個(gè)rabbitmq組件狈涮,一主兩從
# 三條命令分批執(zhí)行狐胎,如果下載比較慢,建議更換阿里云docker鏡像加速
docker run -d --name=rabbitmq_master -p 5672:5672 -p 15672:15672 -e RABBITMQ_NODENAME=rabbitmq_master -e RABBITMQ_ERLANG_COOKIE='1111111' -h rabbitmq_master --net=rabbtimanet -v ~/docker/rabbitmq_master/data:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3.7.7-management
docker run -d --name=rabbitmq_slave1 -p 5673:5672 -p 15673:15672 -e RABBITMQ_NODENAME=rabbitmq_slave1 -e RABBITMQ_ERLANG_COOKIE='1111111' -h rabbitmq_slave1 --net=rabbtimanet -v ~/docker/rabbitmq_slave1/data:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3.7.7-management
docker run -d --name=rabbitmq_slave2 -p 5674:5672 -p 15674:15672 -e RABBITMQ_NODENAME=rabbitmq_slave2 -e RABBITMQ_ERLANG_COOKIE='1111111' -h rabbitmq_slave2 --net=rabbtimanet -v ~/docker/rabbitmq_slave2/data:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3.7.7-management
  • 開(kāi)啟三個(gè)組件的管理端插件
docker exec -it rabbitmq_master bash
rabbitmq-plugins enable rabbitmq_management
exit

docker exec -it rabbitmq_slave1 bash
rabbitmq-plugins enable rabbitmq_management
exit

docker exec -it rabbitmq_slave2 bash
rabbitmq-plugins enable rabbitmq_management
exit
  • 瀏覽器分別訪(fǎng)問(wèn)以下地址歌馍,用戶(hù)名和密碼都是admin

    http://localhost:15672/#/
    http://localhost:15673/#/
    http://localhost:15674/#/
    如果成功登入握巢,則代表組件安裝成功,但是這時(shí)候還不是集群模式松却,我們需要手動(dòng)加入到集群

  • 從節(jié)點(diǎn)加入到主節(jié)點(diǎn)暴浦,實(shí)現(xiàn)集群模式

# salve1加入集群
docker exec -it rabbitmq_slave1 bash
rabbitmqctl stop_app
# 節(jié)點(diǎn)名@用戶(hù)名
rabbitmqctl join_cluster rabbitmq_master@rabbitmq_master
abbitmqctl start_app
exit

# salve2加入集群
docker exec -it rabbitmq_slave2 bash
rabbitmqctl stop_app
# 節(jié)點(diǎn)名@用戶(hù)名
rabbitmqctl join_cluster rabbitmq_master@rabbitmq_master
abbitmqctl start_app
exit

現(xiàn)在重新打開(kāi)管理頁(yè)面發(fā)現(xiàn),會(huì)出現(xiàn)了集群模式:


image.png

到目前為止晓锻,集群模式已經(jīng)搭建完畢歌焦,但是這里還是不夠的,RabbitMQ搭建的默認(rèn)集群是普通模式的集群

普通模式的集群

普通模式的集群是不會(huì)將創(chuàng)建的隊(duì)列復(fù)制到其他節(jié)點(diǎn),雖然我們?cè)谄渌?jié)點(diǎn)能夠看到這個(gè)節(jié)點(diǎn)砚哆;這是由于其它節(jié)點(diǎn)只會(huì)保存一份這個(gè)隊(duì)列的元數(shù)據(jù)独撇,展示給我們看的,真實(shí)的隊(duì)列還是存在創(chuàng)建這個(gè)隊(duì)列的節(jié)點(diǎn)中的躁锁;如果這個(gè)時(shí)候我們把創(chuàng)建隊(duì)列的的節(jié)點(diǎn)關(guān)閉纷铣,那么這個(gè)隊(duì)列其實(shí)就不可用了;
為了解決這個(gè)問(wèn)題战转,rabbitmq還提供了另外一種集群模式:鏡像模式

鏡像模式

鏡像模式是rabbit提供的一種可添加的策略模式搜立,如果創(chuàng)建的隊(duì)列和創(chuàng)建的策略能夠匹配上,則會(huì)把隊(duì)列同步復(fù)制到其他節(jié)點(diǎn)中槐秧,而不再只是復(fù)制元數(shù)據(jù)啄踊;

  • 添加策略模式有兩種方式
  • 管理頁(yè)面添加
    admin->Policies>add policy
    參數(shù)解釋?zhuān)?br> name: 策略名稱(chēng)
    Pattern:通配符,創(chuàng)建的隊(duì)列名稱(chēng)如果匹配到這個(gè)通配符刁标,則使用該策略颠通,如^匹配所有隊(duì)列
    Definition: 設(shè)置復(fù)制模式
    我這里設(shè)置的配置如下


    image.png
* 通過(guò)命令方式添加

```
# 可以在任意節(jié)點(diǎn)執(zhí)行如下命令,我這里是在從節(jié)點(diǎn)1上執(zhí)行的命雀,它會(huì)自動(dòng)在集群中同步
docker exec -it rabbitmq_slave1 bash

rabbitmqctl set_policy my_ha "^" '{"ha-mode":"all"}'
exit
```
到這里蒜哀,集群已經(jīng)真正的搭建完成了,我們現(xiàn)在看下如何在項(xiàng)目中整合吧吏砂!

SpringBoot整合RabbitMQ集群

  • 添加依賴(lài)
    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
  • 創(chuàng)建配置文件
spring:
  rabbitmq:
#    host: 127.0.0.1
#    port: 5672
# 這里應(yīng)該使用address撵儿,如果是單機(jī)的可以使用host+port
    addresses: 127.0.0.1:5672,127.0.0.1:5673,127.0.0.1:5674
#    virtual-host: my_vhost
    username: admin
    password: admin
    publisher-returns: true
    publisher-confirm-type: simple

具體項(xiàng)目可以見(jiàn) https://gitee.com/yangleliu/code_learning.git

SpringBoot直接整合RabbitMQ集群的一些問(wèn)題

上面已經(jīng)完成springboot整合rabbitmq集群的工作,但是在運(yùn)行過(guò)程中發(fā)現(xiàn)了以下幾個(gè)問(wèn)題:

  • springboot會(huì)一直使用一個(gè)連接狐血,就算配置了三個(gè)地址
  • 只有當(dāng)連接的節(jié)點(diǎn)掛機(jī)之后淀歇,才會(huì)嘗試連接其它節(jié)點(diǎn)

總結(jié):如果配置了集群模式,但是客戶(hù)端還是一直連接同一個(gè)節(jié)點(diǎn)匈织,就會(huì)出現(xiàn)資源浪費(fèi)及單節(jié)點(diǎn)負(fù)載壓力巨大浪默,也就是負(fù)載不均衡,這個(gè)目前springboot還沒(méi)有解決方案牡直,但是我們可以借助負(fù)載均衡框架HAProxy幫助我們實(shí)現(xiàn)

RabbitMQ整合HAProxy實(shí)現(xiàn)負(fù)載均衡

HAProxy是個(gè)啥

HAProxy提供高可用性、負(fù)載均衡以及基于TCP和HTTP應(yīng)用的代理纳决,支持虛擬主機(jī)碰逸,它是免費(fèi)、快速并且可靠的一種解決方案阔加。HAProxy特別適用于那些負(fù)載特大的web站點(diǎn)饵史, 這些站點(diǎn)通常又需要會(huì)話(huà)保持或七層處理。HAProxy運(yùn)行在當(dāng)前的硬件上胜榔,完全可以支持?jǐn)?shù)以萬(wàn)計(jì)的并發(fā)連接胳喷。并且它的運(yùn)行模式使得它可以很簡(jiǎn)單安全的整合進(jìn)您當(dāng)前的架構(gòu)中, 同時(shí)可以保護(hù)你的web服務(wù)器不被暴露到網(wǎng)絡(luò)上夭织。

整合HAProxy

我這里還是通過(guò)docker安裝HAProxy吭露,因?yàn)槭褂胐okcer安裝軟件是真的香。

  • 添加配置文件
mkdir ~/docker/haproxy/5677
mkdir ~/docker/haproxy/5678
# 修改配置文件1
vim ~/docker/haproxy/5677/haproxy.cfg

#logging options
global
    log 127.0.0.1 local0 info
    maxconn 5120
    chroot /usr/local/etc/haproxy
    uid 99
    gid 99
    daemon
    quiet
    nbproc 20
    pidfile /var/run/haproxy.pid

defaults
    log global
    #使用4層代理模式尊惰,”mode http”為7層代理模式
    mode tcp
    #if you set mode to tcp,then you nust change tcplog into httplog
    option tcplog
    option dontlognull
    retries 3
    option redispatch
    maxconn 2000
    timeout connect 5s
    #客戶(hù)端空閑超時(shí)時(shí)間為 60秒 則HA 發(fā)起重連機(jī)制
    timeout client 60s
    #服務(wù)器端鏈接超時(shí)時(shí)間為 15秒 則HA 發(fā)起重連機(jī)制
    timeout server 15s
#front-end IP for consumers and producters

listen rabbitmq_cluster
    bind 0.0.0.0:5677
    #配置TCP模式
    mode tcp
    #balance url_param userid
    #balance url_param session_id check_post 64
    #balance hdr(User-Agent)
    #balance hdr(host)
    #balance hdr(Host) use_domain_only
    #balance rdp-cookie
    #balance leastconn
    #balance source //ip
    #簡(jiǎn)單的輪詢(xún)
    balance roundrobin
    #rabbitmq集群節(jié)點(diǎn)配置 
    #inter 每隔五秒對(duì)mq集群做健康檢查讲竿, 2次正確證明服務(wù)器可用,2次失敗證明服務(wù)器不可用择浊,并且配置主備機(jī)制
    server rabbitmq_master 192.168.0.103:5672 check inter 5000 rise 2 fall 2
    server rabbitmq_salve1 192.168.0.103:5673 check inter 5000 rise 2 fall 2
    server rabbitmq_salve2 192.168.0.103:5674 check inter 5000 rise 2 fall 2
#配置haproxy web監(jiān)控戴卜,查看統(tǒng)計(jì)信息
listen stats
    bind 0.0.0.0:8100
    mode http
    option httplog
    stats enable
    #設(shè)置haproxy監(jiān)控地址為http://localhost:8100/rabbitmq-stats
    stats uri /rabbitmq-stats
    stats refresh 5s
    stats auth admin:123456
listen rabbitmq_admin #監(jiān)聽(tīng)8000端口轉(zhuǎn)發(fā)到rabbitmq的客戶(hù)端
    bind 0.0.0.0:8000
    server rabbitmq_master 192.168.0.103:15672 check inter 5000 rise 2 fall 2
    server rabbitmq_salve1 192.168.0.103:15673 check inter 5000 rise 2 fall 2
    server rabbitmq_salve2 192.168.0.103:15674 check inter 5000 rise 2 fall 2
   
####################################################### 
# 修改配置文件2
vim ~/docker/haproxy/5678/haproxy.cfg
   
   #logging options
global
    log 127.0.0.1 local0 info
    maxconn 5120
    chroot /usr/local/etc/haproxy
    uid 99
    gid 99
    daemon
    quiet
    nbproc 20
    pidfile /var/run/haproxy.pid

defaults
    log global
    #使用4層代理模式,”mode http”為7層代理模式
    mode tcp
    #if you set mode to tcp,then you nust change tcplog into httplog
    option tcplog
    option dontlognull
    retries 3
    option redispatch
    maxconn 2000
    timeout connect 5s
    #客戶(hù)端空閑超時(shí)時(shí)間為 60秒 則HA 發(fā)起重連機(jī)制
    timeout client 60s
    #服務(wù)器端鏈接超時(shí)時(shí)間為 15秒 則HA 發(fā)起重連機(jī)制
    timeout server 15s
#front-end IP for consumers and producters

listen rabbitmq_cluster
    bind 0.0.0.0:5678
    #配置TCP模式
    mode tcp
    #balance url_param userid
    #balance url_param session_id check_post 64
    #balance hdr(User-Agent)
    #balance hdr(host)
    #balance hdr(Host) use_domain_only
    #balance rdp-cookie
    #balance leastconn
    #balance source //ip
    #簡(jiǎn)單的輪詢(xún)
    balance roundrobin
    #rabbitmq集群節(jié)點(diǎn)配置 
    #inter 每隔五秒對(duì)mq集群做健康檢查琢岩, 2次正確證明服務(wù)器可用投剥,2次失敗證明服務(wù)器不可用,并且配置主備機(jī)制
    server rabbitmq_master 192.168.0.103:5672 check inter 5000 rise 2 fall 2
    server rabbitmq_salve1 192.168.0.103:5673 check inter 5000 rise 2 fall 2
    server rabbitmq_salve2 192.168.0.103:5674 check inter 5000 rise 2 fall 2
#配置haproxy web監(jiān)控担孔,查看統(tǒng)計(jì)信息
listen stats
    bind 0.0.0.0:8101
    mode http
    option httplog
    stats enable
    #設(shè)置haproxy監(jiān)控地址為http://localhost:8100/rabbitmq-stats
    stats uri /rabbitmq-stats
    stats refresh 5s
    stats auth admin:123456
listen rabbitmq_admin #監(jiān)聽(tīng)8000端口轉(zhuǎn)發(fā)到rabbitmq的客戶(hù)端
    bind 0.0.0.0:8001
    server rabbitmq_master 192.168.0.103:15672 check inter 5000 rise 2 fall 2
    server rabbitmq_salve1 192.168.0.103:15673 check inter 5000 rise 2 fall 2
    server rabbitmq_salve2 192.168.0.103:15674 check inter 5000 rise 2 fall 2
  • 啟動(dòng)兩個(gè)HAProxy
docker run --name rabbitmq-haproxy5677 -p 5677:5677 -p 8100:8100 -p 8000:8000 -d  --net=rabbtimanet -v ~/docker/haproxy/5677/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro haproxy:latest
docker run --name rabbitmq-haproxy5678 -p 5678:5678 -p 8101:8101 -p 8001:8001 -d  --net=rabbtimanet -v ~/docker/haproxy/5678/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro haproxy:latest

我安裝了兩個(gè)HAProxy,是為了做高可用江锨,防止其中一個(gè)掛掉了,導(dǎo)致不能對(duì)外提供服服務(wù)糕篇。

springboot配置文件修改如下:

spring:
  rabbitmq:
#    host: 127.0.0.1
#    port: 5672
    addresses: 127.0.0.1:5677,127.0.0.1:5678
#    virtual-host: my_vhost
    username: admin
    password: admin
    publisher-returns: true
    publisher-confirm-type: simple

這里已經(jīng)改成連接到兩個(gè)HAProxy了,自行測(cè)試使用吧啄育,代碼已經(jīng)上傳到代碼庫(kù)咯

總結(jié)

其實(shí)安裝rabbitmq是很麻煩的,需要解決各種環(huán)境問(wèn)題拌消;但是好在我這里使用了docker挑豌,可以很順暢的完成安裝;然后把主要的時(shí)間放在調(diào)試集群上面墩崩,安裝過(guò)程中也遇到了不少坑氓英,建議大家按照這個(gè)實(shí)操下,畢竟只有自己走過(guò)這些坑鹦筹,才會(huì)讓自己后面不會(huì)再遇到坑啊铝阐,如果大家有遇到解決不了的問(wèn)題,可以私信我哦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铐拐,一起剝皮案震驚了整個(gè)濱河市徘键,隨后出現(xiàn)的幾起案子练对,更是在濱河造成了極大的恐慌,老刑警劉巖吹害,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件螟凭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡赠制,警方通過(guò)查閱死者的電腦和手機(jī)赂摆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)挟憔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)钟些,“玉大人,你說(shuō)我怎么就攤上這事绊谭≌校” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵达传,是天一觀的道長(zhǎng)篙耗。 經(jīng)常有香客問(wèn)我,道長(zhǎng)宪赶,這世上最難降的妖魔是什么宗弯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮搂妻,結(jié)果婚禮上蒙保,老公的妹妹穿的比我還像新娘。我一直安慰自己欲主,他們只是感情好邓厕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著扁瓢,像睡著了一般详恼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上引几,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天昧互,我揣著相機(jī)與錄音,去河邊找鬼伟桅。 笑死敞掘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贿讹。 我是一名探鬼主播渐逃,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼民褂!你這毒婦竟也來(lái)了茄菊?” 一聲冷哼從身側(cè)響起疯潭,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎面殖,沒(méi)想到半個(gè)月后竖哩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脊僚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年相叁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辽幌。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡增淹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乌企,到底是詐尸還是另有隱情虑润,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布加酵,位于F島的核電站拳喻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏猪腕。R本人自食惡果不足惜冗澈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望陋葡。 院中可真熱鬧亚亲,春花似錦、人聲如沸脖岛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)柴梆。三九已至陨溅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绍在,已是汗流浹背门扇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留偿渡,地道東北人臼寄。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像溜宽,于是被迫代替她去往敵國(guó)和親吉拳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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