[官方翻譯]RabbitMQ Federation&Shovel AP 集羣

Federation Cluster

官方提供的另一種集羣方式,基本工做原理:經過使用rabbitmq的插件的形式提供集羣功能. 每一個節點都啓用rabbitmq_federation,rabbitmq_federation_management.節點之間經過 amqp協議傳輸消息,因爲是遵循協議,因此節點之間的版本能夠不一樣,不想原生集羣那麼多限制. 綁定關係,經過設定parameter和policy關聯集羣.html

特性:linux

  1. 鬆耦合 不限制vhost,user甚至erlang/rabbitmq的版本
  2. 網絡友好 不限制網絡範圍,遵循amqp協議便可
  3. 自定義集羣 能夠自定義集羣方式
  4. 可擴展性 沒必要兩兩互聯,能夠單向傳輸

我使用docker建立兩個容器git

docker run -d --hostname my-rabbit-cluster-federation --name my-rabbit-cluster-federation  fansin/rabbitmq-cluster

docker run -d  --link my-rabbit-cluster-federation --hostname my-rabbit-cluster-federation-1 --name my-rabbit-cluster-federation-1  fansin/rabbitmq-cluster

第一步啓動插件 啓動每一個節點的插件github

rabbitmq-plugins enable rabbitmq_federation rabbitmq_federation_management

第二步 downstream節點 設置加入集羣目標節點 設置/清楚參數,用來關聯集羣節點docker

rabbitmqctl set_parameter federation-upstream my-upstream '{"uri":"amqp://admin:admin@my-rabbit-cluster-federation/%2f","expires":3600000}'

rabbitmqctl clear_parameter federation-upstream my-upstream

第三步 downstream節點 設置集羣內容 設置/清除策略,用來肯定加入集羣exchange,沒法加載""空exchange服務器

rabbitmqctl set_policy --apply-to all federate-all "^fed\." '{"federation-upstream-set":"all"}'

rabbitmqctl clear_policy federate-all

單獨設置exchange 或 queuemarkdown

rabbitmqctl set_policy --apply-to queues federate-queue "^queue\." '{"federation-upstream-set":"all"}'

rabbitmqctl set_policy --apply-to exchanges federate-exchange "^exchange\." '{"federation-upstream-set":"all"}'

第四步驗證集羣cookie

rabbitmqctl eval 'rabbit_federation_status:status().'

如今看my-rabbit-cluster-federation的集羣會看到多個鏈接,而後再看 my-rabbit-cluster-federation-1也會看到多個鏈接,同時exchange上會有"federate-all" 特性.網絡

代碼測試用例app

建議先建立好queue或者exchange,若是不提早建立,代碼第一次啓動會報錯.第二次就正常了. 隊列默認建立的是durable的exchange或者queue,若是遇到durable的問題,須要從新刪掉對應的exchange或者queue,從新建立.

docker federation

docker run -d --hostname my-rabbit-federation --name my-rabbit-federation fansin/rabbitmq-federation
docker run -d  --link my-rabbit-federation -e JOIN_CLUSTER=my-rabbit-federation --hostname my-rabbit-federation-1 --name my-rabbit-federation-1 fansin/rabbitmq-federation

再次貼一下與原生集羣的區別:

分佈式原理: Federation / Shovel: exchange 邏輯上是分離的,可能有不一樣的擁有者

Federation/Shovel cluster
exchange是邏輯分離的,可能有不一樣擁有者 單個邏輯exchange
不限制rabbitmq和erlang 版本 rabbitmq和erlang 版本要保持一致
exchange能夠經過不可靠(公網)網絡鏈接,<br/>直接使用amqp鏈接,可是須要設置用戶權限. 可靠(內網)網絡,通訊依賴Erlang interode,共享erlang cookie
拓撲結構能夠是單項或雙向 節點兩兩互聯
cap理論中的ap cap理論中的cp
exchange能夠有單獨的信息,有些消息是本地的 每一個節點的消息都是相同的
客戶端只能看到鏈接的服務器隊列 客戶端能夠看到集羣內全部隊列

沒法正常顯示markdown表格

Federation的高級用法

官網介紹了提供了5種基本集羣格式:

1 基本集羣方式,這個是單向的集羣

2 兩節點相互federation,默認參數max_hops=1不須要特殊設置

3 三節點兩兩federation,上面的節點+1,默認參數max_hops=1不須要特殊設置

4 扇出(p/s訂閱)樹型 跟fanout的exchange相似功能, 注意設置參數max_hops=0, 若是肯定樹的深度,max_hops應當大於等於樹的深度

5 環形 參數設置爲max_hops=5 有一點,一旦環中一個節點down,整個環也就斷了.

比Federation更靈活的Shovel

shovel跟federation使用相似,但使用的是erlang client,更底層,更多配置,也更靈活. 默認使用動態配置,關於靜態配置請詳看官網shovel

特性:

  1. 鬆耦合 不限制vhost,user甚至erlang/rabbitmq的版本
  2. 網絡友好 不限制網絡範圍,遵循amqp協議便可
  3. 高自由度 每一個節點能夠隨意組合其餘節點

一樣使用docker從新建立兩個新容器

docker run -d --hostname my-rabbit-cluster-federation --name my-rabbit-cluster-federation -e RABBITMQ_ERLANG_COOKIE='secret cookie here' fansin/rabbitmq-cluster

docker run -d  --link my-rabbit-cluster-federation --hostname my-rabbit-cluster-federation-1 --name my-rabbit-cluster-federation-1 -e RABBITMQ_ERLANG_COOKIE='secret cookie here' fansin/rabbitmq-cluster

第一步啓動插件 啓動每一個節點的插件

rabbitmq-plugins enable rabbitmq_shovel rabbitmq_shovel_management

第二步 dest節點(在src節點也能夠,比較靈活) 設置加入集羣目標節點 設置/清楚參數,用來關聯集羣節點

rabbitmqctl set_parameter shovel my-shovel-queue '{"src-uri": "amqp://admin:admin@my-rabbit-cluster-federation/%2f", "src-queue": "shovel.queue", "dest-uri": "amqp://admin:admin@my-rabbit-cluster-federation-1/%2f", "dest-queue": "shovel.queue"}'

rabbitmqctl clear_parameter shovel my-shovel-queue

設置exchange

rabbitmqctl set_parameter shovel my-shovel-exchange '{"src-uri": "amqp://admin:admin@my-rabbit-cluster-federation/%2f", "src-exchange": "shovel.exchange", "dest-uri": "amqp://admin:admin@my-rabbit-cluster-federation-1/%2f", "dest-exchange": "shovel.exchange"}'

rabbitmqctl set_parameter shovel my-shovel-exchange-1 '{"src-uri": "amqp://admin:admin@my-rabbit-cluster-federation-1/%2f", "src-exchange": "shovel.exchange", "dest-uri": "amqp://admin:admin@my-rabbit-cluster-federation/%2f", "dest-exchange": "shovel.exchange"}'

在docker容器中,後啓動的容器link了前面的容器,可是前面的沒法識別到後面容器ip,若是要在src節點 設置shovel,注意加入域名映射

echo "172.17.0.4 my-rabbit-cluster-federation-1" >> /etc/hosts

代碼測試用例

建議先建立好queue或者exchange,若是不提早建立,代碼第一次啓動會報錯.第二次就正常了. 隊列默認建立的是durable的exchange或者queue,若是遇到durable的問題,須要從新刪掉對應的exchange或者queue,從新建立.

因爲我的水平有限,若有問題請指出。 https://fansinzhao.github.io/page/image/weixin.png

相關文章
相關標籤/搜索