一、集羣中組件的狀態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:
日誌存放路徑:$RABBITMQ_HOME/var/log/rabbitmq/log-name
RabbitMQ實現高可用的方式通常是集羣+鏡像隊列,但這種基於鏡像隊列來實現的方式在多機房誇區域的環境下,可能會由於網絡緣由致使沒法成功鏡像成功。
針對因這一狀況,可使用對網絡要求不高的Federation/Shovel來實現高可用。
一、將兩個節點的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插件
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的主備機制進一步優化。