hadoop3.x ha高可用-QJM解决方案、ZKFailoverController、Fencing隔离机制、Journal Node同步数据 作者:马育民 • 2021-10-24 16:49 • 阅读:10604 # QJM解决方案 QJM全称 Quorum Journal Manager(仲裁日志管理器),是Hadoop **官方推荐** 的HDFS HA解决方案之一。 - 使用zookeeper中ZKFC来实现主备切换; - 使用Journal Node(JN)集群实现edits log的共享以达到数据同步的目的 [](https://www.malaoshi.top/upload/pic/hadoop/qjm.png) # 主备切换的实现 - ZKFailoverController(zkfc) ZK Failover Controller(ZKFC)是一个ZooKeeper客户端。 ### Apache ZooKeeper 是一款高可用分布式协调服务软件,用于维护少量的协调数据。 Zookeeper的下列特性功能参与了HDFS的HA解决方案中: - 临时znode 如果一个znode节点是临时的,那么该znode的生命周期将和创建它的客户端的session绑定。客户端断开连接session结束,znode将会被自动删除。 - Path路径唯一性 zookeeper中维持了一份类似目录树的数据结构。每个节点称之为Znode。Znode具有唯一性,不会重名。也可以理解为排他性。 - 监听机制 客户端可以针对znode上发生的事件设置监听,当事件发生触发条件,zk服务会把事件通知给设置监听的客户端。 ### ZKFailoverController(ZKFC) [](https://www.malaoshi.top/upload/pic/hadoop/ZKFailoverController.png) 是一个ZooKeeper客户端。 运行 `NameNode` 的每台计算机也都运行 `ZKFC`,主要职责: - 监视和管理 `NameNode` 健康状态 ZKFC通过命令定期ping本地负责监视的NameNode节点。 - 维持和 `ZooKeeper` 集群联系 如果本地 `NameNode` 运行状况良好,并且 `ZKFC` 看到当前没有其他节点持有锁 `znode`,它将自己尝试获取该锁。如果成功,则表明它 `赢得了选举` ,并负责运行故障转移以使其本地 `NameNode` 处于 `Active` 状态。 如果已经有其他节点持有锁,**zkfc选举失败**,则会对该节点注册监听,等待下次继续选举。 ### ZKFailoverController 的缺点 如果 `ZKFC` 出现问题,会造成 多个 `NN` 都在运行 如:左侧的 `NN Active` 正常运行,但 左侧 `ZKFC` 出现问题,说 该 `NN` 出现故障,此时,右侧的 `NN Standby` 就会变成 `NN Active` ,那就会发生脑裂问题 ### Fencing隔离机制 避免 脑裂问题 `Fencing` 机制来避免 脑裂问题,将先前的 `Active` 节点 杀死,然后将本地 `NameNode` 转换为 `Active` 状态。 Hadoop公共库中对外提供了两种 `fenching` 实现: - `sshfence`:通过ssh登陆目标节点上,使用命令 `fuser` 将进程杀死(通过tcp端口号定位进程pid,该方法比 `jps` 命令更准确) - `shellfence`(缺省实现),执行一个用户事先定义的shell命令(脚本)完成隔离 # 主备数据同步 - Journal Node [](https://www.malaoshi.top/upload/pic/hadoop/JournalNode.png) **Journal Node**(JN)集群是 **轻量级** **分布式系统**,主要用于 **高速** 读写数据、存储数据。 通常使用 `2N+1` 台 `JournalNode` 存储共享 `Edits Log`(编辑日志)。 任何修改操作在 `Active NN` 上执行时,`JournalNode` 进程同时也会记录 `edits log` 到 **至少半数以上** 的JN中,这时 `Standby NN` 监测到 `JN` 里面的同步 `log` 发生变化了会读取`JN` 里面的 `edits log`,然后重演操作记录同步到自己的目录镜像树里面. 当发生故障 `Active NN` 挂掉后,`Standby NN` 会在它成为 `Active NN` 前,读取所有的 `JN` 里面的 `edits log`,这样就能高可靠的保证与挂掉的 `NN` 的目录镜像树一致,然后无缝的接替它的职责,维护来自客户端请求,从而达到一个高可用的目的。 原文出处:/show_1IX26KeAQn5B.html