HDFS架构及高可用

一. HDFS
1.流式数据:关注数据的时效性,数据一点一点的流过来,一点一点的处理,而不是积攒起来一起处理。
2.hdfs的基础结构:client,namenode,datanode,secondarynamenode四部分组成。

client:
	 - 文件切分
	 - 从NameNode获取文件的位置信息
	 - 在DataNode读写数据
	 - 通过命令/api访问HDFS
namenode:
	 - 管理HDFS的名称空间
	 - 管理数据块的映射信息
	 - 配置副本策略
	 - 处理客户端请求
datanode:
	 - 实际的存储位置
	 - 执行数据块的读写操作
secondarynamenode:
	 - 辅助NameNode,分担工作量
	 - 定期合并Edits和fsimage文件,推送到Namenode
	 - 可用来恢复namenode

3.三个重要概念:block,package,chunk

block:datanode上存储的基本单位
package:数据传输的基本单位
chunk:用于校验

4.hdfs如何保证数据的安全性

hdfs对写入的数据进行计算校验和,对读取的数据验证校验和。
写数据校验不通过,hdfs机制会抛出异常并触发重试写入操作;读数据校验不通过,会通知namenode已损坏的数据库及所在的datanode,并抛出异常,然后将该数据块的一个副本复制到另一个datanode,删除已损坏的数据块,这样数据块的副本因子恢复。

5.hdfs的四大机制

	心跳机制
	安全模式
	副本机制
		IBM关于hdfs副本放置策略的研究及优化:https://www.ibm.com/developerworks/cn/data/library/bd-1505-hdfs-uilbps-optimize/index.html#N100EF
		策略:一般情况下复制因子是3,第一个副本放在本地节点上,第二个放在本地机架上的另一个节点上,第三个副本放在不同的机架的节点上。
		目的:同一节点提高了写的性能,不同机架保证了数据的可靠性和可用性。
		缺陷:
			1.数据中心中只有一个机架,数据的可靠性就无法保证。
			2.同一个节点可能会被持续的写数据,导致负载较高。
			3.如果有更多的副本,采用随机选择的策略。
		优化:
			
	负载均衡

6.hdfs的HA
高可用架构的几个部分:
参考连接

 1. Active NameNode和Standby NameNode
 2. 主备切换控制器ZKFailoverController
 3. Zookeeper集群
 4. 共享存储系统
 5. DataNode

HDFS架构及高可用
NameNode主备切换的实现

 1. HealthMonitor初始化完成后会启动内部线程循环调用NameNode的HAServiceProtocol RPC接口,检测其健康状态,并将状态通过回调的方式通知ZKFailoverController。
 2. 如果返回的状态是SERVICE_HEALTHY(节点状态健康),则ZKFailoerController调用ActiveStandbyElector的joinElector方法发起一次主备选举;如果不是该状态,就会调用quitElector的方法删除当前已经在Zookeeper上建立的临时节点推出主备选举。
 3. ActiveStandbyElector与Zookeeper交互完成自动的主备选举:
 	Zookeeper的leader选举(以三台server为例):
 	[参考连接](https://blog.csdn.net/gaoshan12345678910/article/details/67638657)
 	(1)每个server发出一个投票,投票包含所推举服务器的myid和ZXID,表示为(myid,ZXID),server1(1,0),server2(2,0),并将投票发给集群的其他机器。
 	(2)接受来自各个服务器的投票
 	(3)处理投票:将其他服务器的投票与自己的PK——先比ZXID,如相同再比myid,较大的为leader。
 	(4)统计投票:每次投票后,服务器都要判断是否已经有过半机器接收到相同的投票信息。如有,则选出的leader即为该集群leader。
 	(5)改变服务器状态:将选举出的服务器改为LEAING,其余为FOLLOWING
 4. ActiveStandbyElector选举情况:
 	(1)成功:回调ZKFailoverController的becomeActive方法(通过调用HAServiceProtocol RPC的transitionToActive方法),将NameNode转换为Active状态。
 	(2)失败:回调ZKFailoverController的becomeStandby方法(通过调用HAServiceProtocol RPC的transitionToStandby方法),将NameNode转换为Standby状态。
 	(3) 成功但是上一个主节点依然存活:ActiveStandbyElector会回调ZKFailoverController注册的fenceOldActive方法,对旧的Active NameNode进行fencing,首先会调用这个旧的Active NameNode的HAServiceProtocol RPC的transitionToStandby方法,将其转换为Standby状态,若失败,就只想Hadoop配置文件中预定义的隔离措施——sshfence:通过SSH登录到目标机器上,执行fuser将对应的进程杀死;shellfence:执行一个用户自定义的shell脚本将对应的进程隔离。该种情况只有在成功执行完fencing后,才会将新的NameNode的状态转换为Active。

过程如图:
HDFS架构及高可用