RabbitMQ高可用鏡像隊(duì)列
在分布式系統(tǒng)中,通常使用多個(gè)術(shù)語來標(biāo)識(shí)主要副本和輔助副本。本指南通常使用“主”來引用隊(duì)列的主要副本,而對(duì)于輔助副本則使用“鏡像”。但是,你會(huì)發(fā)現(xiàn)“master”在這里和那里使用。這是因?yàn)镽abbitMQ CLI工具歷史上一直使用術(shù)語“master”來指代輔助。因此這兩個(gè)術(shù)語目前可以互換使用,但我們希望最終擺脫傳統(tǒng)的術(shù)語。
如何配置鏡像
鏡像參數(shù)是使用策略配置的。策略按名稱(使用正則表達(dá)式模式)匹配一個(gè)或多個(gè)隊(duì)列,并包含添加到匹配隊(duì)列的整個(gè)屬性集中的定義(可選參數(shù)的映射)。有關(guān)策略 的更多信息,請(qǐng)參閱運(yùn)行時(shí)參數(shù)和策略。
參考文檔:http://www.rabbitmq.com/parameters.html#policies
控制鏡像的隊(duì)列參數(shù)
如上所述,隊(duì)列通過策略啟用鏡像。政策可以隨時(shí)更改; 創(chuàng)建一個(gè)非鏡像的隊(duì)列是有效的,然后在稍后的某個(gè)點(diǎn)上鏡像(反之亦然)。非鏡像隊(duì)列和沒有任何鏡像的鏡像隊(duì)列之間是有區(qū)別的 - 前者缺少額外的鏡像基礎(chǔ)架構(gòu),可能會(huì)提供更高的吞吐量。
要使隊(duì)列變成鏡像,您需要?jiǎng)?chuàng)建一個(gè)與之匹配的策略,并設(shè)置策略鍵ha-mode和(可選)ha-params。
| ha-mode | ha-params | Result |
|---|---|---|
| all | (absent) | 隊(duì)列鏡像在群集中的所有節(jié)點(diǎn)上。當(dāng)新節(jié)點(diǎn)添加到群集時(shí),隊(duì)列將鏡像到該節(jié)點(diǎn)。. |
| exactly | count | 集群中的隊(duì)列實(shí)例數(shù)。甲計(jì)的1值意味著只是隊(duì)列主,沒有鏡子。如果運(yùn)行隊(duì)列主節(jié)點(diǎn)的節(jié)點(diǎn)變?yōu)椴豢捎?,則隊(duì)列將變?yōu)椴豢捎?。甲?jì)的2值表示1個(gè)隊(duì)列主站和1個(gè)隊(duì)列鏡。如果運(yùn)行隊(duì)列主節(jié)點(diǎn)的節(jié)點(diǎn)不可用,隊(duì)列鏡像將自動(dòng)升級(jí)為主節(jié)點(diǎn)??傊篘umberOfQueueMirrors = NumberOfNodes - 1。如果群集中的計(jì)數(shù)節(jié)點(diǎn)少于該計(jì)數(shù)節(jié)點(diǎn),則該隊(duì)列將鏡像到所有節(jié)點(diǎn)。如果有超過 計(jì)數(shù)的集群中的節(jié)點(diǎn),以及包含反射鏡一個(gè)節(jié)點(diǎn)出現(xiàn)故障,那么一個(gè)新的反射鏡將被另一節(jié)點(diǎn)上創(chuàng)建。確切的使用模式與“ha-promote-on-shutdown”:“always”可能是危險(xiǎn)的,因?yàn)殛?duì)列可以在群集中遷移,并在被關(guān)閉時(shí)變得不同步。 . |
| nodes | node names | 隊(duì)列鏡像到節(jié)點(diǎn)名稱中列出的節(jié)點(diǎn)。節(jié)點(diǎn)名稱是在出現(xiàn)在rabbitmqctl cluster_status中的Erlang節(jié)點(diǎn)名稱; 他們通常有“ 兔子@主機(jī)名 ” 的形式。如果這些節(jié)點(diǎn)名稱中的任何一個(gè)不是集群的一部分,則這不構(gòu)成錯(cuò)誤。如果在聲明隊(duì)列時(shí)列表中沒有任何節(jié)點(diǎn)在線,則會(huì)在聲明客戶端所連接的節(jié)點(diǎn)上創(chuàng)建隊(duì)列。 |
例子
以下示例聲明名為ha-all的策略,它與名稱以"ha"開頭的隊(duì)列相匹配,并將鏡像配置到集群中的所有節(jié)點(diǎn).
| rabbitmqctl | rabbitmqctl set_policy ha-all "^ha." '{"ha-mode":"all"}' |
|---|---|
| rabbitmqctl (Windows) | rabbitmqctl set_policy ha-all "^ha." "{""ha-mode"":""all""}" |
| HTTP API | PUT /api/policies/%2f/ha-all {"pattern":"^ha.", "definition":{"ha-mode":"all"}} |
| Web UI | Navigate to Admin > Policies > Add / update a policy.Enter "ha-all" next to Name, "^ha." next to Pattern, and "ha-mode" = "all" in the first line next to Policy. |
Click Add policy.
策略的名稱以"two"開始的隊(duì)列鏡像到群集中的任意兩個(gè)節(jié)點(diǎn),并進(jìn)行自動(dòng)同步:
| rabbitmqctl | rabbitmqctl set_policy ha-two "^two." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}' |
|---|---|
| rabbitmqctl (Windows) | rabbitmqctl set_policy ha-two "^two." ^ "{""ha-mode"":""exactly"",""ha-params"":2,"ha-sync-mode":"automatic"}" |
| HTTP API | PUT /api/policies/%2f/ha-two{"pattern":"^two.", "definition":{"ha-mode":"exactly", "ha-params":2,"ha-sync-mode":"automatic"}} |
| Web UI | Navigate to Admin > Policies > Add / update a policy.Enter "ha-two" next to Name and "^two." next to Pattern.Enter "ha-mode" = "exactly" in the first line next to Policy, then "ha-params" = 2 in the second line, then "ha-sync-mode" = "automatic" in the third, and set the type on the second line to "Number".Click Add policy. |
以"node"開頭的隊(duì)列鏡像到集群中的特定節(jié)點(diǎn)的策略:
| rabbitmqctl | rabbitmqctl set_policy ha-nodes "^nodes." '{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}' |
|---|---|
| rabbitmqctl (Windows) | rabbitmqctl set_policy ha-nodes "^nodes." ^ "{""ha-mode"":""nodes"",""ha-params"":[""rabbit@nodeA"", ""rabbit@nodeB""]}" |
| HTTP API | PUT /api/policies/%2f/ha-nodes{"pattern":"^nodes.", "definition":{"ha-mode":"nodes", "ha-params":["rabbit@nodeA", "rabbit@nodeB"]} |
| Web UI | Navigate to Admin > Policies > Add / update a policy.Enter "ha-nodes" next to Name and "^nodes." next to Pattern.Enter "ha-mode" = "nodes" in the first line next to Policy, then "ha-params" in the second line, set the second line's type to "List", and then enter "rabbit@nodeA" and "rabbit@nodeB" in the sublist which appears.Click Add policy. |