hdfs如何保证高可用

16次阅读
没有评论

这篇文章将为大家详细讲解有关 hdfs 如何保证高可用,丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

hdfs 如何保证高可用

hdfs 如何保证高可用

从上图中我们可以看到,启动的时候,主备选举是利用 zookeeper 来实现的,hdfs  namenode 节点上的 ZKFailoverController 进程,主要负责控制主备切换,监控 namenode 进程是否还活着,连接 zookeeper 进行选举,并且控制本机的 namenode 的行为,如果发现 zookeeper 的锁节点还没有被抢占创建,就创建锁节点,并把本机的 namenode 变成 active 节点,如果发现锁节点已经创建,就把 本机的 namenode 变成 standby 节点。

如果 ZKFailoverController 发现本机的 namenode 已经挂掉了,就删除 zookeeper 上的节点,standby 上的 ZKFailoverController 感知到删除事件,就升级本机的 namenode 成为主节点。

如果 active 节点超过 Zookeeper Session Timeout 参数配置的时间没有连接 zookeeper,同样被认为主节点已经挂了,standby 节点也会升级成为主节点

hdfs 如何进行主备切换

hdfs 如何保证高可用

与单机文件系统相似,HDFS 对文件系统的目录结构也是按照树状结构维护,Namespace 保存了目录树及每个目录 / 文件节点的属性。除在内存常驻外,这部分数据会定期 flush 到持久化设备上,生成一个新的 FsImage 文件,方便 NameNode 发生重启时,从 FsImage 及时恢复整个 Namespace。

上图我们可以看到基于 journalnode 进行共享元数据, jounalnode 中保存着 editlog,也就是对文件元数据的操作日志,比如用户(hdfs dfs rm /a.txt)删除一个文件,就产生了一条操作日志,作用到命名空间后,a.txt 这个文件就被干掉了,这个日志就类似于数据库中的 redo 日志,standby 节点 周期性的从 journalnode 中拉取 editlog,然后从上一次 checkpoint 的位置开始重放,在内存中将操作结果合并到老的 fsimage(命名空间),  并更新 checkpoint 位置。最后把合并后的 fsimage 上传到 active namenode 保存替换老的 fsimage 文件,

NameNode 处于 active 和 standby 状态时候,扮演的角色是很不同的,

active 角色,把用户对命名空间的操作作为 editlog 写入 journalnode 集群

standby 角色,EditLogTailer 线程 从 journalnode 上拉取 editlog 日志,StandbyCheckpointer 线程把 editlog 合并到 fsimage,然后把 fsimage 文件上传到 active namenode 节点

active 挂的时候, standby 感知后,转换为 active 角色,生成一个新的 epoch(就是每次主备切换就加一,表明现在谁是老大,在谁的任期内),因为 standby 是阶段性拉取 editlog 的,所以肯定最新的一段 editlog 还没有作用于 fsimage,需要拉取重放,因为写 editlog 到 journal 的时候,只要大多数(比如总 5 个点,要成功写入 3 个点,总共 3 个点,要成功写入 2 个点)写入成功就认为成功了,这样在拉取恢复的时候,各个 journalnode 节点上的数据有可能不一致,这时候就必须找到大多数里面 事务 id 最大的点作为基准,这个事务 id 就类似于数据库中的 Log sequence number(简称 LSN),简单来讲,就是要把 上一次 checkpoint 的(LSN)到 redo 日志里面最大的(LSN)这之间的 日志进行重放 redo,合并到 fsimage。

假设一种情况,  老的 active 节点,是因为网络问题,连接不上 zookeeper,然后被认为已经死了,其实是假死,这时候网络恢复了,还认为自己是 leader,往 journalnode 里面写 editlog 日志,发现现在已经是别人的天下了(epoch number 已经加 1 了),自己的 epoch number 已经过时了,就把自己降级为 standby,做 standby 角色该干的事情。

为什么要在 secondnamnode 上合并,主要是为了减轻 namenode 的压力,namenode 有很多其他的事情要干呢。

操作

hadoop-daemon.sh start journalnode,启动  journalnode 集群,会根据你配置文件里面配置的机器上去启动 journalnode 集群

hdfs namenode -format,  格式化 namenode 命名空间

hadoop-daemon.sh start namenode,nn1 上启动 namenode

hdfs namenode -bootstrapStandby, nn2 同步 nn1 的元数据信息,会把主节点上的 fsimage editlog 目录拷贝过来

hadoop-daemon.sh start namenode, nn2 上启动 namenode

启动 zk 集群  hdfs zkfc -formatZK 格式化 zkfc zk 中的目录  hadoop-daemon.sh start zkfc   各个 namenode 节点上启动 dfszk failover controller, 先在哪台机器上启动,哪台就是 active namenode

hadoop-daemon.sh start datanode 上传文件 测试 读写文件

测试  ha 将 active namenode 进程 kill,   jps   进程号,kill,    将 active namenode 机器断开网络  service network stop

我们对集群进行以上的测试,观察日志,会发现 hdfs 干的事情基本上就是前面描写的流程。

关于“hdfs 如何保证高可用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。