<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          RabbitMQ高可用介紹

          共 8051字,需瀏覽 17分鐘

           ·

          2020-08-18 02:33

          程序員的成長之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
          關(guān)注


          閱讀本文大概需要 7.5 分鐘。

          原文轉(zhuǎn)自:http://dwz.date/bZGE
          作者:yuzhen0228

          1.全局圖

          HAproxy 來做 RabbitMQ 負(fù)載均衡和高可用,用 Keepalived 來保證 HAproxy 的高可用。
          客戶端通過VIP建立通信鏈路;通信鏈路通過Keeaplived的Master節(jié)點(diǎn)路由到對應(yīng)的HAProxy之上;HAProxy通過負(fù)載均衡算法將負(fù)載分發(fā)到集群中的各個節(jié)點(diǎn)之上。正常情況下客戶端的連接通過圖中左側(cè)部分進(jìn)行負(fù)載分發(fā)。當(dāng)Keepalived的Master節(jié)點(diǎn)掛掉或者HAProxy掛掉無法恢復(fù),那么Backup提升為Master,客戶端的連接通過圖中右側(cè)部分進(jìn)行負(fù)載分發(fā)。
          如果你追求要更高的可靠性,可以加入多個Backup角色的Keepalived節(jié)點(diǎn)來實(shí)現(xiàn)一主多從的多機(jī)熱備。當(dāng)然這樣會提升硬件資源的成本,該如何抉擇需要更細(xì)致的考恒,一般情況下雙機(jī)熱備的配備已足夠滿足應(yīng)用需求。

          2.首先要先安裝RabbitMQ

          1).首先需要安裝erlang

          #rpm?-Uvh?https://mirrors.tuna.tsinghua.edu.cn/epel/epel-release-latest-7.noarch.rpm
          #yum?install?erlang

          安裝過程中會有提示,一路輸入“y”即可。
          2).完成后安裝RabbitMQ:
          先下載rpm:

          #wget?http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.6/rabbitmq-server-3.6.6-1.el7.noarch.rpm

          下載完成后安裝:

          #yum?install?rabbitmq-server-3.6.6-1.el7.noarch.rpm?
          完成后啟動服務(wù):
          #service?rabbitmq-server?start
          可以查看服務(wù)狀態(tài):
          #service?rabbitmq-server?status

          3.配置rabbitmq cluster

          先保證各個rabbitmq節(jié)點(diǎn)都是可以訪問的,將這兩個節(jié)點(diǎn)連接起來形成高可用的cluster,這樣我們就可以讓我們的exchange、queue在這兩個節(jié)點(diǎn)之間復(fù)制,形成高可用的queue。

          cd?/var/lib/rabbitmq

          里面有一個隱藏文件.erlang.cookie文件,這個文件是erlang用來發(fā)現(xiàn)和互連的基礎(chǔ)。
          我們需要做的很簡單,將兩個節(jié)點(diǎn)中的.erlang.cookie設(shè)置成一樣的。
          這是erlang的約定,一樣的cookie hash key他認(rèn)為是合法和正確的連接。
          .erlang.cookie默認(rèn)是只讀的,你需要修改下寫入權(quán)限,然后復(fù)制粘貼下cookie ?字符串即可。

          chmod?u+w?.erlang.cookie

          配置好了之后接下來配置hosts文件,erlang會使用hosts文件里的配置去發(fā)現(xiàn)節(jié)點(diǎn)。

          vim?/etc/hosts

          10.64.16.123????l-rabbitmq1
          10.64.17.11??????l-rabbitmq2

          保證同樣的配置在所有的節(jié)點(diǎn)上都是相同的。
          驗(yàn)證你配置的正確不正確你只需要在你的機(jī)器上ping,試下請求的ip是不是你配置的即可。按照DNS的請求原理,hosts是最高優(yōu)先權(quán),除非瀏覽器有緩存,你直接用ping就不會有問題的。
          選擇一個節(jié)點(diǎn)stop,然后連接到另外節(jié)點(diǎn)。
          這里以節(jié)點(diǎn) l-rabbitmq2為例,

          rabbitmqctl?stop_app

          rabbitmqctl?join_cluster?rabbit@?l-rabbitmq1

          rabbitmqctl?start_app

          節(jié)點(diǎn)已經(jīng)連接成功。
          默認(rèn)情況下節(jié)點(diǎn)占用的memory是總內(nèi)存的40%,可以根據(jù)自己的用途仔細(xì)研究rabbitmq的配置項(xiàng)。為了提高性能,不需要兩個節(jié)點(diǎn)都是disc的節(jié)點(diǎn),所以我們需要啟動一個節(jié)點(diǎn)為RAM模式。

          rabbitmqctl?change_cluster_node_type??ram??(需要先停掉,才能更改)

          改變l-rabbitmq2為內(nèi)存節(jié)點(diǎn)模式。

          4.mirror queue policy設(shè)置

          設(shè)置成鏡像隊(duì)列
          可以在機(jī)器上,用命令行設(shè)置,也可以在管理頁面進(jìn)行創(chuàng)建
          設(shè)置policy,以ha.開頭的隊(duì)列將會被鏡像到集群其他所有節(jié)點(diǎn),一個節(jié)點(diǎn)掛掉然后重啟后會自動同步隊(duì)列消.
          命令行:

          rabbitmqctl?set_policy?ha-all?"^ha\."?'{"ha-mode":"all","ha-sync-mode":"automatic"}'???????????????//意思表示以ha.開頭的queue都會復(fù)制到各個節(jié)點(diǎn)?

          5.Keepalived

          Keepalived 的作用是檢測服務(wù)器的健康狀態(tài),在所有可能出現(xiàn)單點(diǎn)故障的地方為其提供高可用。如果有一臺服務(wù)器死機(jī),或工作出現(xiàn)故障,Keepalived 將檢測到,并將有故障的服務(wù)器從系統(tǒng)中剔除,當(dāng)服務(wù)器工作正常后 Keepalived 自動將服務(wù)器加入到服務(wù)器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復(fù)故障的服務(wù)器。
          這里使用的實(shí)現(xiàn)方式是單活方式,即主節(jié)點(diǎn)的 HAproxy 正常運(yùn)行,備節(jié)點(diǎn)的會被停止。當(dāng)主節(jié)點(diǎn)的出現(xiàn)故障時(shí),備節(jié)點(diǎn)的 HAproxy 會自動啟動。當(dāng)主節(jié)點(diǎn)的恢復(fù)后,備節(jié)點(diǎn)的會自動停止。
          安裝keepalived


          yum?-y?install?keepalived

          vim??/etc/keepalived/keepalived.conf?:

          主: ?(10.64.16.123 ? ?l-rabbitmq1)

          !?Configuration?File?for?keepalived
          global_defs?{
          notification_email?{
          [email protected]
          [email protected]
          [email protected]
          }
          [email protected]
          smtp_server?192.168.200.1
          smtp_connect_timeout?30
          router_id?LVS_DEVEL
          vrrp_skip_check_adv_addr
          #vrrp_strict?????????????????????????#要注釋掉
          vrrp_garp_interval?0
          vrrp_gna_interval?0
          }
          ?
          vrrp_script?chk_haproxy?{
          ????script?"service?haproxy?status"??#?服務(wù)探測,返回0說明服務(wù)是正常的
          ????interval?1???????????????????????#?每隔1秒探測一次
          ????weight?-2????????????????????????#?不正常時(shí),權(quán)重-1,即haproxy上線,權(quán)重加2;下線,權(quán)重減2
          }
          ?
          vrrp_instance?haproxy?{
          ????state?MASTER?????????????????#?主機(jī)為MASTER,備機(jī)為BACKUP
          ????interface?eth0???????????????#?監(jiān)測網(wǎng)絡(luò)端口,用ifconfig查看
          ????virtual_router_id?108????????#?虛擬路由標(biāo)識,同一個VRRP實(shí)例要使用同一個標(biāo)識,主備機(jī)必須相同
          ????priority?100?????????????????#?主備機(jī)取不同的優(yōu)先級,確保主節(jié)點(diǎn)的優(yōu)先級高過備用節(jié)點(diǎn)
          ????advert_int?1?????????????????#?VRRP?Multicast廣播周期秒數(shù)??用于設(shè)定主備節(jié)點(diǎn)間同步檢查時(shí)間間隔
          ????authentication?{
          ????????auth_type?PASS???????????#?VRRP認(rèn)證方式
          ????????auth_pass?1234???????????#?VRRP口令?主備機(jī)密碼必須相同
          ????}
          ????track_script?{???????????????#?調(diào)用haproxy進(jìn)程檢測腳本,備節(jié)點(diǎn)不配置
          ????????chk_haproxy
          ????}
          ????virtual_ipaddress?{
          ????????10.64.16.254?????????????#vip
          ????}
          ????notify_master?"/etc/keepalived/notify.sh?master"??????#?當(dāng)前節(jié)點(diǎn)成為master時(shí),通知腳本執(zhí)行任務(wù),一般用于啟動某服務(wù)
          ????notify_backup?"/etc/keepalived/notify.sh?backup"??????#?當(dāng)前節(jié)點(diǎn)成為backup時(shí),通知腳本執(zhí)行任務(wù),一般用于關(guān)閉某服務(wù)
          }

          備: (10.64.17.11 ? ? ?l-rabbitmq2)

          !?Configuration?File?for?keepalived
          ?
          global_defs?{
          ???notification_email?{
          [email protected]
          [email protected]
          [email protected]
          ???}
          [email protected]
          ???smtp_server?192.168.200.1
          ???smtp_connect_timeout?30
          ???router_id?LVS_DEVEL
          ???vrrp_skip_check_adv_addr
          ???#?vrrp_strict????????????????????#要注釋掉
          ???vrrp_garp_interval?0
          ???vrrp_gna_interval?0
          }
          ?
          ?
          vrrp_script?chk_haproxy?{
          ????script?"service?haproxy?status"?#?服務(wù)探測,返回0說明服務(wù)是正常的
          ????interval?1??????????????????????#?每隔1秒探測一次
          ????weight?-2???????????????????????#?不正常時(shí),權(quán)重-1,即haproxy上線,權(quán)重加2;下線,權(quán)重減2
          }
          ?
          vrrp_instance?haproxy?{
          ????state?BACKUP????????????#?主機(jī)為MASTER,備機(jī)為BACKUP
          ????interface?eth0?????????#?監(jiān)測網(wǎng)絡(luò)端口,用ifconfig查看
          ????virtual_router_id?108???#?虛擬路由標(biāo)識,同一個VRRP實(shí)例要使用同一個標(biāo)識,主備機(jī)必須相同
          ????priority?99????????????#?主備機(jī)取不同的優(yōu)先級,確保主節(jié)點(diǎn)的優(yōu)先級高過備用節(jié)點(diǎn)
          ????advert_int?1????????????#?VRRP?Multicast廣播周期秒數(shù)??用于設(shè)定主備節(jié)點(diǎn)間同步檢查時(shí)間間隔
          ????authentication?{
          ????????auth_type?PASS??????#?VRRP認(rèn)證方式
          ????????auth_pass?1234??????#?VRRP口令?主備機(jī)密碼必須相同
          ????}
          ?
          ????virtual_ipaddress?{?????#?VIP?漂移地址?即集群IP地址
          ????????10.64.16.254
          ????}
          }

          notify.sh腳本放在 /etc/keepalived/ 目錄下,并賦予可執(zhí)行權(quán)限。

          #!/bin/bash
          ?

          case?"$1"?in
          ????master)
          ????????notify?master
          ????????service?haproxy?start
          ????????exit?0
          ????;;
          ????backup)
          ????????notify?backup
          ????????service?haproxy?stop
          ????????exit?0
          ????;;
          ????fault)
          ????????notify?fault
          ????????service?haproxy?stop
          ????????exit?0
          ????;;
          ????*)
          ????????echo?'Usage:?`basename?$0`?{master|backup|fault}'
          ????????exit?1
          ????;;
          esac

          啟動keepalived service keepalived restartnotify.sh腳本放在/etc/keepalived/目錄下,并賦予可執(zhí)行權(quán)限。

          6.Haproxy負(fù)載代理

          利用haproxy做負(fù)載均衡
          安裝haproxy

          yum?install?haproxy

          vim??/etc/haproxy/haproxy.cfg

          在代碼之后添加

          #######################HAproxy監(jiān)控頁面#########################
          listen?http_front
          ????????bind?0.0.0.0:1080???????????#監(jiān)聽端口
          ????????stats?refresh?30s???????????#統(tǒng)計(jì)頁面自動刷新時(shí)間
          ????????stats?uri?/haproxy?stats????#統(tǒng)計(jì)頁面url
          ????????stats?realm?Haproxy?Manager?#統(tǒng)計(jì)頁面密碼框上提示文本
          ????????stats?auth?admin:1234??????#統(tǒng)計(jì)頁面用戶名和密碼設(shè)置
          ????????#stats?hide-version?????????#隱藏統(tǒng)計(jì)頁面上HAProxy的版本信息
          ?
          #####################RabbitMQ的管理界面###############################
          listen?rabbitmq_admin
          ????bind?10.64.16.254:15673
          ????server?l-rabbitmq1?10.64.16.123:15672
          ????server?l-rabbitmq2?10.64.17.11:15672
          ?
          #####################RabbitMQ服務(wù)代理###########################################
          listen?rabbitmq_cluster?10.64.16.254:5673
          ????mode?tcp
          ????stats?enable
          ????balance?roundrobin
          ????option?tcpka
          ????option?tcplog
          ????timeout?client?3h
          ????timeout?server?3h
          ????timeout?connect?3h
          ????#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
          ????server???l-rabbitmq1?10.64.16.123:5672?check?inter?5s?rise?2?fall?3???#check?inter?2000?是檢測心跳頻率,rise?2是2次正確認(rèn)為服務(wù)器可用,fall?3是3次失敗認(rèn)為服務(wù)器不可用
          ????server???l-rabbitmq2?10.64.17.11:5672?check?inter?5s?rise?2?fall?3

          haproxy?-f?haproxy.cfg啟動

          重啟動

          service?haproxy?restart

          6.搭建成功

          ip?a??

          http://10.64.16.254:1080/haproxy?stats看一下監(jiān)控頁面,如果顯示出正常就表明已經(jīng)將 HAProxy 負(fù)載均衡配置好了。

          http://10.64.16.254:15673??rabbitmq管理頁面

          測試

          生產(chǎn)者

          import?pika

          connection?=?pika.BlockingConnection(
          ????pika.ConnectionParameters('10.64.16.254',5673,virtual_host="/",credentials=pika.PlainCredentials(username="admin",password="1234"))??#?默認(rèn)端口5672,可不寫
          ?)
          channel?=?connection.channel()
          channel.queue_declare(queue='ha_1')
          channel.basic_publish(exchange='',routing_key='ha_1',body='haha?Hello?World!')?
          connection.close()??#?隊(duì)列關(guān)閉

          消費(fèi)者

          import?pika
          import?time

          connection?=?pika.BlockingConnection(pika.ConnectionParameters('10.64.16.254',5673,virtual_host="/",credentials=pika.PlainCredentials(username="admin",password="1234"))??#?默認(rèn)端口5672,可不寫
          )
          channel?=?connection.channel()

          channel.queue_declare(queue='ha_1')

          def?callback(ch,?method,?properties,?body):??#?四個參數(shù)為標(biāo)準(zhǔn)格式
          ?print("?[x]?Received?%r"?%?body)
          ????time.sleep(15)
          ????ch.basic_ack(delivery_tag?=?method.delivery_tag)
          ????print("done")

          channel.basic_consume(callback,queue='ha_1')

          print('?[*]?Waiting?for?messages.?To?exit?press?CTRL+C')
          channel.start_consuming()

          推薦閱讀:

          厲害了!手?jǐn)]一個SpringBoot緩存系統(tǒng),性能杠杠的!

          這幾個開源的商城實(shí)戰(zhàn)項(xiàng)目,良月柒強(qiáng)烈推薦!

          5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹莓派,等等。在公眾號內(nèi)回復(fù)「2048」,即可免費(fèi)獲取!!

          微信掃描二維碼,關(guān)注我的公眾號

          寫留言

          朕已閱?

          瀏覽 50
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  五月天在线欧美日韩在线 | 波多野结衣在线精品 | 天天天天天操 | 先锋女人资源 | 伊人中文在线 |