在CentOS 7上集群RabbitMQ

RabbitMQ是一个开源消息代理,支持AMQP,STOMP和其他通信技术。它广泛用于企业应用程序和现代微服务体系结构中,充当不同微服务之间的异步消息通道。本指南将描述如何在多个CentOS 7服务器上集群RabbitMQ,以形成高可用性消息代理。在本教程中,如果主服务器不可用,则一台服务器将充当主服务器,其他服务器将充当镜像服务器。

先决条件

配置防火墙

CentOS防火墙(firewalld)默认情况下不允许任何传入流量。为了使RabbitMQ可用于网络内外的其他系统,并允许我们访问管理控制台,我们必须首先打开一些端口。

RabbitMQ的Web界面管理控制台默认在port上侦听15672。我们希望使管理控制台公开可用,以便我们可以从计算机上访问它。因此,我们将指示在公共区域(这是Vultr实例上的默认区域和活动区域)中firewalld永久打开端口15672

sudo firewall-cmd --zone=public --add-port=15672/tcp --permanent

RabbitMQ节点需要能够相互通信。我们只想通过内部网络打开必要的端口。我们不希望互联网上的任何人都能管理或直接联系我们的服务器。以下命令假定我们的服务器位于192.168.0.100/24子网中。

第一项服务是对epmd等发现服务,该服务默认情况下在port上侦听4369

sudo firewall-cmd --permanent --zone=public --add-rich-rule='
  rule family="ipv4"
  source address="192.168.0.100/24"
  port protocol="tcp" port="4369" accept'

对于节点间和CLI通信,RabbitMQ需要能够通过port进行通信25672

sudo firewall-cmd --permanent --zone=public --add-rich-rule='
  rule family="ipv4"
  source address="192.168.0.100/24"
  port protocol="tcp" port="25672" accept'

CLI工具通过端口范围进行通信35672-35682

sudo firewall-cmd --permanent --zone=public --add-rich-rule='
  rule family="ipv4"
  source address="192.168.0.100/24"
  port protocol="tcp" port="35672-35682" accept'

如果您的应用程序需要AMQP协议,则还需要打开端口56715672。如果您需要能够通过其他协议进行通信,则可以在RabbitMQ 官方文档中找到有关RabbitMQ的网络要求的必要信息。

sudo firewall-cmd --permanent --zone=public --add-rich-rule='
  rule family="ipv4"
  source address="192.168.0.100/24"
  port protocol="tcp" port="5672" accept'

sudo firewall-cmd --permanent --zone=public --add-rich-rule='
  rule family="ipv4"
  source address="192.168.0.100/24"
  port protocol="tcp" port="5671" accept'

现在firewalld已经配置好了,我们需要指示它重新加载配置。

sudo firewall-cmd --reload

在所有服务器上重复本节中的步骤。

安装 rabbitmqadmin

管理插件附带了一个名为的Python工具rabbitmqadmin,一旦启用了管理插件,即可轻松将其安装在系统上。

sudo wget http://localhost:15672/cli/rabbitmqadmin
sudo mv rabbitmqadmin /usr/local/bin/
sudo chmod +x /usr/local/bin/rabbitmqadmin

配置DNS

群集时,必须使用服务器的主机名来标识服务器。默认情况下,服务器未分配DNS记录,连接将失败。要快速解决此问题,请/etc/hosts使用您喜欢的编辑器将主服务器和镜像主机名添加到文件中。

例如,您的主服务器的主机文件可能如下所示。请注意最后两个记录,它们允许服务器通过其主机名相互识别。确保将IP地址更改为您自己的IP地址。

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

127.0.0.1 guest
::1       guest

127.0.0.1 YOUR_MASTER_SERVER_HOST_NAME
::1       YOUR_MASTER_SERVER_HOST_NAME


192.168.0.101 YOUR_MASTER_SERVER_HOST_NAME
192.168.0.102 YOUR_MIRROR_SERVER_HOST_NAME

群集节点

允许节点相互连接的导入先决条件是所有节点的Erlang cookie相同。默认情况下,将为每个节点分配一个唯一的Erlang cookie,因此您必须在所有节点上重新配置它。

以下命令会将Erlang cookie设置为“ WE<3COOKIES”,但可以根据自己的喜好更改它。在所有服务器上执行此操作。

sudo sh -c "echo 'WE<3COOKIES' > /var/lib/rabbitmq/.erlang.cookie"

在所有服务器上重新启动RabbitMQ,以确保正确重新加载了Erlang cookie。

sudo systemctl restart rabbitmq-server.service

在除主服务器上的所有服务器上执行以下命令。这将使节点加入主服务器并形成集群。

sudo rabbitmqctl stop_app
sudo rabbitmqctl join_cluster "rabbit@<YOUR_MASTER_SERVER_HOST_NAME>"
sudo rabbitmqctl start_app

通过运行以下命令,验证节点是否已加入集群。

sudo rabbitmqctl cluster_status

您的所有节点都将出现在输出的nodesrunning_nodes部分。从现在开始,您不再需要在每台服务器上重复步骤,配置将自动镜像到其他节点。

创建高可用性策略

现在我们有了RabbitMQ节点的集群,我们可以通过设置新策略来使用它来进行高可用性队列和交换。可以通过RabbitMQ管理控制台或��用命令行界面添加此策略。

sudo rabbitmqctl set_policy -p "/" --priority 1 --apply-to "all" ha ".*" '{ "ha-mode": "exactly", "ha-params": 2, "ha-sync-mode": "automatic"}'

下面的列表将解释命令的每个部分的含义。

  • -p "/":在"/"虚拟主机上使用此策略(安装后的默认设置)
  • --priority 1:应用策略的顺序
  • --apply-to "all":可以是"queues""exchanges""all"
  • ha:我们为政策指定的名称
  • ".*":用于决定将此策略应用于哪个队列或交换的正则表达式。".*"会匹配任何东西
  • '{ "ha-mode": "exactly", "ha-params": 2, "ha-sync-mode": "automatic"}':政策的JSON表示形式。本文档描述了我们想要的-恰好2个节点,数据在该节点上自动同步

简而言之,只要我们至少有两个运行的节点,此策略将确保我们始终在队列或交换中拥有2个数据副本。如果节点更多,则可以增加的值ha-params。建议使用仲裁定额(N/2 + 1)。拥有更多数据副本将导致更高的磁盘,I / O和网络使用率,从而可能导致性能下降。

如果您想将数据镜像到集群中的所有节点,则可以使用以下JSON文档。

'{ "ha-mode": "all", "ha-sync-mode": "automatic"}'

如果您只想将数据镜像到特定节点(例如:node-1node-2),则可以使用以下内容。

'{ "ha-mode": "nodes", "ha-params" :["rabbit@node-1", "rabbit@node-2"], "ha-sync-mode": "automatic"}'

您可以更改正则表达式以将不同的策略分配给不同的队列。假设我们有以下三个节点:

  • 兔子@大师
  • rabbit @ client-ha
  • rabbit @ product-ha

然后,我们可以创建两个策略,这将导致名称以“ client”开头的队列被镜像到该rabbit@client-ha节点,所有名称以“ product”开头的队列的所有镜像将被镜像到该rabbit@product-ha节点。

sudo rabbitmqctl set_policy -p "/" --priority 1 --apply-to "queues" ha-client "client.*" '{ "ha-mode": "nodes", "ha-params": ["rabbit@master", "rabbit@client-ha"], "ha-sync-mode": "automatic"}
sudo rabbitmqctl set_policy -p "/" --priority 1 --apply-to "queues" ha-product "product.*" '{ "ha-mode": "nodes", "ha-params": ["rabbit@master", "rabbit@product-ha"], "ha-sync-mode": "automatic"}

这里有个小小的建议:独占队列在RabbitMQ中永远不会被镜像或持久化,即使该策略将与此类队列匹配。客户端断开连接后,互斥队列将自动销毁,因此将其复制到另一台服务器没有用。如果服务器发生故障,客户端将与其断开连接,队列将被自动销毁。镜像实例也将被销毁。

测试设置

为了测试群集设置,我们可以通过管理控制台使用命令行界面创建一个新队列。

sudo rabbitmqadmin declare queue --vhost "/" name=my-ha-queue durable=true

这将/在名称为的默认虚拟主机上创建持久队列my-ha-queue

运行以下命令,并在输出中验证该队列已分配了我们的“ ha”策略,并且在主节点和镜像节点上具有pid。

sudo rabbitmqctl list_queues name policy state pid slave_pids

现在,我们可以从主节点将消息发布到队列,并在主节点上停止RabbitMQ。

sudo rabbitmqadmin -u user_name -p password  publish routing_key=my-ha-queue payload="hello world"
sudo systemctl rabbitmqctl shutdown

现在,通过连接到镜像节点将其取回。

 sudo rabbitmqadmin -H MIRROR_NODE_IP_OR_DNS -u user_name -p password get queue=my-ha-queue

最后,我们可以重新启动主节点。

sudo systemctl start rabbitmq-server.service

删除来宾用户

如前所述,RabbitMQ自动使用默认的访客密码创建访客用户。将此默认用户留在公开暴露的系统上是不好的做法。

sudo rabbitmqctl delete_user guest

留下評論

在Arch Linux上使用Makepkg

在Arch Linux上使用Makepkg

在Arch Linux上使用Makepkg可以避免系统污染,确保仅安装必要的依赖关系。

如何在Ubuntu 16.04上安装OpenSIPS控制面板

如何在Ubuntu 16.04上安装OpenSIPS控制面板

快速学习如何在Ubuntu 16.04上安装OpenSIPS控制面板,为VoIP提供商提供支持的功能。

在Fedora 28上安装Akaunting

在Fedora 28上安装Akaunting

学习如何在Fedora 28上安装Akaunting,一款适合小型企业和自由职业者的开源会计软件。

如何在CentOS 7上安装Mailtrain新闻通讯应用程序

如何在CentOS 7上安装Mailtrain新闻通讯应用程序

使用其他系统?Mailtrain是一个基于Node.js和MySQL / MariaDB构建的开源自托管新闻通讯应用程序。

诊断Minecraft服务器延迟和低TPS

诊断Minecraft服务器延迟和低TPS

了解導致Minecraft延遲的原因和解決方案,包括優化伺服器性能和減少滯後的步驟。

AI 能否應對越來越多的勒索軟件攻擊?

AI 能否應對越來越多的勒索軟件攻擊?

勒索軟件攻擊呈上升趨勢,但人工智能能否幫助應對最新的計算機病毒?AI 是答案嗎?在這裡閱讀知道是 AI 布恩還是禍根

ReactOS:這是 Windows 的未來嗎?

ReactOS:這是 Windows 的未來嗎?

ReactOS,一個開源和免費的操作系統,這裡有最新版本。它能否滿足現代 Windows 用戶的需求並打倒微軟?讓我們更多地了解這種老式但更新的操作系統體驗。

通過 WhatsApp 桌面應用程序 24*7 保持聯繫

通過 WhatsApp 桌面應用程序 24*7 保持聯繫

Whatsapp 終於為 Mac 和 Windows 用戶推出了桌面應用程序。現在您可以輕鬆地從 Windows 或 Mac 訪問 Whatsapp。適用於 Windows 8+ 和 Mac OS 10.9+

人工智能如何將流程自動化提升到新的水平?

人工智能如何將流程自動化提升到新的水平?

閱讀本文以了解人工智能如何在小型公司中變得流行,以及它如何增加使它們成長並為競爭對手提供優勢的可能性。

macOS Catalina 10.15.4 補充更新引發的問題多於解決

macOS Catalina 10.15.4 補充更新引發的問題多於解決

最近,Apple 發布了 macOS Catalina 10.15.4 補充更新以修復問題,但似乎該更新引起了更多問題,導致 mac 機器變磚。閱讀這篇文章以了解更多信息