作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

图片

中间件,我给它的定义就是为了实现某系业务功能依赖的软件,包括如下部分:

Web服务器

代理服务器

ZooKeeper

Kafka

RabbitMQ

Hadoop HDFS(本章节)

前面3个小节,我们介绍了单机情况下的HDFS的3个组件,其中nn和dn无论单机还是集群都是需要的,而2nn则只在单机下才有用,后面几个我们将介绍高可用集群模式涉及到的几个组件:JournalNode,ZKFailoverController(ZKFC),本小节介绍:ZKFC。

ZKFC(ZooKeeper Failover Controller)是 Hadoop 中用于实现 HDFS(Hadoop Distributed File System)高可用性(HA)的关键组件之一,它主要负责监控 NameNode 的状态,并在必要时进行故障转移操作。以下是关于它的详细介绍。

基本原理

ZKFC 依赖于 ZooKeeper 的一些特性来实现其功能,具体如下:

  • 可靠存储与强一致性:ZooKeeper 能够可靠地存储小量数据,并提供强一致性保证,这使得 ZKFC 可以依赖它来存储和获取 NameNode 的状态等关键信息。
  • 临时节点:ZooKeeper 中的临时节点(ephemeral node)在创建它的客户端关闭后会自动删除。ZKFC 利用这一特性来实现对 Active NameNode 的选举和状态管理。
  • 事件通知:ZooKeeper 可以为节点状态的变化提供异步通知(watcher)。ZKFC 通过注册 watcher 来及时获取 NameNode 相关节点的状态变化,从而做出相应的处理。

主要模块

  • ZKFailoverController(DFSZKFailoverController):是 ZKFC 的核心驱动模块,它通过向 HealthMonitor 和 ActiveStandbyElector 注册回调函数,来订阅这两个模块的事件,并根据事件做出相应的处理,比如触发故障转移等操作。
  • HealthMonitor:主要职责是定期检查 NameNode 的健康状况。它会通过 RPC 方式周期性地调用 HAServiceProtocol 接口的 monitorHealth 方法来获取 NameNode 的状态信息。当 NameNode 的健康状况发生变化时,会通过回调函数将变化通知给 ZKFailoverController。
  • ActiveStandbyElector:用于管理 NameNode 在 ZooKeeper 上的状态。它通过 ZooKeeper 来判断哪个 NameNode 可以成为 Active 状态,具体方式是看哪个 NameNode 能够成功创建一个特定的临时锁文件(znode),成功创建的那个就成为 Active NameNode,其他的则为 Standby NameNode。同时,它会监控 ZooKeeper 上对应节点的状态变化,并将变化通知给 ZKFailoverController。
  • FailoverController:提供了进行优雅故障转移的相关功能。管理员可以通过命令行工具手工发起故障转移,此时 FailoverController 就会负责执行一系列的操作,来确保故障转移的顺利进行。

系统架构

通常情况下,NameNode 和 ZKFC 会部署在同一台物理机器上。其中,HealthMonitor、FailoverController、ActiveStandbyElector 等模块都在 ZKFC 这个 JVM 进程中,而 NameNode 则是一个单独的 JVM 进程。ZKFC 在系统中具有以下重要作用:

  • 监控与抢锁:向 ZooKeeper 尝试获取锁,成功抢到锁的 ZKFC 会让对应的 NameNode 成为 Active NameNode。同时,它会监控锁对应的 znode,当当前 Active NameNode 状态发生变化导致失锁时,会及时尝试再次抢锁,以让自己对应的 NameNode 成为 Active 状态。
  • 监控 NameNode 状态:定期检查对应 NameNode 的活性和健康状况,一旦发现 NameNode 的状态出现异常,就会通过自身的机制进行相应的处理,比如触发故障转移等。
  • 隔离其他 NameNode:当本地的 NameNode 要成为 Active NameNode 时,需要先对其他的 NameNode 进行隔离(fence)操作,确保不会同时出现多个 Active NameNode,从而保证系统的一致性和稳定性。

线程模型

ZKFC 的线程模型相对比较简单,主要包括以下三类线程:

  • 主线程:在启动所有的服务后,就进入循环等待状态,主要用于协调和管理其他线程和模块的运行。
  • HealthMonitor 线程:是一个单独的线程,它会定期向 NameNode 发送请求包,以检查 NameNode 的健康状况。当 NameNode 的状态发生变化时,该线程会回调 ZKFailoverController 注册的回调函数,通知其状态变化情况。
  • ZooKeeper 客户端线程:负责与 ZooKeeper 进行交互,通过调用 ZooKeeper 客户端 API 来监控 ZooKeeper 上节点的状态变化。当节点状态发生变化时,会回调 ZKFailoverController 的回调函数,让其做出相应的处理。

总之,ZKFC 在 Hadoop 的 HDFS 高可用架构中起着至关重要的作用,它通过与 ZooKeeper 的紧密配合,实现了对 NameNode 的健康监控和自动故障转移,确保了 HDFS 集群能够在 NameNode 出现故障时依然保持高可用性,为大数据处理提供了稳定的基础存储环境。

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐