在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


Leave a Comment

如何在CentOS 7上安装Oxwall

如何在CentOS 7上安装Oxwall

Oxwall是一个开源社交网络软件平台,可用于免费构建自定义社交网站(SNS)。在这篇文章中,

如何在CentOS 7上设置vsFTPd

如何在CentOS 7上设置vsFTPd

FTP是用于通过Internet传输文件的有用协议,本指南将向您展示如何设置vsFTPd(非常安全的文件传输协议守护程序)o

使用Nethogs监视网络带宽使用情况

使用Nethogs监视网络带宽使用情况

在本教程中,我们将介绍在CentOS 6x x64上安装和使用nethogs的过程。nethogs是一种网络监视工具,它允许Networ

如何在CentOS 7上安装BoltWire CMS

如何在CentOS 7上安装BoltWire CMS

使用其他系统?简介BoltWire是一个用PHP编写的免费,轻量级的内容管理系统。与大多数其他内容管理人员相比

在CentOS 6上设置SA-MP San Andreas多人服务器

在CentOS 6上设置SA-MP San Andreas多人服务器

欢迎来到另一个Vultr教程。在这里,您将学习如何安装和运行SAMP服务器。本指南是为CentOS 6编写的。先决条件

使用Etckeeper进行/ etc的版本控制

使用Etckeeper进行/ etc的版本控制

简介/ etc /目录在Linux系统运行中起着至关重要的作用。其原因是因为几乎每个系统配置

如何在CentOS 7上安装Microweber

如何在CentOS 7上安装Microweber

使用其他系统?Microweber是一个开放源代码的拖放式CMS和在线商店。Microweber源代码托管在GitHub上。本指南将向您展示

如何在CentOS 7上安装SonarQube

如何在CentOS 7上安装SonarQube

使用其他系统?SonarQube是用于质量系统开发的开源工具。它是用Java编写的,并且支持多个数据库。它提供

如何在CentOS 7上使用Mosh进行远程服务器管理

如何在CentOS 7上使用Mosh进行远程服务器管理

使用其他系统?Mosh是Mobile Shell的缩写,是一种新兴的远程终端应用程序,旨在提供更好的连接和使用

如何在CentOS 7上安装MoinMoin

如何在CentOS 7上安装MoinMoin

MoinMoin是一个使用Python编写的基于文件系统的开源Wiki引擎。如今,MoinMoin已广泛用于开源社区。许多供应商

在CentOS 7上安装H2O Web服务器

在CentOS 7上安装H2O Web服务器

H2O是新一代HTTP服务器,它对所有当前使用的Web服务器都具有出色的,功能齐全的HTTP / 2实现。使用H2O作为您的Web服务器

如何在Debian,CentOS和FreeBSD上使用Sudo

如何在Debian,CentOS和FreeBSD上使用Sudo

在Linux和Unix系统管理员中,使用sudo用户访问服务器并在root级执行命令是一种非常普遍的做法。使用泡沫

如何在Ubuntu 16.10上安装Countly Analytics

如何在Ubuntu 16.10上安装Countly Analytics

使用其他系统?Countly是一个开源Web /移动分析和营销平台。它具有许多用于从Web收集数据的功能

如何在CentOS 7上安装MODX CMS和Nginx

如何在CentOS 7上安装MODX CMS和Nginx

MODX是一个用PHP编写的免费开放源内容管理系统。它使用MySQL或MariaDB来存储其数据库。MODX专为满足以下条件的企业而设计:

如何在CentOS 7 LAMP VPS上安装Lychee 3.1相册

如何在CentOS 7 LAMP VPS上安装Lychee 3.1相册

使用其他系统?Lychee 3.1相册是一种简单,灵活,免费和开源的照片管理工具,可在VPS服务器上运行。安装

如何在CentOS 7上安装ERPNext开源ERP

如何在CentOS 7上安装ERPNext开源ERP

使用其他系统?ERP或企业资源计划是用于管理核心业务流程的企业应用程序套件。ERPNext是免费的

如何在CentOS 7 LAMP VPS上安装Paste 2.1

如何在CentOS 7 LAMP VPS上安装Paste 2.1

使用其他系统?Paste 2.1是一个简单,灵活,免费和开源的pastebin应用程序,用于存储代码,文本等。最初是

如何在CentOS 7上安装Seafile Server

如何在CentOS 7上安装Seafile Server

使用其他系统?Seafile(社区版本)是一个免费和开源的文件同步和共享解决方案,类似于ownCloud。机智

如何在CentOS 7上安装Kolab组件

如何在CentOS 7上安装Kolab组件

使用其他系统?Kolab Groupware是一个免费的基于Web的开源组件软件。它的功能包括电子邮件通信,事件

如何在CentOS 7 LAMP VPS上安装Omeka Classic 2.4 CMS

如何在CentOS 7 LAMP VPS上安装Omeka Classic 2.4 CMS

使用其他系统?Omeka Classic 2.4 CMS是一个免费的开源数字发布平台和用于共享数字内容的内容管理系统(CMS)

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 機器變磚。閱讀這篇文章以了解更多信息

大數據的13個商業數據提取工具

大數據的13個商業數據提取工具

大數據的13個商業數據提取工具

什麼是日誌文件系統,它是如何工作的?

什麼是日誌文件系統,它是如何工作的?

我們的計算機以稱為日誌文件系統的有組織的方式存儲所有數據。這是一種有效的方法,可以讓計算機在您點擊搜索時立即搜索和顯示文件。 https://wethegeek.com/?p=94116&preview=true

技術奇點:人類文明的遙遠未來?

技術奇點:人類文明的遙遠未來?

隨著科學的快速發展,接管了我們的大量工作,我們陷入無法解釋的奇點的風險也在增加。閱讀,奇點對我們意味著什麼。

洞察 26 種大數據分析技術:第 1 部分

洞察 26 種大數據分析技術:第 1 部分

洞察 26 種大數據分析技術:第 1 部分

2021 年人工智能對醫療保健的影響

2021 年人工智能對醫療保健的影響

過去幾十年,醫療保健領域的人工智能取得了巨大飛躍。因此,醫療保健中人工智能的未來仍在日益增長。