RabbitMQ簡介
RabbitMQ是實作了進階消息隊列協定(AMQP)的開源消息代理軟體(亦稱面向消息的中間件)。RabbitMQ伺服器是用Erlang語言編寫的,而群集和故障轉移是建構在開放電信平台架構上的。所有主要的程式設計語言均有與代理接口通訊的用戶端庫。
基于RabbitMQ的MQTT插件(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是IBM開發的一個即時通訊協定,是物聯網的重要組成部分。該協定支援所有平台,幾乎可以把所有聯網物品和外部連接配接起來,被用來當做傳感器和制動器的通信協定。
最近項目上需要用到RabbitMQ,是以有機會在阿裡雲上搭建RabbitMQ叢集。
RabbitMQ叢集
RabbitMQ提供了很多方式來搭建叢集。包括:
- 配置檔案方式
- 基于DNS的發現
- AWS執行個體發現(通過插件)
- Kubernetes發現(通過插件)
- 基于consul的發現(通過插件)
- 基于etcd的發現(通過插件)
- rabbitmqctl指令手動關聯
考慮到是在阿裡雲上進行搭建叢集,而且阿裡雲本身提供DNS Private Zone服務,為了避免不必要的額外搭建其它服務,是以采用了基于DNS發現來建立叢集。具體架構如下圖:

我們建立3台ECS,分别命名為rabbit1,rabbit2,rabbit3。然後在Private Zone裡面建立rabbitmq.gadev,把3台ECS的解析添加進去。
因為RabbitMQ要用到節點名字,同時建立一個反向解析。這樣根據其它IP位址可以擷取其它節點的名字。
在配置檔案中添加叢集的發現方式:
[root@rabbit1]# cat rabbitmq.conf
loopback_users = none
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_dns
cluster_formation.dns.hostname = rabbitmq.gadev
自動化實施
下面介紹下如何在阿裡雲上進行RabbitMQ的自動化建立。這裡用到的工具鍊包括:
- GitLab - 自動化腳本代碼存儲,使用了GitLab的CI/CD Pipeline。
- Terraform - 建立阿裡雲相關資源。
- Ansible - 安裝/更新ECS上的RabbitMQ。
- Python - 用來通路阿裡雲上的OSS,Private Zone等。
-
阿裡雲CLI - 通路OSS擷取Ansible Playbook,觸發OOS來運作ECS中的ansible。
自動化安裝架構如下圖:
用到的阿裡雲服務
- ECS - 用來安裝RabbitMQ
- Auto Scaling Group - 用伸縮組來管理ECS
- SLB - 提供公網SLB使裝置能直接連接配接叢集,提供私有SLB供内部業務使用。
- Private Zone - RabbitMQ叢集服務發現
- Domain name - 提供域名來綁定公網SLB
- OSS - 用OSS來存儲ansible playbook
- OOS(Operation Orchestration Service) - 使用OOS來觸發ansible腳本運作。
- RAM - 給ECS綁定需要的role
- VPC - 基礎網絡相關配置
使用OOS來運作ansible playbook
OOS編排服務提供了模闆ACS-ECS-ApplyAnsiblePlayBooks可以在一批ECS裡面運作各自的ansible playbook。
# aliyun oos StartExecution help
Alibaba Cloud Command Line Interface Version 3.0.29
Product: oos (Operation Orchestration Service)
Link: https://help.aliyun.com/api/oos/StartExecution.html
Parameters:
--TemplateName String Required
--ClientToken String Optional
--LoopMode String Optional
--Mode String Optional
--Parameters String Optional
--ParentExecutionId String Optional
--RegionId String Optional
--SafetyCheck String Optional
--TemplateVersion String Optional
下面的指令就可以用來運作ansible:
# aliyun oos StartExecution --TemplateName ACS-ECS-ApplyAnsiblePlayBooks --RegionId cn-shanghai --Parameters '{"playbookurl":"https://{{oss_bucket}}.oss-cn-shanghai.aliyuncs.com/{{playbook.yml}}","OOSAssumeRole":"{{oosRole}}","targets":{"type":"Tags","tags":[{"value": "{{environment}}","key": "rabbit"}]}}'
CI/CD stage
Stage | Description |
---|---|
PLAN | 部署RabbitMQ到不同環境,檢查是否一切如預期。執行terraform plan腳本,檢查是否需要更新阿裡雲資源。 |
APPLY | 真正部署叢集。執行terraform apply腳本,建立或更新阿裡雲資源。 |
UPDATE | 更新叢集,或增加新的叢集功能。執行aliyun oos指令讓每台ECS執行ansible playbook。 |
DESTROY | 銷毀叢集。 |