使RabbitMQ持久化/持久化队列在Kubernetes pod重启时保持存活

7

我们的应用程序使用单一节点的RabbitMQ,运行在单个Kubernetes pod中。

我们使用持久化队列,但是每当我们的云实例关闭并重新启动,并且RabbitMQ pod被重启时,我们现有的持久化队列都会消失。

起初,我认为问题出在存储队列的卷不具有持久性,但事实并非如此。

看起来队列数据存储在/var/lib/rabbitmq/mnesia/<user@hostname>中。由于pod的主机名每次都会更改,因此它会为新主机名创建新的数据集,并且无法访问以前持久化的队列。我在mnesia文件夹中建立了许多文件集,这些文件集都来自之前的重新启动。

我该如何防止这种行为发生?

我找到的最接近的答案在这个问题中,但如果我理解正确,这只适用于具有同时共享队列数据的多个节点的群集。我不确定它是否适用于单一节点。是吗?


RabbitMQ 特定设置: 持久性 持久队列被保存到磁盘上,因此可以在代理重启后继续存在。不持久的队列称为瞬态队列。 队列的持久性并不使路由到该队列的消息持久。如果代理被关闭然后重新启动,持久队列将在代理启动期间重新声明,但是只有持久消息将被恢复。这是通过消息属性(delivery_mode 或在某些客户端中为 persistent)完成的。 - Mark
@JoeMjr2 你解决了这个问题吗? :) - ParthS007
3个回答

3
在我们的情况下有帮助的是设置hostname: <static-host-value>
apiVersion: apps/v1
kind: Deployment
spec:
  replicas: 1
  ...
  template:
    metadata:
      labels:
        app: rabbitmq
    spec:
      ...
      containers:
      - name: rabbitmq
        image: rabbitmq:3-management
        ...
      hostname: rmq-host      

你在哪里添加了 hostname - ParthS007

0

我自己也遇到了这个问题,我发现最快的方法是指定一个环境变量RABBITMQ_NODENAME =“yourapplicationsqueuename”,并确保我的Pod只有1个副本。


0
如何防止这种行为发生?
使用StatefulSet,它是为Pod具有与其“身份”相关联的持久数据的情况而设计的。即使您最终不使用它,Helm图表也是开始阅读的好地方。

这可能是更好的解决方案,但提供一些关于如何使用这些方法实现它的详细信息可能会很有用。 - Rob G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接