RabbitMQ Shovel 卡在 'Terminated' 状态

RabbitMQ Shovel Stuck in 'Terminated' Status

我们有一个问题,有时 src-delete-after 设置为 queue-length 的动态铲(通过 HTTP API 创建:/api/parameters/shovel/)完成并然后没有被删除,而是陷入了 terminated 状态。

随后尝试通过以下任何方法删除铲子均未成功:

  1. 发布 DELETE/api/parameters/shovel/
  2. rabbitmqctl delete_shovel
  3. rabbitmqctl clear_parameter -p <vhost> shovel <shovel_name>

铲子甚至没有出现在 RabbitMQ 管理的 'Shovel Management' 部分 UI。

我们摆脱卡住的铲子的唯一方法是重新启动 RabbitMQ。

还有其他人遇到这个问题吗?如果是这样,我们如何在不重启集群的情况下清除铲子?另外,是否可以通过配置来防止这种情况发生?

谢谢!

PS:

  1. RabbitMQ 版本:3.4.4
  2. 运行 一个 2 节点集群(由于我们在网络分区的情况下可能面临的明显问题,很快就会将其变成 3 节点集群)。

您使用的是非常非常旧的 RabbitMQ 版本。请升级到最新版本(3.7.6)并确保使用 Erlang 20.3.X(而不是 21)。如果您仍然可以重现此问题,请在 rabbitmq-users 邮件列表中报告。

我们正在使用 RMQ 3.7.13,Erlang 21.3.1。

一种 问题发生的可能方式:

  • 3 节点 HA 集群
  • 重启其中一个节点(/etc/init.d/rabbitmq-server重启)
  • 旧铲子和旧队列以某种方式复活

使用问题中提到的任何方法都无法删除铲子。 我能够移除铲子的唯一方法是禁用集群中所有 3 个节点上的铲子插件,然后像这样在每个节点上重新启用每个插件:

rabbitmq-plugins disable rabbit_shovel
rabbitmq-plugins enable rabbit_shovel
rabbitmq-plugins enable rabbit_shovel_management

至于旧队列复活(随机发生,没有触及任何东西......我称它们为“僵尸”队列),这个问题大约每月发生一次,所以我创建了 PostMan 脚本来删除复活的队列。多年来,这一直是个问题。我们升级了 RMQ,希望能解决问题……但事实并非如此。也许 Quorum 队列是一个更强大的解决方案?如果我有更多时间investigate/experiment,我会的,但我被更高优先级的眼球埋没了。