天天看點

在阿裡雲上自動化搭建RabbitMQ叢集RabbitMQ簡介RabbitMQ叢集自動化實施參考資料

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發現來建立叢集。具體架構如下圖:

在阿裡雲上自動化搭建RabbitMQ叢集RabbitMQ簡介RabbitMQ叢集自動化實施參考資料

我們建立3台ECS,分别命名為rabbit1,rabbit2,rabbit3。然後在Private Zone裡面建立rabbitmq.gadev,把3台ECS的解析添加進去。

在阿裡雲上自動化搭建RabbitMQ叢集RabbitMQ簡介RabbitMQ叢集自動化實施參考資料

因為RabbitMQ要用到節點名字,同時建立一個反向解析。這樣根據其它IP位址可以擷取其它節點的名字。

在阿裡雲上自動化搭建RabbitMQ叢集RabbitMQ簡介RabbitMQ叢集自動化實施參考資料

在配置檔案中添加叢集的發現方式:

[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。

    自動化安裝架構如下圖:

在阿裡雲上自動化搭建RabbitMQ叢集RabbitMQ簡介RabbitMQ叢集自動化實施參考資料

用到的阿裡雲服務

  • 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 銷毀叢集。

參考資料

https://www.rabbitmq.com/ https://www.rabbitmq.com/clustering.html https://yq.aliyun.com/articles/718185