RabbitMQ 集群原理和完善

2022-01-13 01:23:19 字數 2385 閱讀 2750

rabbitmq這款訊息佇列中介軟體產品本身是基於erlang編寫,erlang語言天生具備分布式特性(通過同步erlang集群各節點的magic cookie來實現)。

因此,rabbitmq天然支援clustering。這使得rabbitmq本身不需要像activemq、kafka那樣通過zookeeper分別來實現ha方案和儲存集群的元資料。集群是保證可靠性的一種方式,同時可以通過水平擴充套件以達到增加訊息吞吐量能力的目的。下面先來看下rabbitmq集群的整體方案:

上面圖中採用三個節點組成了乙個rabbitmq的集群,exchange a(交換器,對於rabbitmq基礎概念不太明白的童鞋可以看下基礎概念)的元資料資訊在所有節點上是一致的,而queue(存放訊息的佇列)的完整資料則只會存在於它所建立的那個節點上。,其他節點只知道這個queue的metadata資訊和乙個指向queue的owner node的指標。

rabbitmq集群會始終同步四種型別的內部元資料(類似索引): a.佇列元資料:佇列名稱和它的屬性; b.交換器元資料:交換器名稱、型別和屬性; c.繫結元資料:一張簡單的**展示了如何將訊息路由到佇列; d.vhost元資料:為vhost內的佇列、交換器和繫結提供命名空間和安全屬性; 因此,當使用者訪問其中任何乙個rabbitmq節點時,通過rabbitmqctl查詢到的queue/user/exchange/vhost等資訊都是相同的。

我想肯定有不少同學會問,想要實現ha方案,那將rabbitmq集群中的所有queue的完整資料在所有節點上都儲存乙份不就可以了麼?(可以類似mysql的主主模式嘛)這樣子,任何乙個節點出現故障或者宕機不可用時,那麼使用者的客戶端只要能連線至其他節點能夠照常完成訊息的發布和訂閱嘛。

我想rabbitmq的作者這麼設計主要還是基於集群本身的效能和儲存空間上來考慮。

第一,儲存空間,如果每個集群節點都擁有所有queue的完全資料拷貝,那麼每個節點的儲存空間會非常大,集群的訊息積壓能力會非常弱(無法通過集群節點的擴容提高訊息積壓能力);

第二,效能,訊息的發布者需要將訊息複製到每乙個集群節點,對於持久化訊息,網路和磁碟同步複製的開銷都會明顯增加。

rabbitmq集群的工作原理圖如下:

如果有乙個訊息生產者或者訊息消費者通過amqp-client的客戶端連線至節點1進行訊息的發布或者訂閱,那麼此時的集群中的訊息收發只與節點1相關,這個沒有任何問題;如果客戶端相連的是節點2或者節點3(佇列1資料不在該節點上),那麼情況又會是怎麼樣呢?

如果訊息生產者所連線的是節點2或者節點3,此時佇列1的完整資料不在該兩個節點上,那麼在傳送訊息過程中這兩個節點主要起了乙個路由**作用,根據這兩個節點上的元資料(也就是上文提到的:指向queue的owner node的指標)**至節點1上,最終傳送的訊息還是會儲存至節點1的佇列1上。

同樣,如果訊息消費者所連線的節點2或者節點3,那這兩個節點也會作為路由節點起到**作用,將會從節點1的佇列1中拉取訊息進行消費。

可以根據這個架構圖,做一些rabbitmq集群完善,主要是將記憶體節點作為負載,磁碟節點作為儲存。

更改集群節點型別:

# rabbitmqctl change_cluster_node_type ram

# rabbitmqctl change_cluster_node_type disc

# rabbitmqctl cluster_status

如果出現錯誤:

error: unable to connect to node rabbit@manager1: nodedown
解決方式:

# /sbin/service rabbitmq-server stop

# /sbin/service rabbitmq-server start

# rabbitmqctl status

如果要將節點移除集群,則在本節點上執行:

rabbitmqctl reset &&

然後在主節點執行:

# rabbitmqctl forget_cluster_node rabbit@manager3
節點加入集群命令:

# rabbitmqctl join_cluster rabbit@manager3 --ram

# rabbitmqctl join_cluster rabbit@manager3 --disc

RabbitMQ集群原理與部署

在專案中想要 rabbitmq 變得更加健壯,就要使得其變成高可用,所以我們要搭建乙個 rabbitmq 集群,這樣你可以從任何一台 rabbitmq 故障中得以倖免,並且應用程式能夠持續執行而不會發生阻塞。而 rabbitmq 本身是基於 erlang 編寫的,erlang 天生支援分布式 通過同...

rabbitmq集群配置

rabbitmq是乙個輕量級的訊息服務系統,切記它只是乙個類似信件郵遞員的功能,而不是快遞,不用把它當成redis在用。一 rabbitmq軟體安裝 1.erlang安裝 安裝erlang,載入官方提供的yum源,然後直接安裝。最新版本的rabbitmq直接依賴erlang,安裝esl erlang...

Rabbitmq 建立集群

更改host 兩台主機rabbit1 192.168.1.112,rabbit2 192.168.1.113 host配置如下 rabbit1 192.168.1.112 rabbit2 192.168.1.113 同步erlang.cookie 將rabbit1 c users erlang.co...