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
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。
过程如图: