紧急扩散!HDFS3.X 系列的 EC 纠删码策略有个安全隐患 HDFS-16420,极端情况下会造成数据丢失!
1. HDFS-16420 BUG 概述
HDFS3.X 的 EC 纠删码功能,近期被发现有个 BUG:该 BUG 会导致,以纠删码机制存放的目录和文件,在某些特殊情况下,会被系统误删,从而造成数据丢失。
目前 HADOOP 社区已经通过 HDFS-16420 在版本 3.4.0/3.2.3/ 3.3.2 中修复了该 BUG,Cloudera 针对该 BUG 也给出了详细的分析和修复建议:
2. HDFS-16420 BUG 原因
该 BUG 的根本原因是,当前 NameNode 在判断某些 block 块是否有多余 replica 副本,并进而删除这些多余的 replica 副本的算法逻辑有问题,会误删某些使用了纠删码策略的文件的 EC block 块。
比如在 NameNode 发生了 fail over 之后不久,就运行了 hdfs balancer 负载均衡操作, 或者 recommission 重新上线了原先退役的某些 datanodes 节点,都有可能会造成某些 EC block 在同一个 rack 机架上有多个副本,即 over-replicated。
此时由于上述 BUG,某些 EC BLOCK 的多余的副本和原始的副本,都有可能会被错误删除。
当然在大多数情况下,上述 BUG 并不会造成用户数据的丢失,因为 HDFS 能检测到 ec block 副本的丢失,并从 ec 剩余的 data block 和 parity block 重新构建生成丢失的 ec block 副本,以补全 block。
但是,如果短时间内,某个 ec block group 中的多个 ec block,都发生了上述被误删除的问题的话,HDFS 就无法从剩余的 ec block 重新构建补全丢失的 block 了, 比如 采用 RS(6,3) 纠删码策略时,如果短时间内 9 个 block 中的 4 个或 4 个以上的 block 都丢失了的话,就没有办法重新构建补全丢失的 block 了,就会造成用户数据的丢失,从而造成大的影响。
3. 受 HDFS-16420 BUG 影响的 HDFS 版本
当前所有没有上线上述 HDFS-16420 修复代码的基于 hadoop 3.x 系列的 HDFS,都有此 BUG, 包括 CDH 6.1.x/6.2.x/6.3.x, HDP 3.1.x,CDP Private Cloud Base 7.1.x,等等;
当然,如果客户使用了上述有问题的 HDFS 版本,但没有启用 EC 纠删码策略,则完全不会受此 BUG 影响;
只有在使用了上述有问题的 HDFS 版本,且配置了某些目录使用 EC 纠删码策略时,才可能会受此 BUG 影响;
用户可以使用以下 fsck 命令来检查,集群中是否配置某些目录使用了 EC 纠删码策略,并确认是否有些 EC file 有 missing blocks,从而判断,是否已经收到了上述 BUG 的影响,进而造成了用户数据的丢失,示例命令和输出如下:
4. HDFS-16420 BUG 修复方案
如果使用的是商业版的大数据平台,可以咨询供应商如何修复,一般供应商会提供升级修复或 hot-fix 修复;
如果使用的是开源的大数据平台,可以升级到已经修复了该 BUG 的版本,如:3.4.0/3.2.3/3.3.2;
如果使用的是开源的大数据平台,且暂时不方便升级版本的话,可以 cherry-pick HDFS-16420 改动的源代码,并编译修复;
最后强调下,如果集群中没有目录使用 EC 纠删码策略,则不会受到上述 BUG 影响。
版权声明: 本文为 InfoQ 作者【明哥的IT随笔】的原创文章。
原文链接:【http://xie.infoq.cn/article/68d7165d5c28d0953cfd5d7ad】。文章转载请联系作者。
评论