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