RabbitMQ 使用 Mnesia 数据库来存储队列、交换机和绑定等信息。Mnesia 故障的常见原因可以分为两类:
当你遇到 Mnesia 数据库的权限问题时,只需为当前用户配置 MNESIA_BASE 目录的写权限即可解决该问题。
Mnesia 会根据机器的主机名创建相应的数据库模式。因此,当主机名更改时,Mnesia 无法加载旧的模式。同样,如果 rabbit@hostname 目录被重命名,Mnesia 也将无法找到旧的数据库文件,这会导致它创建一个新的 rabbit@hostname 文件夹并重新启动数据库。
要修复 Mnesia 读取失败,你可以按照以下步骤操作:
首先,检查节点的主机名或 rabbit@hostname 目录名称是否有更新。如果有更新,可以按照“rabbit@hostname”的约定进行重命名,这样在重命名后你就可以看到旧的数据库文件。
如果没有发现更新,在集群模式下,由于副本之间连接失败,启动可能会失败。你可以根据日志调查副本之间的通信问题。
如果以上方法仍无法恢复数据,你可以选择备份当前集群的配置,重新部署新节点以加入原集群,并导入备份的配置。
如果 RabbitMQ 在重启后无法正确形成一个新的集群,你可能会在日志中遇到如下错误:
这个问题发生的原因是关于集群节点的信息存储在 Mnesia 数据库中,而 RabbitMQ 在重启时没有正确清除状态信息。由于 RabbitMQ 对 Pods 的顺序启动策略,这可能导致最初启动的 Pods 无限期等待其他 Pods 完成启动,从而造成死锁。建议的解决方案是强制删除集群状态并重启。你可以在 kubectl 中执行以下命令: