如何Recluster RabbitMQ HA for Xray HA

罗兰杨
2021-09-23 06:42

如何Recluster RabbitMQ HA for XRAY HA

相关版本:此信息属于x射线版本2.x。如果您正在运行3.x+,请参阅下面的说明

Xray HA需要每个节点一个RabbitMQ代理(也就是说,如果你有两个Xray节点,你就需要两个RabbitMQ代理)。在安装过程中,如果端口没有打开或机器通信不正常,RabbitMQ可能无法正确集群。这将导致消息丢失和无法使用的x射线HA。
让我们来看看一个坏掉的RabbitMQ集群。在下面的例子中,我们将在两个节点上使用命令$rabbitmqctl cluster_status(一次一个)。它们应该作为一个健康的集群运行,但事实并非如此,因为每个节点的cluster_name输出是不同的,而running_nodes输出显示正在测试的节点是运行中的惟一节点。

节点1
root@eplus-xray: / # rabbitmqctl cluster_status
节点“rabbit@eplus-xray”的集群状态…
[{节点,[{圆盘,[' rabbit@eplus-xray ']}]},
{running_nodes, [' rabbit@eplus-xray ']},
{cluster_name, < <“rabbit@eplus-xray”> >},
{分区,[]},
{警报,[{rabbit@eplus-xray, []}]}]

节点2
root@eplus-xray-2: / # rabbitmqctl cluster_status
节点“rabbit@eplus-xray-2”的集群状态…
[{节点,[{圆盘,[' rabbit@eplus-xray-2 ']}]},
{running_nodes, [' rabbit@eplus-xray-2 ']},
{cluster_name, < <“rabbit@eplus-xray-2”> >},
{分区,[]},
{警报,[{rabbit@eplus-xray-2, []}]}]

以下是在尝试编辑和保存索引存储库时可能会遇到的一些错误:

[2018/05/22 23:34:39 UTC] [error] (www.si-fil.com/xray/service/permission_service.(*PermissionService).updateOtherNodesAndUiClients:719)
在其他节点上重新加载权限缓存失败:等待同步操作“ReloadPermissionCache”的响应超时
[2018/05/22 23:34:39 UTC] [error] (www.si-fil.com/xray/service/permission_service.(*PermissionService).Remov2022世界杯阿根廷预选赛赛程eResources:397)
更新其他节点/ ui客户端失败:等待同步操作“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端口,这是可选的,但很有用)

  1. 确保你的每台机器都能通过telnet到达所有这些端口(因为cURL可能无法工作,因为RabbitMQ使用的是amp而不是http)

  2. Recluster节点。主机名可以通过$hostname -s获取。然后,在辅助节点上执行以下操作:

    1. 停止RabbitMQ应用:$rabbitmqctl stop_app

    2. 集群应用:$rabbitmqctl join_cluster rabbit@<主机名>

    3. 重新启动应用:$rabbitmqctl start_app

    4. $rabbitmqctl set_policy ha-all "^" ` {"ha-mode":"all"} `

如果你得到一个Erlang分布错误,这意味着你的/var/lib/rabbitmq/. Erlang中有一个Erlang cookie不匹配。饼干文件。由于RabbitMQ要求cookie是相同的,所以将cookie的内容从你的主节点复制到所有其他节点,然后重启服务
然后,类似于上面的步骤:

    1. 停止RabbitMQ应用:$rabbitmqctl stop_app

    2. 重置应用:$rabbitmqctl Reset

    3. 集群应用:$rabbitmqctl join_cluster rabbit@<主机名>

    4. 重新启动应用:$rabbitmqctl start_app

    5. $rabbitmqctl set_policy ha-all "^" ` {"ha-mode":"all"} `

  1. 检查$rabbitmqctl cluster_status是否显示所有的rabbitmq节点都在运行。通过在所有节点上运行$rabbitmqctl cluster_status命令来验证你的RabbitMQ集群是否正常运行。如果没有问题,running_nodes将显示所有实例,每个节点的cluster_name输出都是相同的。

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

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

用户添加图片
您还可以执行DB同步,并通过直接访问UI中的两个服务器来跟踪其进度。进度条应该(几乎)同时更新。
之后,两个节点将显示:

# rabbitmqctl cluster_status
节点“rabbit@eplus-xray-2”的集群状态…
[{节点,[{圆盘,[' rabbit@eplus-xray ', ' rabbit@eplus-xray-2 ']}]},
{running_nodes, [' rabbit@eplus-xray ', ' rabbit@eplus-xray-2 ']},
{cluster_name, < <“rabbit@eplus-xray”> >},
{分区,[]},
{警报,[{rabbit@eplus-xray, []}, {rabbit@eplus-xray-2, []}]}]

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

关于x射线3的注释
新安装的Xray 3可能不再安装rabbitmqctl二进制文件。对于这种情况,您可以通过将linux用户更改为运行xray的用户来访问相同的命令;通常这是'xray'用户,$su - xray。如果您有一个自定义用户,请使用它代替。您可以通过$ps -ef | grep xray获取运行用户。然后,导航到目录:
$ XRAY_HOME / app /第三方/ rabbitmq / sbin /
有一个名为'rabbitmqctl'的二进制文件,可以用。/rabbitmqctl <命令>调用
然后按照上面的步骤操作。
RabbitMQ开始:
美元XRAY_HOME / app /第三方/ rabbitmq / sbin / rabbitmq服务器分离
停止RabbitMQ:
rabbitmq XRAY_HOME美元/ app /第三方/ / sbin #。/ rabbitmqctl停止