这是我参与「第四届青训营 」笔记创作活动的的第9天
一、元数据服务高可用
1.高可用的需求
高可用的需求
- 故障类型:硬件/软件/人为
- 灾难:数据中心级别不可用:比如机房断电;空调停机;机房之间的网络故障或者拥塞
故障不可避免,灾难时有发生
如果HDFS系统不可用:
- 无法核算广告账单,直接引发收入损失
- 无法生产数据报表,数据驱动无从谈起
- 无法进行模型训练,引起用户体验下滑
业务停止的损失极大,所以HDFS系统的高可用性就至关重要。
-
服务可用性指标:
- MTTR:故障恢复时间
- MTTF:平均无故障时间
- MTBF:两次故障时间
-
可用性:A=MTBF(MTBF+MTTR)\frac{MTBF}{(MTBF+MTTR)}(MTBF+MTTR)MTBF
- 可用性 99.9% 全年8.76小时不可用
- 可用性 99.99% 全年53.6分钟不可用
- 可用性 99.99% 全年5.26分钟不可用
-
服务高可用:
- 冷备份:备份服务的数据,可以和数据归档相结合。在主服务故障时,利用备份的数据重启。
- 热备份:主服务和备服务同时运行,在主服务故障时,随时可以切换到备服务。
-
故障恢复:人工切换和自动切换
人工的反应、决策时间都更长,高可用需要让系统自动决策。
HDFS的设计中,采用了中心化的元数据管理节点NameNode,NameNode容易成为故障中的单点(single point of failure)。
1.2 HDFS 的高可用架构
组件介绍:
- Active NameNode:提供服务的 NameNode 主节点,提供服务,生产 editlog。
- Standby NameNode:不提供服务,起备份作用的 NameNode 备节点,消费 editlog
- editlog:用户变更操作的记录,具有全局顺序,是 HDFS 的变更日志。
- ZooKeeper:开源的分布式协调组件,主要功能有节点注册、主节点选举、元数据存储。为自动选主提供统一协调服务
- BookKeeper:开源的日志存储组件,存储 editlog
- ZKFC:和 ZK、NN 通信,进行 NameNode 探活和自动主备切换。
- HA Client:处理 StandbyException,在主备节点间挑选到提供服务的主节点。
- EditLog:操作的日志 三个问题
- 节点状态如何更新
- 操作日志如何同步
- 如何做到自动切换
理论基础
-
状态机复制和日志:实现容错的常规方法
- 状态机及其副本,变更日志,共识协议
-
NameNode操作日志的生产消费:active生产,standy消费
- 将状态持久化,存FSImage文件,代表整个目录树,子节点,父节点,块的id;EditLog存在分布式系统上,一开始Active和Standby不想立即应用到FSIamge,会将日志临时保存成本地的变更日志,会在后台任务中定期合并得到更新的FSIamge。
-
块状态维护:active既接收也发起变更,要求DataNode做一些传递或者删除块操作;standy消费只接受,不发起变更;不通过日志系统做更新,有一致性问题。
- Content State状态:主备切换后,新上任的Active也就是原来的Standby不可以做操作,要等待一次块上报,避免DN的不确定状态
1.3 自动主备切换——zooKeeper
-
watch:允许多个 client 一起监听一个 znode 的状态变更,并在状态变化时收到一条消息回调(callback)
-
server侧:ZKFailoverController作为外部组件,驱动HDFS NameNode的主备切换
- 处理方式:轮训探活,避免脑裂,fence机制(阻止多个节点写同样的日志)
-
client侧:StandbyException,Client自动处理