zoukankan      html  css  js  c++  java
  • kudu tablet 之元数据丢失问题

    在生产环境遇到了kudu以下报错:

    Check failed: _s.ok() Bad status: Incomplete: Could not init Tablet Manager: Unable to load consensus metadata for tablet 21ba3db23237444681
    d90dd04330f6ce: Could not read header for proto container file /data01/kudu/fs_ wal . dir/tablet/consensus-meta/21ba3db23237444681 d90dd0433
    0f6ce: File size not large enough to be valid: Proto container file /data01 /kudu/fs_ wal. dir/tablet/consensus-meta/21ba3db23237444681 d90d
    d04330f6ce: Tried to read 16 bytes at offset 0 but file size is only 0 bytes

    对此进行了分析研究定位到是kudu的consensus metadata 缺失;

    可以发现此元数据文件已经发生了丢失,我们将consensus-meta目录进行了备份并重新创建新的consensus-meta目录赋予其原始的目录权限;然后重启kudu-tablet;发现此时kudu已经恢复了正常,并且已经开时进行数据同步。

    kudu本身是具有分布式管理功能,当一个节点发生故障,会将数据自动迁移到其他节点上,所以此处我们将kudu的元数据目录迁移重新创建,启动后会有数据重新从其他节点同步过来。

    tablet存在的主要指标是tablet-meta目录中tablet的超级块文件的存在。如果该文件不存在,我们没有指向tablet数据块的指针,因此我们认为tablet处于 DOES_NOT_EXIST状态。除了超级块之外,启动tablet所需的文件是一致性元数据文件(在consensus-meta下),预写日志(在wals下)和数据块(在data下)。当然,自动恢复的tablet server级文件(如instance)也是必须的。

    tablet删除

    为了删除tablet,我们必须永久保留Raft元数据以避免一致性失忆症。我们还会临时备份(隔离)数据,以便以后进行调试。最初,我们将提供一些工具,以便在不再需要时手动删除隔离文件及其关联的数据块。

    要求

    • 保存一致性元数据,例如当前任期,投票历史记录和上次日志条目。这是为了避免选择过时的节点作为leader,并强迫过时的leader下台。
    • 逻辑删除tablet(可能使用超级块中的标志),因此我们知道要查找上面保存的共识元数据。
    • 隔离旧数据.

    实现

    我们可以使用以下步骤安全地实现tablet删除:

      1. 关机正在运行的tablet
      2. 创建隔离目录(QDIR)。
      3. 将当前的超级块复制到QDIR。
      4. 将SuperBlock标记为DELETED(因此我们总是在此步骤后回滚删除操作); 将日志中的最后一个OpId存储到SuperBlock
        PB中的一个字段中(如果我们希望能够在删除后不再拥有我们的WAL文件时在选举中投票,我们需要知道我们日志中的最后一个OpId);将路径存储到QDIR中的SuperBlock;最后将SuperBlock保存并fsync到tablet元数据目录中。现在tablet被视为已删除。
      5. 将一致性元数据文件复制到QDIR。
      6. 将WAL目录移动到QDIR。这应该是原子的,因为此时我们不对WAL进行条带化。

    其他故障恢复

    具有一致性元数据的磁盘故障是灾难性故障

    如果我们丢失了具有元数据或WAL的磁盘,并且需要复制新的副本以进行恢复,那么可能无法安全地执行此操作,这是因为我们不可避一致性失忆。在这种情况下,tablet server必须采用新的UUID并完全清除其所有数据和状态:

    1. 检测坏磁盘
    2. 关闭/崩溃
    3. 管理员将替换坏磁盘
    4. 擦除机器上的所有数据
    5. 为tablet server重新分配新的UUID

    这一预防措施可确保过时的tablet server无法让失忆的服务器自动恢复新tablet,选出过时的服务器leader,并创建并行一致性组。
    有可能对此进行优化,并避免在只有一个磁盘发生故障时必须对整个盒子进行核对。也许我们可以依赖RAID来获得共识元数据和WAL,或者我们可以尝试将tablet备份到特定磁盘上,或者做一些其他聪明的事情。然而,这些选项并不是很好,这个问题非常棘手。

    参考链接:https://blog.csdn.net/qqqq0199181/article/details/94441573

  • 相关阅读:
    Java中基于线程池的任务调度设计
    Java中数值型,字符型及字符串的相互转换
    Java编程中必备的十种技能
    Java键盘读入方法
    Java中数据类型及运算符的注意事项
    Java抽象类是否可继承实体类
    Java多线程:start(),sleep(),yield(),join()
    Java线程静态在对象缓存中的妙用
    webAPI
    javascript中的作用域和变量提升
  • 原文地址:https://www.cnblogs.com/alisapine/p/13089408.html
Copyright © 2011-2022 走看看