我在 EC2 实例上使用 RabbitMQ,并且在 EBS 卷上有 Mnesia 表,因此当我对其进行快照并尝试使用相同数据启动另一个实例时,似乎该表正在被另一个 RabbitMQ 实例使用。
解决这个问题的唯一方法是关闭 RabbitMQ 以进行刷新/快照,然后在完成后重新启动它?
有没有办法清理文件,使它们看起来不被锁定或被强制解锁?
这不是我将面临的常见问题,只是好奇是否有更好的解决方案。
为了澄清,我看到的错误是:timeout_waiting_for_tables
.
我在 EC2 实例上使用 RabbitMQ,并且在 EBS 卷上有 Mnesia 表,因此当我对其进行快照并尝试使用相同数据启动另一个实例时,似乎该表正在被另一个 RabbitMQ 实例使用。
解决这个问题的唯一方法是关闭 RabbitMQ 以进行刷新/快照,然后在完成后重新启动它?
有没有办法清理文件,使它们看起来不被锁定或被强制解锁?
这不是我将面临的常见问题,只是好奇是否有更好的解决方案。
为了澄清,我看到的错误是:timeout_waiting_for_tables
.
您首先要关注文件系统。不确定您使用的是 LVM、ext3、xfs 还是什么,但如果您使用的是 LVM,您可能需要查看dmsetup 手册页;特别是dmsetup 暂停/恢复
你最终会得到类似的东西:
dmsetup suspend <dev>
ec2-create-snapshot <vol>
dmsetup resume <dev>
一旦你让文件系统同步/挂起,就有 rabbitmq 需要担心。Rabbitmq 开发人员 Matthias Radestock 在电子邮件线程中指出:
但是对于持久性消息,我不太确定。rabbit_persister.LOG 是如何管理的?我是否可以随时对其进行备份,或者我可以只使用 rabbit_persister.LOG.previous 中的一个?
我会备份这两个文件。即使该备份是在追加过程中进行的,也应该可以从备份中恢复 rabbit_persister.LOG - 不过我还没有测试过。如果在滚动日志时发生备份,则需要 .previous 日志。
我在哪里可以查看它的滚动频率?
决定何时滚动日志的逻辑相当复杂。
我可以触发手动滚动吗?
Erlang shell 中的 rabbit__persister:force_snapshot() 可以解决问题。
签出Rabbitmq Makefile中的force-snapshot目标。