美文网首页
rabbitmq集群宕机丢失用户问题分析报告

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

作者: doverxu | 来源:发表于2021-05-31 16:50 被阅读0次

    问题背景

    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集群宕机丢失用户问题分析报告

          本文链接:https://www.haomeiwen.com/subject/eutgsltx.html