RabbitMQ(六)映象佇列
阿新 • • 發佈:2020-10-11
一、映象佇列
預設情況下,RabbitMQ叢集中的佇列只會儲存在某一個節點上,就是佇列宣告的那個節點上。當訪問叢集中的其他節點時,會把請求轉發給這個節點來進行處理。當這個節點故障時,叢集中的這個佇列就表現為不可用。佇列可以在多個節點中複製映象以保障可用性,稱之為映象佇列。
每一個映象佇列由一個master和若干個slave組成。佇列的master通常儲存在叢集的主節點上,沒個佇列有自己的主節點,映象佇列的所有操作都會首先在mastEr上執行然後廣播給其他映象。包括訊息入隊,推送給消費者、和消費確認等。
生產者傳送的訊息會在所有的映象中儲存一份副本,消費者不論連線哪個節點最終都會在master上操作,一旦master確認消費(ack)以後,映象佇列會丟棄這條訊息。因此映象佇列雖然增加了可用性(存在多個可用副本),但是多個節點間並沒有分攤負載,因為所有節點都會處理全量的訊息。
如果映象佇列的master宕機了,最老的映象將會晉升為新的master。未同步的映象也可以晉升為master,取決於佇列的映象引數。
二、如何配置映象佇列
映象引數通過policy來配置,一個policy通過正則表示式匹配一個或多個佇列。
命令列設定:e.g.:
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
控制檯設定:
引數說明
三、多少個映象是最優的
在所有的節點上設定映象是最保守的策略,可用性最高,但是會給叢集中的所有節點帶來額外的壓力,包括網路IO、磁碟IO和硬碟空間佔用。大多數場景下都沒有必要在每個節點上都儲存一份映象。
一般來說推薦設定過半節點的映象,例如3節點叢集設定2個映象,5節點叢集設定3個映象。
一些瞬變的資料或者時間敏感的資料,比如股票淨值資料,最好設定少量的映象甚至不要使用映象。
四、怎麼檢查佇列是否是映象狀態
映象佇列會在後臺管理頁面顯示策略名稱和額外的副本數量,例如下面這個佇列存在兩個副本,即一主一從
佇列詳情
如果僅有的一個映象節點宕機了
當添加了一個映象佇列的時候,會列印如下日誌
2018-03-01 07:26:33.121 [info] <0.1360.0> Mirrored queue 'two.replicas' in vhost '/': Adding mirror on node [email protected]: <37324.1148.0>
5.佇列master定位節點
rabbitmq中的每個佇列有一個primary副本,那個副本所在的節點稱之為佇列master。所有佇列的操作都要首選通過master執行然後傳播給其他映象,為了保證訊息的FIFO順序。
佇列master可以使用幾種不同的策略分佈在叢集的節點上,
三種宣告策略的方式如下:
ha-mode | ha-params | Result |
exactly | count |
Number of queue replicas (master plus mirrors) in the cluster. A
count
value of 1 means a single replica: just the queue master. If the node running the queue master becomes unavailable, |
all | (none) | Queue is mirrored across all nodes in the cluster. When a new node is added to the cluster, the queue will be mirrored to that node. This setting is very conservative. Mirroring to a quorum (N/2 + 1) of cluster nodes is recommended instead . Mirroring to all nodes will put additional strain on all cluster nodes, including network I/O, disk I/O and disk space usage. |
nodes | node names | Queue is mirrored to the nodes listed in node names . Node names are the Erlang node names as they appear in rabbitmqctl cluster_status ; they usually have the form "[email protected]". If any of those node names are not a part of the cluster, this does not constitute an error. If none of the nodes in the list are online at the time when the queue is declared then the queue will be created on the node that the declaring client is connected to. |
- 使用x-queue-master-locator佇列宣告引數
- 設定queue-master-locator策略key
- 在配置檔案中定義queue_master_locator
- min-masters選擇承載了佇列master數量最少的節點
- client-local選擇客戶端宣告佇列時連線上的那個節點
- random隨機選擇一個節點
- 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.