首页 文章

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

提问于
浏览
2

根据以下帖子:

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 回答

  • 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 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

    • 启动rabbitmq,如果排队的消息未出现在管理Web控制台的概述中,则使用以下命令重新启动服务器:

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

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

相关问题