Hadoop之HA高可用性

HA存在的背景:

Hadoop之HA高可用性_第1张图片

Hadoop之HA高可用性_第2张图片



HA的工作原理图:

Hadoop之HA高可用性_第3张图片

HDFS HA高可用性
1、active namenode对外提供服务和standby namenode时刻待机准备的
2、保证两个namenode任何时候都是元数据同步的
3、standby namenode同样需要去读取fsimage和edits文件
-》edits变化后的数据文件同样也是需要实时同步的
4、如何同步日志信息
cloudera公司提出一个方案,分布式存储日志文件
编辑日志文件写入,一写写多份,结合之前讲解的ZK的2n+1的概念
策略:写多份,再读取,前提条件节点数目必须是奇数个
active namenode和standby namenode有一块共享存储日志的区域
5、JounralNode日志节点:专门管理编辑日志文件的

        -》QJM全称是Quorum Journal Manager, 由JournalNode(JN)组成,一般是奇数点结点组成。每个JournalNode对外有一个简易的RPC接口,以供NameNode读写EditLog到JN本地磁盘。当写EditLog时,NameNode会同时向所有JournalNode并行写文件,只要有N/2+1结点写成功则认为此次写操作成功,遵循Paxos协议。
-》注意在HA的架构下,就不需要secondarynamenode了
-》JN日志节点是一个轻量级的,所以可以和Hadoop的其他守护线程放在一起
6、datanode需要向standby namenode实时汇报块的状态信息
7、如何帮助客户端判断HDFS正在提供服务的namenode
-》通过代理的方式判断
8、在任何时刻下,必须要保证只有一个namenode对外提供服务
-》当两个namenode启动以后,由ZK来完成选举,选举出一个active namenode
-》隔离机制

JournalNodes:

Hadoop之HA高可用性_第4张图片

主备切换机制:

Hadoop之HA高可用性_第5张图片

从图中可以看出,整个切换过程是由ZKFC来控制的,具体又可分为HealthMonitor、ZKFailoverController和ActiveStandbyElector三个组件。

Hadoop之HA高可用性_第6张图片

  • ZKFailoverController: 是HealthMontior和ActiveStandbyElector的母体,执行具体的切换操作
  • HealthMonitor: 监控NameNode健康状态,若状态异常会触发回调ZKFailoverController进行自动主备切换
  • ActiveStandbyElector: 通知ZK执行主备选举,若ZK完成变更,会回调ZKFailoverController相应方法进行主备状态切换

在故障切换期间,ZooKeeper主要是发挥什么作用呢,有以下几点:

  • 失败保护:集群中每一个NameNode都会在ZooKeeper维护一个持久的session,机器一旦挂掉,session就会过期,故障迁移就会触发
  • Active NameNode选择:ZooKeeper有一个选择ActiveNN的机制,一旦现有的ANN宕机,其他NameNode可以向ZooKeeper申请排他成为下一个Active节点
  • 防脑裂: ZK本身是强一致和高可用的,可以用它来保证同一时刻只有一个活动节点

那在哪些场景会触发自动切换呢,从HDFS-2185中归纳了以下几个场景:

  • ActiveNN JVM奔溃:ANN上HealthMonitor状态上报会有连接超时异常,HealthMonitor会触发状态迁移至SERVICE_NOT_RESPONDING, 然后ANN上的ZKFC会退出选举,SNN上的ZKFC会获得Active Lock, 作相应隔离后成为Active结点。
  • ActiveNN JVM冻结:这个是JVM没奔溃,但也无法响应,同奔溃一样,会触发自动切换。
  • ActiveNN 机器宕机:此时ActiveStandbyElector会失去同ZK的心跳,会话超时,SNN上的ZKFC会通知ZK删除ANN的活动锁,作相应隔离后完成主备切换。
  • ActiveNN 健康状态异常: 此时HealthMonitor会收到一个HealthCheckFailedException,并触发自动切换。
  • Active ZKFC奔溃:虽然ZKFC是一个独立的进程,但因设计简单也容易出问题,一旦ZKFC进程挂掉,虽然此时NameNode是OK的,但系统也认为需要切换,此时SNN会发一个请求到ANN要求ANN放弃主结点位置,ANN收到请求后,会触发完成自动切换。
  • ZooKeeper奔溃:如果ZK奔溃了,主备NN上的ZKFC都会感知断连,此时主备NN会进入一个NeutralMode模式,同时不改变主备NN的状态,继续发挥作用,只不过此时,如果ANN也故障了,那集群无法发挥Failover, 也就不可用了,所以对于此种场景,ZK一般是不允许挂掉到多台,至少要有N/2+1台保持服务才算是安全的。
归纳起来主要是两块:元数据同步和主备选举。元数据同步依赖于QJM共享存储,主备选举依赖于ZKFC和Zookeeper。




HDFS HA架构部署
1、准备
一个完全分布式的Hadoop环境
一个完全分布式的zookeeper环境
为了保证出错可以恢复,建议重新备份一份完全分布式的环境
2、在配置之前,先关闭整个集群的所有服务
3、修改hdfs-site.xml文件
-》将secondarynamenode参数删除,不需要
-》给namenode管理的元数据空间起一个逻辑名称

 dfs.nameservices
 ns1


-》指定两个namenode的逻辑名称

 dfs.ha.namenodes.ns1
 nn1,nn2


-》指定两个namenode的实例,RPC内部通信,监听地址

 dfs.namenode.rpc-address.ns1.nn1
 bigdata-01.yushu.com:8020


 dfs.namenode.rpc-address.ns1.nn2
 bigdata-02.yushu.com:8020


-》指定两个namenode的实例,http监听地址

 dfs.namenode.http-address.ns1.nn1
 bigdata-01.yushu.com:50070


 dfs.namenode.http-address.ns1.nn2
 bigdata-02.yushu.com:50070


-》指定journalnode日志节点的uri

 dfs.namenode.shared.edits.dir
 qjournal://bigdata-01.yushu.com:8485;bigdata-02.yushu.com:8485;bigdata-03.yushu.com:8485/ns1


-》指定JN本地存储日志的路径

dfs.journalnode.edits.dir
/opt/app/moduels/hadoop-2.5.0/data/dfs/jn



       ->>配置代理

dfs.client.failover.proxy.provider.ns1
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider


-》指定选择哪个隔离的方案,选择SSH

 dfs.ha.fencing.methods
 sshfence




 dfs.ha.fencing.ssh.private-key-files
 /home/ds/.ssh/id_rsa


-》指定是否开启自动故障转移功能

  dfs.ha.automatic-failover.enabled
  true



-》修改core-site.xml文件,指定ZK的实例和端口号

  ha.zookeeper.quorum
  bigdata-01.yushu.com:2181,bigdata-02.yushu.com:2181,bigdata-03.yushu.com:2181

 
-》指定管理的命名空间

fs.defaultFS
hdfs://ns1

4、将配置文件分发到各个节点上
$ scp -r etc/hadoop/ bigdata-02.yushu.com:/opt/app/hadoop-2.5.0/etc/
$ scp -r etc/hadoop/ bigdata-03.yushu.com:/opt/app/hadoop-2.5.0/etc/


5、首先先启动所有节点的ZK
bin/zkServer.sh start
6、再启动所有节点的JN
$ sbin/hadoop-daemon.sh start journalnode
7、如果是一个新的集群那么需要首次格式化namenode,如果不是新的集群可以不用
bin/hdfs namenode -format
只需要格式化一台,因为两个namenode管理的是同一个元数据空间
注意:先启动第一台的namenode再操作下面的元数据同步
sbin/hadoop-daemon.sh start namenode
8、同步元数据
切换到第二台的namenode机器,执行元数据的同步
可以使用bin/hdfs namenode -help参数查看shell命令
$ bin/hdfs namenode -bootstrapStandby
启动三台机器的 datanode  sbin/hadoop-daemon.sh start datanode
9、先暂时停掉两台namenode服务进程
10、ZKFC监听器
DFSZKFailoverController
11、初始化ZKFC
$ bin/hdfs zkfc -formatZK
进入ZK的客户端,检查是否生产了hadoop-ha的节点目录
12、在两台namenode所在的机器去分别启动ZKFC监听器
$ sbin/hadoop-daemon.sh start zkfc
13、启动两台 namenode


总结流程:
1、ZKFC监控namenode的状态(active状态的)
2、ZKFC链接zookeeper,进行选举,在后续的阶段中保持心跳
3、另一个ZKFC也会去监控对应的namenode
4、ZKFC链接zookeeper,进行选举,在后续的阶段中保持心跳
5、active namenode出现异常
6、ZKFC会在监控周期中检测到active失效,触发故障切换的流程
7、ZKFC记录失败的active的信息,去通知standby的ZKFC
8、standby的ZKFC接收到通信,进入切换流程,首先进行隔离,确保失效的active隔离在集群外
9、ZKFC进行选举,确认自己成为新的active节点
10、选举后,通知本机从standby切换到了active,然后正式接管集群,相应外部请求处理任务



你可能感兴趣的:(大数据)