根据以下帖子:
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服务器发生故障后。
答案 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 )并成功执行以下步骤:
添加具有相同名称的持久队列,例如支持的队列 up,这应该创建相同的目录(具有相同的代码名称) ** mnesia \ rabbit @ rabbitmq-node1 \ queues **目录。
停止rabbitmq并仅替换以下目录 备份:
<强>的/ var / lib中/ RabbitMQ的/ Mnesia的/兔@ RabbitMQ的节点1 / msg_store_persistent 强>
/ var / lib / rabbitmq / mnesia / rabbit @ rabbitmq-node1 / queues
如果未显示排队的消息,则启动rabbitmq 管理Web控制台概述,然后重新启动服务器 使用:
\# /etc/init.d/rabbitmq-server restart
这有助于我将特定队列的排队消息从群集恢复(IOW迁移)到单个节点rabbitmq服务器。