如何为Xray HA重新群集RabbitMQ HA

罗兰杨
2023-01-22十一10

相关版本:x光2。Xand Xray 3.X – Instructions and paths are for 3.X but the overall process is similar in 2.X

Xray HA需要每个节点一个RabbitMQ代理(也就是说,如果你有两个Xray节点,你需要两个RabbitMQ代理)。在安装过程中,如果端口未打开或机器通信不正常,RabbitMQ可能无法正确群集。这将导致消息丢失和不可用的x射线HA。

诊断问题

让我们来看看一个破碎的RabbitMQ集群。在下面的示例中,我们将使用以下命令:rabbitmqctl cluster_status每个节点上有两个节点。两个节点应该输出相同的内容,但在这个问题示例中,它们不会输出相同的内容。

首先,你通常需要成为x射线Linux用户运行rabbitmqctl命令。要使用的二进制文件在Xray_Home“app”文件夹中,通常可以在这里找到:

#以root用户以Xray帐户登录
Sudo - x射线

#导航到Xray App文件夹
RabbitMQ的二进制文件在第三方/ RabbitMQ /sbin目录下
cd / opt / jfrog / x光/ app /第三方/ rabbitmq / sbin

#使用sbin文件夹下的ctl二进制文件调用cluster_status命令
。/ rabbitmqctl cluster_status

在这个破碎的设置中,每个节点的Cluster Name和其他字段是不同的,每个R联合国的节点节只显示一个节点作为操作中的唯一节点。

图像

下面是一些你在编辑和保存索引库时可能遇到的x射线错误:

[2018/05/22 23:34:39 UTC] [error] (www.si-fil.com/xray/service/permission_service.(*PermissionService).updateOtherNodesAndUiClients:719)
在其他节点上重新加载权限缓存失败:超时等待从节点[plus-xray]同步操作'ReloadPermissionCache'的回复

[2018/05/22 23:34:39 UTC] [error] (www.si-fil.com/xray/service/permission_service.(*PermissionService).Remov2022世界杯阿根廷预选赛赛程eResources:397)
更新其他节点/ ui客户端失败:超时等待从节点[plus-xray]同步操作'ReloadPermissionCache'的回复

[2018/05/22 23:34:39 UTC] [error] (www.si-fil.com/xray/handlers/binary_managers.BinManagerHandler.SendRepos:490)
从权限中删除特定存储库失败:超时等待从节点同步操作'ReloadPermissionCache'的回复

重新集群

如果您看到了这些症状或遇到了其中任何问题,以下是我们推荐的解决方案。

1]首先,检查网络。

请确保以下端口为RabbitMQ通信打开:

  • 4369(epmd, RabbitMQ节点和CLI工具使用的对等发现服务)

  • 5672(RabbitMQ的监听端口)

  • 25672(RabbitMQ节点间HA接口)

  • 15672(RabbitMQ的仪表板UI和HTTP API端口,这是可选的,但很有用)

确保您的每台机器都可以通过远程登录, cURL可能无法工作,因为RabbitMQ使用AMP而不是HTTP。

还要确保RabbitMQ主机名是正确的。RabbitMQ使用“主机名- s命令来确定它的主机名应该是什么。在某些环境中,这个主机名不能工作;需要使用IP地址或其他URL。中使用主机名join_cluster命令概述如下。

2]选择一个已安装的x射线节点作为Primary。不要在“主”x光节点上做任何其他事情。如果你不确定哪个是主要的,随便选一个。您将让其他节点加入这个Primary的集群。

3]在剩余的x射线节点上,执行以下Rabbitmqctl命令:

#停止本地RabbitMQ“应用”- RabbitMQ服务器本身应该仍在运行
。/ rabbitmqctl stop_app

#加入主集群-即在xray-2中运行此命令
./rabbitmqctl join_cluster rabbit@xray-1

#启动本地RabbitMQ "app"
。/ rabbitmqctl start_app

4]在所有x射线节点上重复步骤[3],直到所有x射线节点都加入Primary集群

5]重新运行cluster_status命令检查集群状态。现在打印输出的两个地方都应该有所有的节点:

。/ rabbitmqctl cluster_status

基础知识
集群名称:rabbit@xray-1.us-central1-c.internal

磁盘节点
rabbit@xray-1
rabbit@xray-2

运行的节点
rabbit@xray-1
rabbit@xray-2
[…]

如果你得到Erlang分布错误;这意味着您的/var/lib/rabbitmq/.erlang.饼干文件。由于RabbitMQ要求cookie是相同的,所以将cookie的内容从主节点复制到所有其他节点,然后重新启动服务:

[$ XRAY_HOME / app /第三方/ rabbitmq / sbin /]
/ rabbitmqctl停止。
rabbitmq服务器分离

然后,类似于上面的步骤:

#停止RabbitMQ应用:
rabbitmqctl stop_app

#重置应用程序:
rabbitmqctl重置

#集群应用程序:
rabbitmqctl join_cluster rabbit@

#重启应用程序:
rabbitmqctl start_app

#镜像您的队列:
Rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

别忘了检查一下rabbitmqctl cluster_status之后。

查看RabbitMQ仪表板下的Queues部分,我们可以看到每个节点都会在features列中显示“ha-all”,表明同步队列的策略已经到位。

在RabbitMQ仪表板的Queues部分,确认每个节点都在Features列中显示ha-all。这将表明您的同步队列策略已就位并正常运行:

用户添加图片

您还可以执行DB同步,并通过在UI中直接访问两个服务器来跟踪其进度。进度条应该(几乎)同时更新。

更多信息,请参见RabbitMQ的集群指南在这里