【问题标题】:rabbitmq-server start losing data over durable queuesrabbitmq-server 开始通过持久队列丢失数据
【发布时间】:2016-12-28 11:45:45
【问题描述】:

在 Windows 上,当我使用 rabbitmq-server start/stop 命令时,RabbitMQ 持久队列上的数据将被删除。当我启动 RabbitMQ 服务器时,似乎重新创建了队列。

如果我使用rabbitmqctl stop_app/start_app,我不会丢失任何数据。为什么?

如果我的服务器出现故障会发生什么情况?我如何确定我不会丢失数据?

【问题讨论】:

    标签: rabbitmq persistence amqp rabbitmqctl durability


    【解决方案1】:

    配置问题:我从 rabbitmq sbin 目录启动 rabbitmq。我重新安装了rabbitmq并将rabbitmq添加到Windows服务中。现在数据丢失问题在我的电脑上解决了。当我启动/停止 windows 服务时,rabbitmq 不会丢失任何数据

    【讨论】:

      【解决方案2】:

      使队列持久是不够的。可能您还需要将交换声明为持久以及发送“持久”消息。

      在 Java 中,您将使用:

      channel.basicPublish("", "sample_queue",
              MessageProperties.PERSISTENT_TEXT_PLAIN, // note that this parameter is not null!
              message.getBytes())
      

      【讨论】:

      • 我也在持久化消息。当我使用 rabbitmqctl start/stop 时,我不会丢失任何“持久消息”。我在发布消息时使用 deliveryMode=2。
      • 我知道start_app/stop_app只会重启rabbit mq本身。所有持久的东西都存储在名为 mnesia 的数据库中。它就像兔子一样运行在 erlang vm 之上。在 linux 上,您可以键入 ps -ef | grep rabbit 你会看到有很多进程。所以 rabbitmq-server stop 将停止一切,包括 mnesia。这就是两个命令之间的区别。
      • 谢谢。停止 Mnesia 应该不是问题。因为我再次启动rabbitmq。Mnesia 是一个数据库,当你重新启动它们时,数据库不会丢失任何数据。我没有使用任何集群,只是单个 rabbitmq 实例,所以我假设单个 mnesia 单个 rabbitmq 集群正在我的系统上运行。