问题背景
- pacemaker集群同时断电或重启时,rabbitmq中创建的用户丢失,仅默认用户还在。
- 初步验证:如果是直接命令拉起的rabbitmq集群(不用pacemaker管理),不存在以上问题。
问题分析
Rabbitmq集群数据持久化流程
基本概念:
- Rabbitmq是基于mnesia(一个分布式数据库管理系统)。
- mnesia有 LATEST.LOG 日志文件 及 *.DAT, *.DCD *.DCL 等数据文件。
- mnesia是先向 LATEST.LOG写日志,当日志达到dump_log_write_threshold参数(默认100条)或时间到dump_log_time_threshold(默认3min)时,会将这最多100条日志操作转存到数据文件上。
- dump操作应该就是 LOG->DAT转移的过程。
原理分析:
- 当数据持久化到数据文件之后,如果不重建集群,仅仅重启rabbitmq服务是可以保留用户数据,队列等数据的。
pacmeker管理的rabbitmq集群的启动逻辑
- pacemaker管理的rabbitmq集群,在每次启动整个rabbitmq集群时,是一个重建集群的过程(包括了清除原数据目录/var/lib/rabbitmq/mnesia),因此原有的用户数据,队列数据等将会丢失。
- 如果只是重启部分rabbitmq,所有数据不会丢失。
- 如果正常重启pacemaker集群,元数据不会丢失,因为pacemaker在停止服务前备份了用户、权限、策略等元数据,启动服务后再恢复这些元数据。
- 从pacemaker的管理逻辑可以看出
- 对消息数据的管理,pacemaker是将消息数据理解为临时数据,重启后rabbitmq服务端会清空消息数据。
- 对元数据(用户、权限、策略)的管理,pacemaker采取备份和恢复的测录,原理上存在集群掉电或强制重启时,丢失元数据的问题。
修复方案
修改pacemaker对元数据的管理逻辑
- 移除备份和恢复的逻辑代码
- 启动rabbitmq集群时,根据数据目录(/var/lib/rabbitmq/mnesia)是否存在,采取不同启动流程:
- 如果数据目录存在,则直接拉起rabbtimq服务。
- 如果数据目录不存在,则重建rabbitmq集群。
方案影响
- 修改前:
当rabbitmq集群数据异常,无法建立集群时,rabbitmq服务可以通过重建拉起服务。 - 修改后:
当rabbitmq集群数据异常,无法建立集群时,rabbitmq服务不能正常启动
恢复方式:- 删除异常节点的rabbitmq数据目录:/var/lib/rabbitmq/mnesia,并重启服务。
- 检查用户数据是否丢失,如果丢失需创建对应用户、权限数据。
网友评论