rabbitmq集群宕机丢失用户问题分析报告

问题背景

  1. pacemaker集群同时断电或重启时,rabbitmq中创建的用户丢失,仅默认用户还在。
  2. 初步验证:如果是直接命令拉起的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对元数据的管理逻辑
  1. 移除备份和恢复的逻辑代码
  2. 启动rabbitmq集群时,根据数据目录(/var/lib/rabbitmq/mnesia)是否存在,采取不同启动流程:
    • 如果数据目录存在,则直接拉起rabbtimq服务。
    • 如果数据目录不存在,则重建rabbitmq集群。

方案影响

  • 修改前:
    当rabbitmq集群数据异常,无法建立集群时,rabbitmq服务可以通过重建拉起服务。
  • 修改后:
    当rabbitmq集群数据异常,无法建立集群时,rabbitmq服务不能正常启动
    恢复方式:
    1. 删除异常节点的rabbitmq数据目录:/var/lib/rabbitmq/mnesia,并重启服务。
    2. 检查用户数据是否丢失,如果丢失需创建对应用户、权限数据。

你可能感兴趣的:(rabbitmq集群宕机丢失用户问题分析报告)