一.前言
之前rabbitmq學習與實踐分享(2)中主要談到了rabbitmq提供的一些手段和機制來從生產端,消費端以及broker端保證訊息機制的可靠性。但是沒有考慮到單點故障以及broker如何抗住高負載,來保證訊息中介軟體的高可用性。本文主要結合自己的理解談論這個問題。
rabbitmq 提供高可用性的機制主要有以下2種手段:
- 叢集
- 映象佇列
二.rabbitmq 叢集:
rabbitmq 的叢集有以下幾個特點:
- rabbitmq 叢集的所有節點都會備份後設資料資訊,但是不會備份訊息。備份的後設資料資訊包括:
- 1)佇列的後設資料:比如佇列的名稱,屬性;
- 2)交換器:比如交換器的名稱,屬性;
- 3)繫結關係的後設資料:交換器之間的繫結關係,以及交換器與佇列之間的繫結關係;
-
- vhost 的後設資料;
rabbitmq 叢集中建立佇列,只會在單個節點,而不是所有節點上建立佇列的程式幷包含佇列的完整訊息(後設資料,狀態,內容)。建立佇列程式的節點稱為宿主節點,該節點知道佇列的所有資訊,其他的節點僅僅知道佇列的後設資料資訊以及包含指向這個宿主節點的指標。 所以如果這個宿主節點因某種原因出現當機時,該節點中的訊息會丟失。當然後面介紹的映象佇列可以解決這種情況出現的訊息丟失問題。
rabbitmq 叢集的搭建:
rabbitmq叢集的搭建過程偏運維,此處就不做介紹了,涉及到相關的命令如下:
具體命令的用法以及相關含義,後面章節再單獨介紹。rabbitmq叢集節點的型別:
- 記憶體節點:將所有佇列,交換器,繫結關係,vhost的使用者,許可權等等後設資料資訊都儲存在記憶體裡。
- 磁碟節點: 指上述後設資料資訊儲存在磁碟裡。 為了確保節點重啟之後,後設資料資訊不會丟失,單節點的叢集節點只能是磁碟節點,多節點的叢集中必須有一個節點是磁碟節點。 如圖:上面disc 表示是磁碟節點;ram 表示是記憶體節點; 如果有新的佇列,或者交換器建立的時候,需要先通知磁碟節點進行儲存,如果一個叢集中只有一個磁碟節點,並且不幸當機了,那麼該叢集只能收發訊息,不能進行任何新的變更操作(比如建立新的佇列)了。
映象佇列
映象佇列的機制主要作用就是通過冗餘佇列中的訊息,來避免叢集中宿主佇列當機時導致的訊息丟失問題。引入映象佇列機制,通過將佇列映象到其他的broker節點上,對一個宿主佇列(master)配置多個slave節點,從而提升可用性。
針對映象佇列而言:所有的操作(除了訊息傳送)都是先應用到佇列的主節點,然後通過主節點傳播到映象佇列的從節點的,當主節點當機時,最老的從節點會自動晉升成為新的主節點.
映象佇列的配置是通過policy 設定的:
rabbitmqctl set_policy -p vhost [ --priority priority ] [--apply-to apply-to] name pattern {definition}
複製程式碼
引數簡要介紹:pattern 指要匹配的佇列模式 definition 包含3個部分:
- ha-mode :指定映象佇列的模式,有以下幾個取值:all 表示在所有的節點上進行映象;exactly 表示在指定數量的節點上進行映象,具體幾個節點通過ha-params引數指定;nodes 指定節點名稱列表。
- ha-params:指定不同的ha-params 用到的引數;
- ha-sync-mode:映象同步模式,分為automatic(自動)和手動(manual). 手動的操作可以通過rabbitmqctl sync_queue 命令完成。
小結
本文主要簡要的介紹了一下rabbitmq 如何提升可用性來保證訊息不丟失的。但是在實際生產環境,面對突發的流量的時候,rabbitmq 如何能扛住呢,有沒有什麼機制可以實現呢,比如流控? 這塊內容在下一小節繼續分享。