RabbitMQ學習筆記(5、RabbitMQ集羣)

目錄:

  • RabbitMQ集羣
  • 鏡像隊列
  • RabbitMQ服務日誌
  • RabbitMQ分佈式部署
  • 高可用集羣

RabbitMQ集羣:

一、集羣中組件的狀態node

首先MQ必定要是一個高可用的中間件因此集羣確定是必不可少的,它能夠提升RabbitMQ的吞吐量。算法

那你可能會問RabbitMQ集羣后消息就不會丟失了麼?會丟失的,當一個節點崩潰後全部的消息都會丟失,由於RabbitMQ默認是不會將消息在集羣中複製的。網絡

隊列在集羣中如何存在:隊列在集羣中是不會複製的,其它節點只會保存隊列所處的元數據。app

交換器在集羣中如何存在:交換器再集羣中會複製,由於它自己也只是一個相似於Hashmap的映射關係。負載均衡

建議:集羣中至少要有一個磁盤節點(也就是持久化的RabbitMQ節點),雖然磁盤節點掛掉了依然能夠發送和接受消息,但卻不能執行建立隊列、交換器、綁定關係等等操做。高可用的話建議至少兩個磁盤節點,若是不確認如何選擇磁盤節點與內存節點時建議所有選擇磁盤節點,但這樣的話會在必定程度上影響RabbitMQ的吞吐量。分佈式

二、單機多節點集羣(本身玩玩時使用,不建議在生產環境中使用fetch

三、多機多節點集羣優化

四、集羣管理spa

鏡像隊列:

若是RabbitMQ中只有一個broker節點的話,那麼在節點宕機後會有短暫的時間沒法提供服務,可能會致使消息的丟失。插件

因此RabbitMQ引入了鏡像隊列這一律念,它能夠將隊列鏡像的複製到其它的broker上,當集羣中一個節點失效後便會將隊列切換到另外一個節點上去,從而保障服務的可用性。

設置鏡像隊列:rabbitmqctl set_policy --priority 0 --apply-to queues mirror_queue "^demo." '{"ha-mode":" exactly","ha-params":3, "ha-sync-mode":"automatic"}'

ha-mode:

  1. all:及羣衆全部節點都進行鏡像。
  2. exactly:指定個數節點上進行鏡像,ha-params爲指定個數。
  3. nodes:指定節點上進行鏡像,ha-params爲指定節點名稱。

RabbitMQ服務日誌:

日誌存放路徑:$RABBITMQ_HOME/var/log/rabbitmq/log-name

RabbitMQ分佈式部署:

RabbitMQ實現高可用的方式通常是集羣+鏡像隊列,但這種基於鏡像隊列來實現的方式在多機房誇區域的環境下,可能會由於網絡緣由致使沒法成功鏡像成功。

針對因這一狀況,可使用對網絡要求不高的Federation/Shovel來實現高可用。

Federation:

一、將兩個節點的federation插件開啓
rabbitmq-plugins enable rabbitmq_federation_management

二、在broker2中定義一個upstream

rabbitmqctl set_parameter federation-upstream f1 '{"uri":"amqp://account:password@ip:port","ack-mode":"on-confirm"}'

三、在broker2中定義一一個Policy

rabbitmqctl set_ policy --apply-to exchanges p1 "demo.exchange" '{"federation-upstream":"f1"}'

Shovel:

一、開啓每一個節點的shovel插件
rabbitmq-plugins enable rabbitmq_ shovel_ management
二、部署Shovel
rabbitmqctl set_parameter shovel hidden_shovel \'{"src-uri":"amqp://account:password@ip:port","src-queue":"demo.queue","dest-uri":"amqp://account:password@ip:port","src-exchange-key":"rk2","prefetch-count":64,"reconnect-delay":5,"publish-properties":[],"add-forward-headers":true,"ack-mode":"on-confirm"}'

格式化後:

rabbitmqctl set_parameter shovel hidden_shovel \'{ "src-uri": "amqp://account:password@ip:port", "src-queue": "demo.queue", "dest-uri": "amqp://account:password@ip:port", "src-exchange-key": "rk2", "prefetch-count": 64, "reconnect-delay": 5, "publish-properties": [], "add-forward-headers": true, "ack-mode": "on-confirm" }'

高可用集羣(負載均衡算法實現):

一、客戶端本地實現:用代碼實現本地輪詢法、加權輪詢法、隨即法、哈希地址法、最小鏈接數法等等。

二、HAProxy負載均衡

三、Keepalived + HAProxy高可用負載均衡:光使用HAProxy時,當HAProxy掛掉了後整個RabbitMQ集羣都沒法正常提供服務,因此用Keepalived的主備機制進一步優化。

相關文章
相關標籤/搜索