目录
高可靠性与高可用性
高可靠性也可以称为高容错性,体现在一份数据以多份副本的形式存储在datanode中,并且通过自身持续的状态监控快速检测到冗余错误,并且能够快速、自动恢复失效的组件。
可以说高可靠性是保证了datanode上的数据可靠,而普通集群中只有一个namenode,如果唯一namenode失效了,此时任何与集群有关的操作都失效了,因为namenode是唯一存储元数据与块地址映射的地方。这样的话,必须要启动一个新的namenode,并且需要拥有原namenode的文件系统元数据。所以新的namenode需要将命令空间的镜像导入到内存中,重演编辑日志文件,接受足够多的的来自datanode的数据块报告并退出安全模式。而高可靠性解决了集群中的namenode存在的单点故障。
影响集群的可用性主要在于两方面:对于计划外事件(例如计算机崩溃),在操作员重新启动NameNode之前,群集将不可用;计划维护事件(如NameNode计算机上的软件或硬件升级)将导致群集停机。
高可用性是通过在同一集群中运行两个冗余namenode,实际上这是一对活动-备用namenode,当活动namenode失效时,备用namenode会接管它的任务并开始服务来自客户端的请求,期间没有明显的中断,允许机器在崩溃时快速故障转移,解决了集群中的namenode存在的单点故障。
日志管理器QJM
为了达到高可靠性:
- 两个namenode之间需要通过日志管理器(Quorum Journal Manager)实现编辑日志文件的共享;也就是说namenode需要将客户端操作写到QJM(共享编辑日志)上而不是${hadoop.tmp.dir}/dfs/name/current下。QJM以一组日志节点(journal node)的形式运行,活动namenode的每一次编辑需要写入大多数的日志节点,同时备用namenode也不断从日志节点中读取编辑操作,并且会应用到自己的命令空间中。并且在进行故障转移时,备用namenode会重演共享编辑日志(包括了由之前活动namenode写入的条目),以实现与活动namenode的快速状态同步。
- 为了提供快速故障转移,由于块映射信息存储在namenode的内存中,所以datanode需要同时向两个namenode发送数据块处理报告和心跳
- 为了正确操作HA集群,日志节点一次只运行一个namenode(活动namenode)进行写入,否则会发生"脑裂情景",命名空间状态将在两者之间发生分歧。
- 备用namenode会为活动namenode的命名空间设置周期性检查点,也就是说辅助namenode的角色被备用namenode包含,无需再HA集群中配置Secondary NameNode。
搭建HA集群
硬件要求
- 运行Active NameNode和Standby NameNode的计算机应具有彼此相同的硬件条件
- JournalNode守护程序相对轻量级,可以运行在从节点上,必须至少有3个JournalNode守护进程,且应该运行奇数个,当使用N JournalNodes运行时,系统最多可以容忍(N-1)/ 2个故障并继续正常运行。
配置文件
hdfs-site.xml
配置名称服务的昵称
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
为名称服务配置相应的ID唯一标识符,每个名称服务最多只能配置两个NameNode