ZooKeeper在HBase集群中的作用

2024-09-06 20:48
文章标签 作用 集群 zookeeper hbase

本文主要是介绍ZooKeeper在HBase集群中的作用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击上方蓝色字体,选择“设为星标

回复”资源“获取更多资源

大数据技术与架构

点击右侧关注,大数据开发领域最强公众号!

暴走大数据

点击右侧关注,暴走大数据!

ZooKeeper作为分布式协调组件,在大数据领域的其他分布式组件中往往扮演着重要的辅助角色,因此我们就算不单独去研究ZooKeeper,也短不了要接触它。本文就以最典型的HBase为例,简要介绍ZooKeeper为HBase提供了哪些功能。

下图示出一个完整HBase集群的架构,其中包含ZK节点。

HMaster、RegionServer容错

当HBase集群启动成功后,会在ZK注册如下znode:

  • /hbase/master,其中包含当前活动(即赢得选举)的HMaster信息;

  • /hbase/backup-masters/[host-name],每个子znode包含当前作为热备的HMaster信息;

  • /hbase/rs/[host-name],每个子znode包含各RegionServer的信息。

所有znode都是临时(ephemeral)节点,HMaster和RegionServer通过心跳维护这些znode。活动HMaster对/hbase/rs路径下的znode注册监听,当有RegionServer失败时,心跳信号消失,超时过后其对应的znode被删除,HMaster即可感知到RegionServer下线,并将该RegionServer持有的Region重新路由到其他服务器上去。同理,所有热备HMaster都对/hbase/master节点注册监听,当前HMaster挂掉后,该znode被删除,即可触发重新选举HMaster。如下图所示。

Log Split管理

当RegionServer宕机时,除了重新路由Region之外,还得从宕机的RegionServer的WAL(即HLog)中恢复尚未持久化到HFile的数据。为了保证尽快完成failover过程,HBase会将HLog按Region切分成多个分片,并分配给对应的存活RegionServer再完成重放(replay)过程。如下图所示。

显然,Log Split的信息需要有一个中心组件来统一协调。HMaster会在ZK上注册/hbase/splitlog临时节点,其中存放有存活RegionServer与其应该处理的Region HLog的映射关系。各个RegionServer从该节点得到分配的Region,重放HLog,并将结果写回该节点,以通知HMaster进行后续操作。

.META.表位置维护

HBase中有一个特殊的表.META.(在0.98版本之前还有一个-ROOT-表,现已废弃,不再介绍),其中以类似B树的结构记录了集群内所有Region的位置信息,且该表不会split。而ZK通过永久(persistent)节点/hbase/meta-region-server来记录.META.表保存在哪个RegionServer上。

当客户端初次与HBase集群建立连接时,它首先查询上述ZK节点,再从持有.META.表的RegionServer获取到RowKey对应的Region位置信息并缓存起来,最后获取到对应的行做读写操作。如下图所示。

如果Region被移动,或客户端缓存失效,甚至.META.表所在的服务器故障,客户端总能通过ZK维护的路径获得正确的Region位置,不会造成不一致。

Replication管理

HBase的Replication是比较高级的功能,用于主集群和从集群之间的数据同步,从而支持容灾和备份。开启Replication之后,主集群会将数据实时地推送给各个从集群(可以是异步、同步或串行的),且保证数据的最终一致性。整个Replication的状态信息都储存在ZK的/hbase/replication这个znode下,主要有以下三个:

  • /hbase/replication/state:布尔值,表示Replication是否被启用;

  • /hbase/replication/peers:当前进行Replication的从集群对及其状态。每个peer会分配一个唯一ID;

  • /hbase/replication/rs:包含主集群上所有有效的RegionServer、 HLog文件的索引,以及HLog读取的偏移量。

主集群HMaster每次将新增的数据推送给从集群之后,就会更新ZK上记录的这些信息,以协调Replication的进度。

多个HBase集群是可以共用一个ZK集群的。只需要修改HBase的zookeeper.znode.parent参数,对不同集群指定不同的ZK根路径即可,例如/hbase-cluster1、/hbase-cluster2,etc。

欢迎点赞+收藏+转发朋友圈素质三连

文章不错?点个【在看】吧! ????

这篇关于ZooKeeper在HBase集群中的作用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143085

相关文章

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

zookeeper端口说明及介绍

《zookeeper端口说明及介绍》:本文主要介绍zookeeper端口说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、zookeeper有三个端口(可以修改)aVNMqvZ二、3个端口的作用三、部署时注意总China编程结一、zookeeper有三个端口(可以

Jenkins分布式集群配置方式

《Jenkins分布式集群配置方式》:本文主要介绍Jenkins分布式集群配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装jenkins2.配置集群总结Jenkins是一个开源项目,它提供了一个容易使用的持续集成系统,并且提供了大量的plugin满

java中反射Reflection的4个作用详解

《java中反射Reflection的4个作用详解》反射Reflection是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作,本文将详细介绍... 目录作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断

python常用的正则表达式及作用

《python常用的正则表达式及作用》正则表达式是处理字符串的强大工具,Python通过re模块提供正则表达式支持,本文给大家介绍python常用的正则表达式及作用详解,感兴趣的朋友跟随小编一起看看吧... 目录python常用正则表达式及作用基本匹配模式常用正则表达式示例常用量词边界匹配分组和捕获常用re

Java 继承和多态的作用及好处

《Java继承和多态的作用及好处》文章讲解Java继承与多态的概念、语法及应用,继承通过extends复用父类成员,减少冗余;多态实现方法重写与向上转型,提升灵活性与代码复用性,动态绑定降低圈复杂度... 目录1. 继承1.1 什么是继承1.2 继承的作用和好处1.3 继承的语法1.4 子类访问父类里面的成

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

SpringBoot连接Redis集群教程

《SpringBoot连接Redis集群教程》:本文主要介绍SpringBoot连接Redis集群教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 依赖2. 修改配置文件3. 创建RedisClusterConfig4. 测试总结1. 依赖 <de

SpringBoot 中 CommandLineRunner的作用示例详解

《SpringBoot中CommandLineRunner的作用示例详解》SpringBoot提供的一种简单的实现方案就是添加一个model并实现CommandLineRunner接口,实现功能的... 目录1、CommandLineRunnerSpringBoot中CommandLineRunner的作用