在滴滴雲 DC2 雲伺服器上搭建 RabbitMQ 叢集
前言
訊息中介軟體已經成為分散式工程專案中不可或缺的一部分,市場上也呈現出各種各樣的開源 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在滴滴雲 DC2 雲伺服器上搭建 ZooKeeper 叢集實戰(一)伺服器
- 如何在滴滴雲 DC2 上搭建 ETCD 叢集
- 如何在滴滴雲 DC2 上搭建高可用 MySQL 叢集MySql
- 在滴滴雲上搭建 MongoDB 叢集 (一):MongoDB
- 在滴滴雲 DC2 雲伺服器上搭建 Codis 實戰伺服器
- 在滴滴雲 DC2 雲伺服器上搭建 MongoDB 實戰伺服器MongoDB
- 在滴滴雲 DC2 雲伺服器上搭建 ELK 日誌採集系統伺服器
- 在滴滴雲上搭建 Redis-Cluster 叢集Redis
- 在滴滴雲DC2伺服器上搭建DPDK應用例項伺服器
- 在滴滴雲 DC2 雲伺服器上使用 LVM 管理磁碟伺服器LVM
- 基於滴滴雲伺服器搭建 Consul 叢集伺服器
- 如何在滴滴雲 DC2 上搭建 MySQL 服務MySql
- 在滴滴雲上學習 Kubernetes v1.13.0:叢集搭建
- 在滴滴雲 DC2 伺服器上部署 Ghost伺服器
- 在滴滴雲 DC2 伺服器上搭建 Gitlab+Jenkins 的整合環境伺服器GitlabJenkins
- 如何在滴滴雲 DC2 上搭建 ProxySQL 中介軟體SQL
- 滴滴雲上搭建 Gluster
- 在滴滴雲快速搭建自己的簡易服務叢集[入門版]
- 在阿里雲和騰訊雲的輕量應用伺服器上搭建Hadoop叢集阿里伺服器Hadoop
- 基於滴滴雲 DC2 搭建 VPP 應用例項
- 在滴滴雲 DC2 編譯安裝最新 GCC 版本編譯GC
- 在滴滴雲上搭建 API-Gateway Kong 實踐APIGateway
- RabbitMQ叢集搭建MQ
- 在華為雲 OSC 上快速部署 EMQX MQTT 叢集MQQT
- 使用docker 搭建rabbitmq 叢集DockerMQ
- 在滴滴雲 DC2 上部署 Manifold 文字收集與閱讀平臺
- 使用三臺雲伺服器搭建真正的Redis叢集伺服器Redis
- 使用 Terraform 在阿里雲上快速部署 MQTT 叢集ORM阿里MQQT
- 在華為雲 CCE 上部署 EMQX MQTT 伺服器叢集MQQT伺服器
- 在騰訊雲 TKE 上部署 EMQX MQTT 伺服器叢集MQQT伺服器
- 使用容器快速在阿里雲 ECS 多節點上搭建 Citus 12.1 叢集阿里
- 多雲搭建 K3S 叢集
- 基於滴滴雲搭建 Lustre
- 使用滴滴雲DC2,在CentOS7安裝Redis並進行安全加固CentOSRedis
- 用Docker搭建RabbitMq的普通叢集和映象叢集DockerMQ
- 在滴滴雲 VPC 內搭建內網 DNS 服務內網DNS
- 在阿里雲 ACK 上部署 EMQX MQTT 伺服器叢集阿里MQQT伺服器
- 快速掌握RabbitMQ(五)——搭建高可用的RabbitMQ叢集MQ