根据以下帖子:
http://rabbitmq.1065348.n5.nabble.com/RabbitMQ-Backup-td18268.html
http://rabbitmq.1065348.n5.nabble.com/rabbitmq-server-Mnesia-backup-and-restore-td28598.html
通过执行以下步骤,可以备份然后恢复持久排队的消息:
要 back up 我们必须:
1-停止rabbitmq服务器:#rabbitmqctl stop_app 2- copy(tar)文件夹“/ var / lib / rabbitmq / mnesia /”:#tar -cvf mnesia.tar / var / lib / rabbitmq / mnesia / 3- start rabbitmq服务器:#rabbitmqctl start_app
然后到 restore 他们我们必须:
1-停止rabbitmq服务器:#rabbitmqctl stop_app 2- copy back(untar)文件夹“/ var / lib / rabbitmq / mnesia /”:#tar -xvf mnesia.tar -C / 3-启动rabbitmq服务器:# rabbitmqctl start_app
But when trying to apply those steps on a rabbitmq cluster or even on a single node, could not restore any message.
还注意到了以下内容: /var/lib/rabbitmq/mnesia/rabbit@rabbitmq-node1/msg_store_transient 其中似乎存储了排队的消息, is always cleaned just after rabbitmq server is restarted (stop_app和start_app) . 然后尝试复制备份的tar,在启动rabbitmq后,没有清除文件夹/ msg_store_transient,但这也没有帮助(IOW在Web管理控制台中没有恢复消息的迹象) .
我们在虚拟机上执行测试: Ubuntu-14.04, Erlang-R16B03, RabbitMQ-3.4.1, 和由java客户端创建的 durable queues .
将会感谢任何帮助或提示正确恢复排队的消息,尤其是在rabbitmq服务器故障后 .
1 回答
需要持久性
发布的消息应标记为持久性 - 通过提供值为2的delivery_mode属性 . 请参阅https://www.rabbitmq.com/tutorials/tutorial-two-python.html
在Java客户端中,我们可以设置如下:
存储位置
已发布的消息存储在
目录,而不是
并且在rabbitmq重新启动后没有清除mnesia / rabbit @ rabbitmq-node1 / msg_store_persistent **的内容 .
还规定,在重新启动单个节点或所有集群的节点之后,所有标记为持久性的消息都可用 .
恢复单节点配置
恢复备份消息也在单个节点rabbitmq配置中正常运行,因为它只备份了 /var/lib/rabbitmq/mnesia/rabbit@rabbitmq-node1 dir,这很好并且足以使用其所有消息恢复队列,之后使用rabbitmq manager web console删除了其内容的队列 .
恢复群集配置和更改的节点名称
但是,在从所有群集节点中删除队列后,多个节点的群集无法还原备份的消息 .
作为一种解决方法,尝试将备份从群集恢复到具有相同节点名称的Rabbitmq服务器(在我的示例中,节点名称为 rabbit@rabbitmq-node1 ),并通过执行以下步骤成功完成:
添加一个与备份名称相同的持久队列,这应该在** mnesia \ rabbit @ rabbitmq-node1 \ queues **目录中创建相同的目录(具有相同的代码名称) .
停止rabbitmq并从备份中仅替换以下目录:
/var/lib/rabbitmq/mnesia/rabbit@rabbitmq-node1/msg_store_persistent
/var/lib/rabbitmq/mnesia/rabbit@rabbitmq-node1/queues
\# /etc/init.d/rabbitmq-server restart
这有助于我将特定队列的排队消息从群集恢复(IOW迁移)到单个节点rabbitmq服务器 .