原则
- CAP
- 技术背景,要解决的问题
- 优势和劣势
- 适用场景
- 核心思想,关键点(副本恢复及其带宽问题/数据分布均衡/负载均衡/集群伸缩/通信)
- 底层原理
- 已有实现及其对比
行动
技术背景,目标
- 高可用,面向硬件故障设计的HDFS,故障检测,快速和自动恢复是HDFS最主要的设计目标。
- 高吞吐,可适当牺牲延时。主要场景是数据批处理,非交互式。
- 大规模集群,数据量巨大,不仅单个集群的文件数量很多,而且单个文件巨大(>1TB)
适用场景
- 商用机器,低配置机器
- 大规模集群
- 数据批处理,写少读多
优势和劣势
- 劣势:namenode单点,不支持多用户写,不适合低时延场景
- 优势:面向故障设计,大规模集群
核心思想
- 架构:主从架构,
- 主节点:namenode 负责命名空间和元数据管理,控制从节点
- 从节点:datanode 存储真实文件和处理客户端读写请求,执行namenode的创建/删除/复制指令
- 数据复制
- 心跳heartbeat:datanode定期发送心跳给namenode,代表自己正常工作
- 块报告blockreport:datanode发送自己的块列表
a. replica placement:三副本为例,一副本在rack1,两副本在rack2,可以提高写性能而且不会影响数据可靠性。
b. replica selection:就近读取,同地域优先,好处是降低带宽。
- 元数据持久化
- Editlog:事务日志,记录变更
- FSImage:元数据,包括ns和blockmap
- 高可用
- 数据失败,network partition:心跳检测,故障时进行重新复制
- 集群伸缩:副本移动,未做完
- 元数据故障:editLog和FSImage多副本
- 数据完整性:客户端分块校验
底层原理
- 通信协议
- rpc:客户端协议和dataNode协议,客户端和dataNode是rpc请求发起者,nameNode是rpc请求响应者
- 数据组织
- 分块存储,不同块可以在不同节点上,突破单个节点的存储限制
- staging/buffer:客户端暂存部分文件,达到一定大小后才和namenode通信。客户端buffer,增加吞吐量。
- 复制流水线:客户端 -> dataNode1 -> dataNode2 -> dataNode3 块粒度复制
已有实现和对比
- GFS,是HDFS的增强版,允许多个客户端append文件
- TFS,是blob FS,适合小文件存储;元数据巨大,一般存储不了,内存仅存储id,真实元数据映射到外部数据库。