在RabbitMQ中恢复备份的排队消息无法正常工作

时间:2014-11-24 15:58:09

标签: rabbitmq

根据以下帖子:

http://rabbitmq.1065348.n5.nabble.com/RabbitMQ-Backup-td18268.html

http://rabbitmq.1065348.n5.nabble.com/rabbitmq-server-Mnesia-backup-and-restore-td28598.html

可以通过执行以下步骤来备份然后恢复持久排队的消息:

备份,我们必须:

  

1- 停止 rabbitmq服务器:   # rabbitmqctl stop_app

     

2- 复制(tar)文件夹“/ var / lib / rabbitmq / mnesia /”:   # tar -cvf mnesia.tar /var/lib/rabbitmq/mnesia/

     

3- 启动 rabbitmq服务器:   # rabbitmqctl start_app

然后恢复他们我们必须:

  

1- 停止 rabbitmq服务器:   # rabbitmqctl stop_app

     

2- 复制(解压缩)文件夹“/ var / lib / rabbitmq / mnesia /”:   # tar -xvf mnesia.tar -C /

     

3- 启动 rabbitmq服务器:   # rabbitmqctl start_app

但是,当尝试在rabbitmq群集或甚至单个节点上应用这些步骤时,无法恢复任何消息。

还注意到以下内容: 的的/ var / lib中/ RabbitMQ的/ Mnesia的/兔@ RabbitMQ的节点1 / msg_store_transient 似乎存储排队的消息, 刚刚重启Rabbitmq服务器后,总是被清除(stop_app和start_app)。 然后尝试复制备份的tar,在启动rabbitmq后,没有清除文件夹/ msg_store_transient, 但这也没有帮助(IOW在Web管理控制台中没有恢复消息的迹象)。

我们正在虚拟机上执行测试: 的 Ubuntu的14.04, 二郎-R16B03, 的RabbitMQ-3.4.1, 以及由java客户端创建的持久队列

非常感谢任何有关正确恢复排队邮件的帮助或提示,尤其是在rabbitmq服务器发生故障后。

1 个答案:

答案 0 :(得分:5)

需要持久性

发布的消息应标记为持久性 - 通过提供值为2的delivery_mode属性。请参阅https://www.rabbitmq.com/tutorials/tutorial-two-python.html

在Java客户端中,我们可以按如下方式设置:

AMQP.BasicProperties basicProperties = new AMQP.BasicProperties().builder().deliveryMode(2).build();

Channel channel = initializeChannel(...);

channel.basicPublish(exchange, rootinKey, basicProperties, message body in bytes);

存储位置

已发布的消息存储在

/var/lib/rabbitmq/mnesia/rabbit@rabbitmq-node1/msg_store_persistent

目录,而不是

/var/lib/rabbitmq/mnesia/rabbit@rabbitmq-node1/msg_store_transient

在rabbitmq重新启动后,mnesia / rabbit @ rabbitmq-node1 / msg_store_persistent **的内容未被清除。

同样已经确定,在重新启动单个节点或所有群集的节点之后,所有标记为持久性的消息都可用。

还原单节点配置

恢复备份的消息也在单个节点rabbitmq配置中正常运行,因为它只备份了 / var / lib / rabbitmq / mnesia / rabbit @ rabbitmq-node1 目录这很好,在使用rabbitmq manager web console删除了包含其内容的队列之后,足以使用其所有消息恢复队列。

还原群集配置和更改的节点名称

但是,在从所有群集节点删除队列后,多个节点的群集无法恢复备份的消息。

作为一种解决方法,尝试将备份从群集还原到具有相同节点名称的单个节点rabbitmq服务器(在我的示例中,节点名称为 rabbit @ rabbitmq-node1 )并成功执行以下步骤:

  1. 添加具有相同名称的持久队列,例如支持的队列 up,这应该创建相同的目录(具有相同的代码名称) ** mnesia \ rabbit @ rabbitmq-node1 \ queues **目录。

  2. 停止rabbitmq并仅替换以下目录 备份:

    <强>的/ var / lib中/ RabbitMQ的/ Mnesia的/兔@ RabbitMQ的节点1 / msg_store_persistent

    / var / lib / rabbitmq / mnesia / rabbit @ rabbitmq-node1 / queues

  3. 如果未显示排队的消息,则启动rabbitmq 管理Web控制台概述,然后重新启动服务器 使用:

    \# /etc/init.d/rabbitmq-server restart

  4. 这有助于我将特定队列的排队消息从群集恢复(IOW迁移)到单个节点rabbitmq服务器。