这是我参与「第四届青训营 」笔记创作活动的第13天
本次笔记重点内容
- HDFS 元数据服务的高可用
- HDFS 数据存储高可用
- HDFS 元数据服务的高扩展性
- HDFS 数据存储的高扩展性
一个“可以用”和“好用”的系统,重点就在“高可用”和“高扩展性”。
元数据服务的高可用
需求
为了应对硬件、软件、人为故障和机房断电、机房空调停机、机房网络故障等灾难的问题而设计。
高可用衡量标准
- MTTR:发现一次故障要多久来恢复
- MTTF:平均一次故障要花费的时间
- MTBF:多久系统会有一次故障
可用性年化
可用性=一年之中没有故障的时间/总共的时间,可以每周/每小时采集一次数据,灵活变化。
高可用形式
热备份,过去的服务出现故障可以立刻切到新的服务来处理;冷备份,将服务中关键的数据进行备份,然后在其他服务上面重启。
故障恢复操作
人工切换,人的反应和决策时间过长;自动切换,系统自行决策。
HDFS高可用架构
- ActiveNameNode
提供服务的 NameNode 主节点,处理Client发过来的请求,将处理的结果信息存在editlog中,生产日志(目录树和文件信息的更新)保存在高可用、高扩展性、高性能的日志系统上。 DataNode 心跳与块汇报需要同时向 ActiveNameNode 和 StandbyNameNode 上报,让两者可以同时维护块信息,但只有 ActiveNameNode 会下发 DataNode 的副本操作命令。
- StandbyNameNode
不提供服务,起备份作用的 NameNode 备节点,消费保存的日志信息,和ActiveNameNode保持状态同步,在ActiveNameNode出问题时方便切换到这。为了保证Standby不轻易要求DataNode进行一些操作,因为不能确定ActiveNameNode是什么状况,所以要Content Stale来控制。
- edit log:用户变更操作的记录,是 HDFS 的变更日志
- ZooKeeper:开源的分布式协调组件,主要功能有节点注册、主节点选举、元数据存储。
- BookKeeper:开源的日志存储组件,存储 editlog,低延迟、持久性、强一致性、读写高可用
- ZKFC:进行 HDFS NameNode 探活和自动的 主备切换
- HA Client:提供了自动切换的客户端,核心机制是StandbyException
理论基础——状态机复制和日志
状态机复制是实现容错的常规方法
状态机保存若干状态,随着外部来在内部做一些动作,状态机及其副本分布在不同节点上;变更日志,就如图中xyz值的变化,记录用户的操作对状态机产生怎么样的影响;共识协议就是所有状态机会收到相同的日志。
Quorum 协议——多副本一致性读写
基于鸽巢原理,不用等所有副本写入成功,在多个副本间确保高可用、高性能的多副本变更协议
BookKeeper Quorum 协议
基于 Quorum 的多数派思想来提供高可用、高性能写入的日志写入
如果希望可用性更好,可以把写入副本数(一次写入需要写入到的存储节点数)调高;如果希望一致性更好,可以把响应副本数(一次写入需要收到的响应数)调高。
数据存储高可用
单机存储——RAID
提高RAID功能的NAS设备,可插6个硬盘,RAID方案成本较低:
RAID方案
- RAID 0
条带化,两块盘对外同时提供服务,数据分别写在两块盘上,容量和读写吞吐量大
- RAID 1
冗余,将数据副本存储在多个磁盘上,提供高可靠
- RAID 3
容错校验,将数据按比特位分割,算出冗余的校验码,将数据的校验码存储在独立的磁盘上,根据校验码还可以反推原来缺失的数据
HDFS多副本方案——将数据块存储在多个 DataNode 上
读写路径简单,副本修复简单,从其他DataNode上拷贝一份即可,提供数据的高可用。
网络架构
- Server:一台服务器
- 机架Rack:放服务器的架子
- TOR top of rack:机架顶部(或底部)的交换机,负责机架内服务器和数据中心的其他服务器的网络通信
副本放置策略——机架感知
若服务器都放置在一个机架上,那这个机架出问题会引出很大麻烦
HDFS多机架放置,一般是三副本,一个写在本地机架,一个在远端(不同机架),一个在同一个远端的机架:
多机房实践
HDFS双机房放置设计,写入时,每个数据块在两个机房至少各有一个副本,读取时,优先读本地的副本,避免大量跨机房读取。
多机房容灾
容灾期间,限制跨机房写入和副本复制。
元数据服务的高扩展性
HDFS NameNode部署在单个机器上,内存、磁盘容量、CPU计算力都不能无限扩展。
scale up:扩容单个服务器能力
scale out:部署多个服务器来服务
- partition方案——KV模型
通过 hash 或分段的手段,将不同类型 key 的访问、存储能力分配到不同的服务器上,
blockpool——社区解决方案
解决了多个 NameNode 可能生成同一个 block id 导致 DataNode 无法区分的问题。
viewfs——社区解决方案
通过客户端配置决定某个路径的访问要发送给哪个 NameNode拷贝到另一个NameNode 集群。
小文件问题
小于一个 HDFS Block 的文件称为小文件,MapReduce的worker数量过多容易引起小文件问题。多个小文件相对于一个大文件,小文件过多,内存空间是撑不住的;I/O 变成小的随机IO,无法顺序扫描磁盘,数据访问减慢;计算任务的启动变慢。解决方案:后台任务合并小文件;shuffle service 将 shuffle 的中间数据存储在独立的服务上,聚合后再写成 HDFS 文件,可以有效缓解中间数据的小文件问题。
存储数据高扩展性
什么是长尾延迟?
占绝大多数的、重要性低的东西就是长尾,并行执行任务时,其中有一个最慢的,服务得等最慢的请求返回了才能整体响应给客户。
尾部延迟放大
访问的服务变多,尾部的请求就会越慢。
长尾问题——慢节点
读取速度过慢导致客户端阻塞的叫慢节点,其难以避免和预测。
超大集群下的数据可靠性
超大集群下,一定有部分机器是损坏的,来不及修理的,副本放置策略完全随机,每个DataNode容量足够大的情况下产生。
Copyset
将全随机的副本放置变得有规律,将DataNode分为若干个Copyset,降低了副本放置的组合数,降低副本丢失的概率。
超大集群的负载均衡和数据迁移
意义?
- 避免热点,避免慢节点问题
- 可靠性高
- 成本降低
集群的不均衡
- 节点容量不均
- 数据新旧不均
- 访问类型不均
数据迁移工具——将数据从一部分节点搬迁到另一部分节点
DistCopy
通过 MapReduce 任务来将数据从一个NameNode拷贝到另一个NameNode,网络流量较大,速度较慢
Balancer
向DataNode发起迁移命令,平衡各个DataNode容量,单机房、多机房使用