[Open Source] RabbitMQ 高可用集羣方案

簡介

RabbitMQ是用erlang開發的,集羣很是方便,由於erlang天生就是一門分佈式語言,但其自己並不支持負載均衡。
Rabbit模式大概分爲如下三種:單一模式、普通模式、鏡像模式node

RabbitMQ工做模式

  • 單一模式 (最簡單的狀況,非集羣模式)nginx

  • 普通模式 (默認的集羣模式)
    • 流程
      • 對於Queue來講,消息實體只存在於其中一個節點,A、B兩個節點僅有相同的元數據,即隊列結構。
      • 當消息進入A節點的Queue中後,consumer從B節點拉取時,RabbitMQ會臨時在A、B間進行消息傳輸,把A中的消息實體取出並通過B發送給consumer。
    • 問題
      • 該模式存在一個問題就是當A節點故障後,B節點沒法取到A節點中還未消費的消息實體。
      • 若是作了消息持久化,那麼得等A節點恢復,而後纔可被消費;若是沒有持久化的話,而後就沒有而後了
  • 鏡像模式
    • 流程
      • 把須要的隊列作成鏡像隊列,存在於多個節點,屬於RabbitMQ的HA方案。
      • 消息實體會主動在鏡像節點間同步,而不是在consumer取數據時臨時拉取。
    • 問題
      • 下降系統性能
      • 集羣帶寬大大消耗(若是鏡像隊列數量過多,加之大量的消息進入)
    • 優勢
      • 對可靠性要求較高的場合中適用
  • 集羣說明
    • 一個rabbitmq集 羣中能夠共享 user,vhost,queue,exchange等,全部的數據和狀態都是必須在全部節點上覆制的

集羣搭建

  • 操做步驟(node1爲主,node2,node3爲從,node4爲proxy)
    • 在 192.168.0.1(node1)、192.168.0.2(node2)、192.168.0.3(node3) 三個節點上安裝,而後開啓 RabbitMQ 監控插件
    • node1
      • .erlang.cookie文件拷貝到 node二、node3
    • node1,node2,node3
      • rabbitmqctl stop // 中止Rabbit
      • rabbitmq-server -detached //
    • node2,node3
      • rabbitmqctl stop
      • rabbitmqctl join_cluster rabbit@node1
      • rabbitmqctl start_app
    • node4
      • 做爲proxy指向node1,node2,node3(用於透明調用使用)
      • 固然,你也能夠經過var connection = factory.CreateConnection(["ip1","ip2"].ToList());
    • cli
      • rabbitmqctl cluster_status // 檢查集羣狀態
      • rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}' // 添加策略
    • gui(若是cli不方便的話)

說明

  • proxy 層可用nginx haproxy nlb lvs服務器

  • 集羣搭建完,任意一臺Rabbit服務器(節點)掛了,都能正常取到數據。保證了高可用。cookie

  • 順便推薦下本身封裝的Rabbit(Install-Package RabbitMQ.Wrapper)
    • 自動重連
    • 自定義配置
    • 持久化消息
相關文章
相關標籤/搜索