这是我参与「第四届青训营」笔记创作活动的第 10 天。
一、笔记内容
1. HDFS元数据服务的高可用
2. HDFS数据存储高可用
3. HDFS元数据服务的高扩展性
4. HDFS数据存储的高扩展性
二、HDFS元数据服务的高可用
1.高可用的需求
1.高可用的作用
高可用:系统在困境(adversity)中仍可正常工作(正确完成功能,并能达到期望的性能水准)。
故障类型:
-
硬件故障
-
软件故障
-
人为故障
灾难(数据中心级别不可用)
-
机房断电
-
机房空调停机
-
机房间网络故障、拥塞
2.高可用的衡量
-
MTTR(Mean Time To Repair) :平均修复时间,系统能多快恢复。【对应图中故障发生到恢复正常的阶段】
-
MTTF(Mean Time To Failure) :平均失效时间,运行到故障间的时间,一般用于不可修复的系统(制造业)。
-
MTBF(Mean Time Between Failures) :平均无故障时间,两次故障间的间隔,一般用于可修复的系统(软件)。
可用性的年化:
全年不可用时间
可用性99.9%,全年8.76小时不可用;
可用性 99.99%,全年52.6分钟不可用;
可用性99.999%,全年5.26分钟不可用。
3.高可用的形式
-
备份方式
-
冷备份:备份服务的数据,可以和数据归档相结合。在主服务故障时,利用备份的数据重启。
-
热备份:主服务和备服务同时运行,在主服务故障时,随时可以切换到备服务。
-
-
切换方式
-
人工切换:在故障发生时,运维人员接收报警后,手动执行服务切主操作。一般较慢,难以满足全年不可用时间的目标。
-
自动切换:通过探活组件、分布式共识协议等手段,系统能自动发现主服务的故障,并切换到备份不符。
-
人工的反应、决策时间都更长,高可用需要让系统自动决策。
HDFS的设计中,采用了中心化的元数据管理节点 NameNode。NameNode容易成为故障中的单点(single point of failure).
单点故障 SPOF:指系统中一旦失效,就会让整个系统无法运作的组件。
2.HDFS主备同步实现
1.HDFS高可用架构
1. Active NameNode:提供服务的 NameNode 主节点,生产 editlog。
2. Standby NameNode:不提供服务,起备份作用的 NameNode 备节点,消费 editlog
3. edit log:用户变更操作的记录,具有全局顺序,是 HDFS 的变更日志。
4. ZooKeeper:开源的分布式协调组件,主要功能有节点注册、主节点选举、元数据存储。
5. BookKeeper:开源的日志存储组件,存储 editlog
6. ZKFC:和 ZK、NN 通信,进行 NN 探活和自动主备切换。
7. HA Client:处理 StandbyException,在主备节点间挑选到提供服务的主节点。
2.理论基础:状态机复制和日志
状态机复制是实现容错的常规方法。
组件
-
状态机以及其副本
-
变更日志
-
共识协议
3.NameNode 状态持久化
上图为目录树和文件信息的更新;Active生产、Standby消费。
物理日志:存储了物理单元(一般是磁盘的 page)变更的日志形式。
逻辑日志:存储了逻辑变更(例如 rename /a to /b)的日志形式。
日志文件:
-
FSImage 文件:较大的状态记录文件,是某一时刻 NN 全部需要持久化的数据的记录。大小一般在GB 级别。
-
EditLog 文件:是某段时间发生的变更日志的存储文件。大小一般在 KB~MB 级别。
-
checkpoint 机制:将旧的 FSImage 和 EditLog 合并生成新的 FSImage 的流程,在完成后旧的数据可以被清理以释放空间。
4.块状态维护
DataNode Heartbeat
DataNode Block Report
区别:
-
Active既接收,也发起变更。
-
Standby只接收,不发起变更。
问题:
DataNode 心跳与块汇报需要同时向 active NameNode和 standby NameNode上报,让两者可以同时维护块信息。但只有 active NameNode会下发 DN 的副本操作命令,这可能导致数据的不一致问题。
解决问题:Content Stale状态
主备切换后,避免DN的不确定状态。
在发生主备切换后,新 active NN 会标记所有 DN 为 content stale 状态,代表该 DN 上的副本是不确定的,某些操作不能执行。直到一个 DN 完成一次全量块上报,新 active NN 才标记它退出了 content stale 状态。
3.HDFS自动主备切换
1.分布式协调组件:ZooKeeper
一般用于提供选主、协调、元数据存储
使用 ZooKeeper 的组件:
-
HDFS、YARN、HBase
-
Kafka、ClickHouse
HA核心机制:Watch
2.自动主备切换流程:Server侧
ZKFailoverController: 作为外部组件,驱动HDFS NameNode的主备切换
-
轮询探活
-
脑裂问题:因为网络隔离、进程夯住(例如 Java GC)等原因,旧的 active NN 没有完成下主,新的 active NN 就已经上主,此时会存在双主。client 的请求发给两者都可能成功,但不能保证一致性(两个 NN 状态不再同步)和持久化(只能保留一个 NN 状态)。
-
Fence机制:在新 active NN 上主并正式处理请求之前,先要确保旧 active NN 已经退出主节点的状态。一般做法是先用 RPC 状态检测,发现超时或失败则调用系统命令杀死旧 active NN 的进程。
4.日志系统 BookKeeper 简介
1.BookKeeper架构
BookKeeper存储日志
-
低延时
-
持久性强
-
一致性
-
读写高可用
2.Quorum机制
Quorum机制:多副本—致性读写
场景:多副本对象存储,用版本号标识数据新旧
规则
1. Qr + Qw > Q
2. Qw > Q / 2
3.BookKeeper Quorum
Sloppy Quorum机制
日志场景:顺序追加、只写
-
Write Quorum:写入副本数,一次写入需要写入到的存储节点数。
-
Ack Quorum:响应副本数,一次写入需要收到的响应数,小于 write quorum。
3.BookKeeper Ensemble
Ensemble 机制: 通过轮询(Round-Robin)来确认 write quorum 实际对应的存储节点实例,可以比较简单的完成副本放置和扩展。
Round-Robin Load Balancer
第一轮:1,2,3
第二轮:2,3,4
第三轮:3,4,1
第四轮:4,1,2
优势:数据均衡。
三、HDFS数据存储高可用
1.单机存储的数据高可用机制
1.单机存储:RAID
RAID(Redundant Array of Independent Disks) :将多个廉价、不可靠、低性能、容量小的磁盘组装在一起,提供高可靠、高性能、大容量逻辑磁盘服务的一组磁盘列阵方案。
特点
-
廉价
-
高性能大容量
-
高可用
RAID方案
RAID 0:条带化,将数据分块后按条带化的形式分别存储在多个磁盘上,提供大容量、高性能。
RAID 1:冗余,将数据副本存储在多个磁盘上,提供高可靠。
RAID 3:容错校验,在数据分块存储的基础上,将数据的校验码存储在独立的磁盘上,提供高可靠、高性能。
2. HDFS的数据高可用机制
1.HDFS多副本
HDFS版本的RAID 1
Hadoop的多副本放置
优点:
-
读写路径简单
-
副本修复简单
-
高可用
缺点:高成本
2.Erasure Coding
HDFS版本的RAID 2/3
业界常用Reed Solomon算法
Reed Solomon算法原理
Erasure Coding:将数据分段,通过特殊的编码方式存储额外的校验块,并条带化的组成块,存储在 DN 上。
3.HDFS Erasure Coding
HDFS版本的RAID 2
直接保存的EC和Stripe(条带化)后保存的EC
条带化和多副本比较****
优点:
-
读写速度更快
-
成本更低
-
修复速度更快
缺点:读写路径的实现更为复杂
3.考虑网络架构的数据高可用
1.网络架构
机架(Rack):放服务器的架子,将几个服务器统一供电、提供对外网络的固定的物理设备。
TOR(Top of Rack):机架顶部的交换机,架顶部(或底部)的交换机,负责机架内服务器和数据中心的其他服务器的网络通信。
数据中心(Data Center):集中部署服务器的场所,强调机房的业务属性。
机房:强调的基础设施建设,例如物理承重、空调、防水、消防。
网络拓扑图
问题:
-
—个TOR故障导致整个机架不可用;
-
降低跨rack流量
HDFS的多机架放置
4.案例:字节跳动的HDFS多机房容灾方案简介
1.字节跳动的HDFS 多机房实践
字节跳动的 HDFS集群,从单机房演进到双机房,再从双机房演进到更多的机房。
多机房解决的问题
-
容量问题
-
容灾问题
HDFS 双机房放置的设计
-
写入时,每个数据块在两个机房至少各有一个副本,数据实时写入到两个机房。
-
读取时,优先读本地的副本,避免了大量的跨机房读取。
2.多机房容灾实践
多机房部署的组件
-
ZooKeeper
-
BookKeeper
-
NameNode
-
DataNode
容灾期间的策略:
-
容灾期间,限制跨机房写入
-
容灾期间,限制跨机房副本复制
四、HDFS元数据服务的高扩展性
1.元数据扩展性挑战
HDFS NameNode是个集中式服务,部署在单个机器上,内存和磁盘的容量、CPU的计算力都不能无限扩展。
Scale Up:单机,扩容单个服务器的能力。通过单机的 CPU、内存、磁盘、网卡能力的提升来提升系统服务能力,受到机器成本和物理定律的限制。
Scale Out:多机,部署多个服务器来服务。通过让多台机器组成集群,共同对外提供服务来提升系统服务能力。一般也称为高扩展、水平扩展。
挑战
-
名字空间分裂
-
DataNode汇报
-
目录树结构本身复杂
常见的Scale Out方案:
KV模型的系统可以使用partition,partition 一般都水平分区,又称 shard。
-
Redis
-
Kafka
-
MySQL(分库分表)
水平分区:按 key 来将数据划分到不同的存储上;
垂直分区:将一份数据的不同部分拆开存储,用 key 关联起来。
三种数据路由方式
-
服务端侧
-
路由层
-
客户端则
2.社区的解决方案
1.blockpool
blockpool:将文件系统分为文件层和块存储层,对于块存储层,DN 集群对不同的 NN 提供不同的标识符,称为 block pool。
解决问题:解决DN同时服务多组NN的问题
文件服务分层
-
Namespace
-
Block Storage
用blockpool来区分DN的服务
-
数据块存储
-
心跳和块上报
2.viewfs
viewfs:邦联架构的一种实现,通过客户端配置决定某个路径的访问要发送给哪个 NN 集群。
Federation架构:将多个不同集群组合起来,对外表现像一个集群—样。
viewfs通过在client-side的配置,指定不同的目录访问不同的 NameNode。
局限性: 运维复杂,客户端配置难以更新、本身配置方式存在设计(例如,只能在同一级目录区分;已经划分的子树不能再划分)
3.字节跳动的NNProxy方案
NNProxy:ByteDance自研的HDFS代理层,提供了路由服务。主要实现了路由管理和RPC转发,以及鉴权、限流、查询缓存等额外能力。
NNProxy所在系统上下游
NNProxy路由规则保存考虑点:扩展性、运维性
路由规则的保存
NNProxy路由转发实现
目录树视图
路径最长匹配规则
1. /
2. /home/user/bob
3. /user/tiger/warehouse
4. /user/tiger/dump
4.案例:小文件问题
小文件问题(LSOF, lots of small files) :大小不到—个HDFS Block 大小的文件过。
-
NameNode瓶颈
-
1/O变小,数据访问变慢
-
计算任务启动慢
MapReduce 的 worker数量过多容易引起小文件问题
解决方案:
-
后台任务合并小文件
-
Shuffle Service
五、HDFS数据存储的高扩展性
1.超大集群的长尾问题
1.延迟的分布和长尾延迟
延迟的分布 :
-
用百分数来表示访问的延迟的统计特征
-
例如 p95延迟为1ms,代表95%的请求延迟要低于1ms,但后5%的请求延迟会大于1ms.
长尾延迟:尾部(p99/p999/p999)的延迟,衡量系统最差的请求的情况。会显著的要差于平均值。
2.尾部延迟放大
[ 木桶原理 ] 尾部延迟放大:访问的服务变多,尾部的请求就会越发的慢。
尾部延迟放大,整个服务被Backend 6拖累
确定延迟(控制变量法)
-
固定延迟阈值,访问的集群越大, 高于该延迟的请求占比越高。
-
固定延迟百分位,访问的集群越大,延迟越差。
3.长尾问题的表现:慢节点
慢节点:读取速度过慢,导致客户端阻塞。
慢节点的发生难以避免和预测
-
共享资源、后台维护活动、请求多级排队、功率限制
-
固定的损耗:机器损坏率
-
混沌现象
离线任务也会遇到长尾问题
-
全部任务完成时间取决于最慢的任务什么时候完成。
-
集群规模变大,任务的数据量变大。
-
只要任何数据块的读取受到长尾影响,整个任务就会因此停滞。
集群扩大10倍,问题扩大N(>10)倍
2.超大集群的可靠性问题
1.可靠性问题的产生
条件一:超大集群下,有一部分机器是损坏来不及修理的。
条件二:副本放置策略完全随机。
条件三:DN的容量足够大。
推论 :必然有部分数据全部副本在损坏的机器上,发生数据丢失。
叠加长尾问题,容易导致整个任务无法执行下去。
2.Copyset
将DataNode 分为若干个 Copyset选块在copyset内部选择。
原理:减少了副本放置的组合数,从而降低副本丢失的概率。
缺点:
-
数据丢失后的影响面变大;
-
修复速度变慢。
3.超大集群的不均匀问题
1.负载均衡的意义
1. 避免热点:机器热点会叠加长尾问题,少数的不均衡的热点会影响大量的任务。
2. 降低成本
-
数据越均衡,CPU、磁盘、网络的利用率越高,成本更低。
-
集群需要为数据腾挪预留的空间、带宽更少,降低了成本。
3. 可靠性
-
全速运行的机器和空置的机器,以及一会全速运行一会空置的机器,可靠性表现都有不同。负载均衡可以降低机器故障的发生。
-
同一批机器容易一起故障,数据腾挪快,机器下线快,可以提升可靠性。
2.集群的不均衡情况
数据的不均匀
-
节点容量不均匀:机器上的数据量不均衡,可能是各种复杂情况导致,归根结底是混沌现象。。
-
数据新旧不均匀:机器上的数据新旧不均匀,例如:新上线的机器,不做任何数据均衡的情况下,只会有新写入的数据。而一般新数据更容易被读取。
-
访问类型不均匀:机器上的数据访问类型不均衡,例如:机器学习训练需要反复读取数据,小 I/O 更多。而大数据场景一般只扫描一次,大 I/O 为主。这两种模式的读写比不同,I/O pattern 不同,就来带访问冷热的不同。
资源负载不均匀:机器上的访问请求吞吐、IOPS 不均衡,导致最终机器冷热不均、负载不均。一般由于容量不均、新旧不均、模式不均导致。
3.集群的不均衡情况
4.数据迁移工具速览
1.DistCopy
-
基于MapReduce,通过一个个任务,将数据从一个NameNode拷贝到另一个 NameNode。
-
需要拷贝数据,流量较大,速度较慢。
2.FastCopy
1. 开源社区的无需拷贝数据的快速元数据迁移方案
2. 前提条件:新旧集群的DN列表吻合
3. 对于元数据,直接复制目录树的结构和块信息。
4. 对于数据块,直接要求DataNode从源 BlockPool hardlink 到目标BlookPool,没有数据拷贝。
5. hardlink:直接让两个路径指向同一块数据。
3.Balancer
工具向DataNode 发起迁移命令,平衡各个DataNode的容量。
场景:
-
单机房使用、多机房使用
-
限流措施
评价标准:
-
稳定性成本
-
可运维性
-
执行效率
结语:
HDFS作为大数据离线分析场景的核心组件,高可用和高扩展性是架构设计的重中之重。
高可用确保了业务能稳定运行,HDFS上存储的数据随时可以访问。
高扩展性确保了HDFS能存储的数据星能随着资源投入无限扩展下去,业务发展不被基础组件拖累。