【问题标题】:Make RabbitMQ durable/persistent queues survive Kubernetes pod restart使 RabbitMQ 持久/持久队列在 Kubernetes pod 重启后存活
【发布时间】:2019-11-04 16:04:35
【问题描述】:

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

我们使用持久/持久队列,但只要我们的云实例关闭和备份,并且 RabbitMQ pod 重新启动,我们现有的持久/持久队列就会消失。

起初,我认为存储队列的卷不持久是一个问题,但事实并非如此。

队列数据似乎存储在/var/lib/rabbitmq/mnesia/<user@hostname> 中。由于 pod 的主机名每次都会更改,因此它会为新主机名创建一组新数据,并失去对先前持久队列的访问权限。我在 mnesia 文件夹中建立了许多文件集,全部来自以前的重新启动。

如何防止这种行为?

我能找到的最接近的答案是在this question,但如果我没看错的话,这只有在集群中有多个节点同时共享队列数据时才有效。我不确定它是否适用于单个节点。还是会?

【问题讨论】:

  • RabittMQ 特定设置:Durability 持久队列被持久化到磁盘,因此在代理重启后仍然存在。不持久的队列称为瞬态队列。队列的持久性不会使路由到该队列的消息持久。 如果代理被关闭然后重新启动,持久队列将在代理启动期间重新声明但是,只有持久消息将被恢复。 这是通过消息属性完成的(delivery_mode 或在某些客户端中是持久的)。
  • @JoeMjr2 你能解决这个问题吗? :)

标签: kubernetes rabbitmq persistence persistent-storage


【解决方案1】:

如何防止这种行为?

通过使用 StatefulSet 用于 Pod 具有与其“身份”相关联的持久数据的情况。 The Helm chart 是开始阅读的好地方,即使您最终没有使用它。

【讨论】:

  • 这可能是更好的解决方案,但提供有关如何使用这些方法实现此目的的更多细节可能会很有用。
【解决方案2】:

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

【讨论】:

    【解决方案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
    猜你喜欢
    • 2016-01-04
    • 2011-06-30
    • 2016-05-18
    • 2015-08-03
    • 2016-01-28
    • 2018-01-09
    • 2011-12-22
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多