本文共 2760 字,大约阅读时间需要 9 分钟。
在Hadoop 2.0之前,单点故障是一个普遍存在的问题。为了解决这一问题,开发者尝试了多种方法,包括Secondary NameNode、Backup NameNode和手动配置等。然而,这些方法都存在一定的局限性,无法在故障发生时保证数据的连续性。Facebook等大公司在这一领域积累了宝贵的经验,这些经验对Hadoop 2.0的设计有了直接的启发。
在Hadoop 2.0之前,单点故障是HDFS的主要问题之一。虽然尝试了多种方案,但都未能完全解决这一问题。例如,Secondary NameNode虽然可以缩短集群启动时间,但在主NameNode失效时无法保证数据的完整性。Backup NameNode同样存在类似问题。Facebook的解决方案——使用虚拟IP手动切换主NameNode——虽然可靠,但需要管理员干预,且无法自动切换。
单NameNode架构在集群扩展和性能上存在瓶颈。随着集群规模的扩大,NameNode的内存使用会急剧增加,成为性能的关键点。此外,元数据的读写操作也会成为集群的主要负载。Hadoop 2.0通过Federation(联邦)解决了这些问题。
在Hadoop 2.0中,HA通过ZooKeeper FailoverController(ZKFC)实现。主要设计点包括:
Federation通过多个NameService(NameService)组成一个集群,每个NameService由一个或两个NameNode组成。主要设计点包括:
Federation的优势在于:
我们的测试环境包括6个DataNode和4个NameNode,组成两个HA集群,通过Federation对外提供服务。客户端通过挂载表映射到不同的NameService。
dfs.nameservices ns1, ns2 dfs.ha.namenodes.ns1 nn1, nn3 dfs.ha.namenodes.ns2 nn2, nn4 dfs.namenode.rpc-address.ns1.nn1 host-nn1:9000 dfs.namenode.http-address.ns1.nn1 host-nn1:50070 dfs.namenode.rpc-address.ns1.nn3 host-nn3:9000 dfs.namenode.http-address.ns1.nn3 host-nn3:50070 dfs.namenode.rpc-address.ns2.nn2 host-nn2:9000 dfs.namenode.http-address.ns2.nn2 host-nn2:50070 dfs.namenode.rpc-address.ns2.nn4 host-nn4:9000 dfs.namenode.http-address.ns2.nn4 host-nn4:50070
dfs.nameservices ns1, ns2 dfs.namenode.rpc-address.ns1 host-nn1:9000 dfs.namenode.http-address.ns1 host-nn1:50070 dfs.namenode.rpc-address.ns2 host-nn2:9000 dfs.namenode.http-address.ns2 host-nn2:50070
HA测试表明:
客户端重试逻辑在org.apache.hadoop.io.retry.RetryPolicies.FailoverOnNetworkExceptionRetry中实现,支持多次重试,重试间隔随机在500-15000 ms之间。
关于15%的失败率,主要原因是Standby NameNode在切换时尝试重置文件租赁,导致LeaseExpiredException。这种安全性设计可能会影响客户端体验,但为了数据完整性,这是必要的权衡。
转载地址:http://enuk.baihongyu.com/