在滴滴雲 DC2 雲伺服器上搭建 RabbitMQ 叢集

java06051515發表於2018-11-30

前言

訊息中介軟體已經成為分散式工程專案中不可或缺的一部分,市場上也呈現出各種各樣的開源 MQ,而 RabbitMQ 以其優秀的效能和易用的特點贏得了較好的口碑,本文將介紹 RabbitMQ 叢集的搭建與應用。

一、虛擬機器的準備

本文將介紹叢集安裝 RabbitMQ,所以需要 3 臺 Linux 伺服器,作業系統選擇 CentOS7.4,在 滴滴雲 上建立 3 臺 2CPU,4MEM 的虛擬機器,並且在同一個 VPC 下。準備的 3 臺 VM 分別為 rabbitmq-1,rabbitmq-2,rabbitmq-3,確保 3 臺 VM 在內網下可以互通。

二、Erlang與RabbitMQ的準備

在 RabbitMQ-1 上首先安裝一套環境,步驟如下:

1. 安裝 RabbitMQ 依賴的 Erlang 語言:

  dc2 - user @ 10.254.124.34 :~ $ yum install  erlang  ...

  Complete !


當出現以上完成回顯時表明 Erlang 已經安裝完畢。

2. 安裝 RabbitMQ 伺服器

出現上述回顯表示已經成功安裝了 rabbitmq-server,注意版本資訊可能會有所不同。

3. 建立日誌資料夾

為了更好地維護 RabbitMQ 叢集,需要顯示地指定日誌的目錄和資料目錄,並改變資料夾的擁有者:

4. 修改 RabbitMQ 的配置檔案

安裝完 RabbitMQ 後,其預設的配置檔案在 /etc/rabbitmq 下的 rabbitmq.config 中,我們複製一份作為本節點的配置檔案:

  dc2 - user @ 10.254.124.34 :~ $ cp  rabbitmq . config  rabbitmq - env . conf

然後用文字編輯器開啟 rabbitmq-env.conf,並新增如下內容:

  RABBITMQ_MNESIA_BASE =/ home / rabbitmq / mnesia

  RABBITMQ_LOG_BASE =/ home / rabbitmq / log


然後儲存並退出。

5. 新增 web 外掛

RabbitMQ 提供了很多實用的外掛,其中的 web 外掛用於在瀏覽器上觀察叢集的整體狀態和監控,首先在 /etc/rabbitmq 目錄下建立外掛配置檔案:

  dc2 - user @ 10.254.124.34 :~ $ touch  enabled _ plugins

然後用文字編輯器開啟 enabled_plugins 檔案,輸入以下內容:

  [ rabbitmq_management ].

6. 在單節點上啟動RabbitMQ

執行下面的命令啟動:

  dc2 - user @ 10.254.124.34 :~ $ service  rabbitmq - server  start

如果沒有報錯則表示啟動成功,可以使用一下命令驗證:

當出現上面的內容時表明在單個節點上已經安裝成功了,當然也可以透過 web 介面來檢視叢集,在任意一個聯網的瀏覽器上輸入:rabbitmq-1 的外網 IP:15672 即可看到相應內容,注意這時 /home/rabbitmq 下面的 log 資料夾和 mnesia 中已經可以看到內容了,mnesia 中儲存的是 RabbitMQ 的資料。

7. 配置叢集

  • 修改主機名

3 臺 VM 的主機名依次為 rabbitmq-1,rabbitmq-2,rabbitmq-3,在各自機器上執行下列語句:

  dc2 - user @ 10.254.124.34 :~ $ hostnamectl  set - hostname  rabbitmq - 1  

上述只是臨時生效,如需永久生效請看下面的方法。

  • 讓叢集識別別的機器

3 臺 VM 需要互相通訊就需要對方的 IP 等資訊,用文字編輯器編輯 /etc/hosts 檔案,注意左邊的 IP 改成自己機器的內網 IP。

如果是 CentOS7.4 則還要修改 /etc/hostname 檔案,輸入以下內容:

  • 複製複製 erlang.cookie

需要將 3 臺 VM 上的複製 erlang.cookie 內容保持一致,因為 RabbitMQ 是基於 erlang 工作的,erlang 要相互通訊依靠 erlang.cookie。
檢視第一臺機器上的 erlang.cookie:

  dc2 - user @ rabbitmq - 1 :~ $ cat  / var / lib / rabbitmq / . erlang . cookie

  ZWZAVHWGJQJJTOLXLDGC


上面的字串就是對應的 cookie,可以使用 scp 命令複製到其他 2 臺 VM 上使用,命令如下:

  • 加入叢集

剩下的 2 臺 VM 需要使用如下命令加入到第一個所在的叢集中:

到此為止叢集的建立就完成了,3 個 RabbitMQ 節點組成了一個叢集工作。
瀏覽器外掛顯示如下圖效果:

  • 使用者相關命令

RabbitMQ 提供了強大的客戶端命令,可以實現複雜的使用者許可權管理,預設安裝完成後已經擁有 guest 賬號。需要新增新使用者可以使用如下命令:

  dc2 - user @ rabbitmq - 1 :~ $ rabbitmqctl add_user test  test123

add_user 後面的 2 個引數分別是使用者名稱和對應的密碼。
角色設定可以限制使用者的訪問許可權,可以用一下命令設定:

  dc2 - user @ rabbitmq - 1 :~ $ rabbitmqctl set_user_tags test  administrator

以上命令設定了賬號 test 為管理員許可權。
vhost 設定命令如下:

  dc2 - user @ rabbitmq - 1 :~ $ rabbitmqctl  set_permissions  - p  /  test   ".*"   ".*"   ".*"

以上命令設定了 test 使用者在虛擬空間/擁有所有許可權。

三、RabbitMQ 構建映象實現冗餘

如果 RabbitMQ 叢集只有一個 broker 節點,那麼該節點的失效將導致整個服務臨時性的不可用,並且可能會導致 message 的丟失(尤其是在非持久化 message 儲存於非持久化 queue 中的時候)。當然可以將所有的 publish 的 message 都設定為持久化的,並且使用持久化的 queue,但是這樣仍然無法避免由於快取導致的問題:因為 message 在傳送之後和被寫入磁碟並執行 fsync 之間存在一個雖然短暫但是會產生問題的時間窗。透過 publisher 的 confirm 機制能夠確保客戶端知道哪些 message 已經存入磁碟,儘管如此,一般不希望遇到因單點故障導致的服務不可用

如果 RabbitMQ 叢集是由多個 broker 節點構成的,那麼從服務的整體可用性上來講,該叢集對於單點失效是有彈性的,但是同時也需要注意:儘管 exchange 和 binding 能夠在單點失效問題上倖免於難,但是 queue 和其上持有的 message 卻不行,這是因為 queue 及其內容僅僅儲存於單個節點之上,所以一個節點的失效表現為其對應的 queue 不可用。

引入 RabbitMQ 的映象佇列機制,將 queue 映象到 cluster 中其他的節點之上。在該實現下,如果叢集中的一個節點失效了,queue 能自動地切換到映象中的另一個節點以保證服務的可用性。在通常的用法中,針對每一個映象佇列都包含一個 master 和多個 slave,分別對應於不同的節點。Slave 會準確地按照 master 執行命令的順序進行命令執行,故 slave 與 master 上維護的狀態應該是相同的。除了 publish 外所有動作都只會向 master 傳送,然後由 master 將命令執行的結果廣播給 slave 們,故看似從映象佇列中的消費操作實際上是在 master 上執行的。

一旦完成了選中的 slave 被提升為 master 的動作,傳送到映象佇列的 message 將不會再丟失:publish 到映象佇列的所有訊息總是被直接 publish 到 master 和所有的 slave 之上。這樣一旦 master 失效了,message 仍然可以繼續傳送到其他 slave 上。

可以使用如下的命令來建立佇列:

  dc2 - user @ rabbitmq - 1 :~ $ sudo rabbitmqctl  eval   'rabbit_amqqueue:declare({resource, <<"/">>, queue, <<"test-queue">>}, false, false, [], none).'

上述命令建立在/下建立了名字為 test-queue 的非持久化的佇列。但是這樣如果佇列所在的 broker 出現了問題,那麼這個佇列就會丟失,對業務產生影響,所以可以使用以下命令建立映象:

  dc2 - user @ rabbitmq - 1 :~ $ rabbitmqctl set_policy  ha - test - two   "^"    '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'

上述命令設定了名字為 ha-test-two 的映象策略,”^”表示通配所有的佇列,每個符合映象條件的佇列一共有 2 份,即一共有 1 個備份,一個主佇列,同步模式採用自動備份,無需手工透過命令進行備份。同步後的佇列如下圖所示:

四、總結

本文介紹瞭如何在在 滴滴雲 伺服器上構建高可用叢集的 RabbitMQ 叢集,並闡述了一些通用的命令,可以看到使用 滴滴雲 的 VPC 等產品可以輕鬆地搭建分散式的高可用環境。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559758/viewspace-2221940/,如需轉載,請註明出處,否則將追究法律責任。

相關文章