Zookeeper在hbase中的作用

zk在Hbase中的作用

我们知道Hbase集群中主要组件有Hmaster,RegionServer 和 Zookeeper。Hbase强依赖于zk。
在HBase中,ZooKeeper在 Masters 和 RegionServers 之间协调、通信和共享状态。HBase 的设计策略是仅将 ZooKeeper 用于瞬态数据(即用于协调和状态通信)。
在这里插入图片描述

因此,如果HBase的ZooKeeper数据被删除,只会影响临时操作——数据可以继续写入/读取 HBase。

Zookeeper集群在Hbase集群中主要作用有如下几个:

[zk: localhost:2181(CONNECTED) 1] ls /hbase

[meta-region-server, rs, splitWAL, backup-masters, table-lock, flush-table-proc, master-maintenance, online-snapshot, switch,
master, running, draining, namespace, rsgroup, hbaseid, table]

(1)维护管理了Hbase相关元数据信息

ZK中meta-region-server节点维护hbase的meta表所在的节点信息。

Hbase集群中会维护着一个meta表,这个表存储着Hbase集群所有region的相关信息,包括region所在RegionServer节点,region的rowkey范围,以及region所在表名,列值等信息。

注意:
(1)这个bhase:meta表其实就是一个表的形式存储在hbase中的,只是这个表只有一个region,不切分;

(2)一般这个表region不大,比如一个集群几十万个region的hbase,其meta表也只有几百兆的大小。

这个hbase:meta表或者说这个region也会存储在hbase节点上,具体存储在哪个节点上我们需要维护一下,这件事就是ZK干的。(因为是region就可能因为RegionServer的挂掉,负载均衡等移动位置。Hmaster在启动时会将hbase:meta表加载到ZK集群)。
所以用户CRUD表时需要先去ZK上找到这个hbase:meta元数据表存在哪个节点上,然后在去跟这个节点通信,获取对应的元数据信息。

向Hbase中写数据流程如下:

在这里插入图片描述

1、Client先访问zookeeper,获取hbase:meta表位于哪个Region Server。

2、访问对应的Region Server,获取hbase:meta表,根据读请求的namespace:table/rowkey,查询出目标数据位于哪个Region Server中的哪个Region中。并将该table的region信息以及meta表的位置信息缓存在客户端的meta cache,方便下次访问。

3、与目标Region Server进行通讯;

4、将数据顺序写入(追加)到WAL;

5、将数据写入对应的MemStore,数据会在MemStore进行排序;

6、向客户端发送ack;

7、等达到MemStore的刷写时机后,将数据刷写到HFile。

从Hbase中读取数据流程如下:

在这里插入图片描述

1、Client先访问zookeeper,获取hbase:meta表位于哪个Region Server。

2、访问对应的Region Server,获取hbase:meta表,根据读请求的namespace:table/rowkey,查询出目标数据位于哪个Region Server中的哪个Region中。并将该table的region信息以及meta表的位置信息缓存在客户端的meta cache,方便下次访问。

3、与目标Region Server进行通讯;

4、分别在Block Cache(读缓存),MemStore和Store File(HFile)中查询目标数据,并将查到的所有数据进行合并。

5、将查询到的数据块(Block,HFile数据存储单元,默认大小为64KB)缓存到Block Cache。

6、将合并后的最终结果返回给客户端。

我们在zk上get /hbase/meta-region-server,看下,会发现habse:meta表存储在一个节点上。

(2)实现Hmaster节点的高可用管理,HA

[zk: localhost:2181(CONNECTED) 10] ls /hbase/backup-masters

 
 
  • 1

记录集群中备份Master的节点信息,当Master挂了后故障转移使用的,比如主master挂了,zookeeper就会通过选举机制,从备master中选举出来一个当主master角色。

(3)对集群所有RegionServer状态监控,宕机后会通知Hmaster;每个RS启动时都会在ZK上注册,然后master会去监控这个znode

[zk: localhost:2181(CONNECTED) 7] ls /hbase/rs

 
 
  • 1

rs就保存了hbase集群中的所有存活RegionServer的节点,RS每个节点在启动时会去该/hbase/rs目录下注册,注册一个属于自己的临时节点。如果节点超时,就会被清理,Hmaster也会去监听状态,这样RS下线就会知道,好将对应的region转移走。

(4)分布式一致锁的提供,保证数据写入的事务性,表的删除,新建,更新需要维护全局锁

[zk: localhost:2181(CONNECTED) 12] get  /hbase/table-lock

 
 
  • 1

Zookeeper在分布式系统中的一大核心作用就是提供了分布式锁,保证每次操作的事务性。

我们都知道Hbase中表的存储是分布式存储的,一张表分多个region存储在不同的RegionServer上,那么如果我们通过多个客户端同时操作一个表,如何在分布式的情况下保证表数据的准确性呢?所以客户端每次在对表的DDL之前都需要先获取表的全局锁,防止多个操作互相冲突。最终实现单次操作的原子性,要么都成功,要么都失败,进而保证分布式数据的准确性。而这个分布式全局锁的提供者就是zookeeper。

(5)其他

1、 flush-table-proc

这个很重要,存放了Hbase集群中所有表信息。

[zk: localhost:2181(CONNECTED) 18] ls /hbase/table

 
 
  • 1

2、namespace

namespace类似于mysql中的数据库概念,在hbase中主要区分多租户时做表空间的逻辑隔离;

[zk: localhost:2181(CONNECTED) 26] ls /hbase/namespace

 
 
  • 1

3、 draining/hbaseid

draining用于通过创建具有serverName,port,startCode形式的子znode,就是/habse/rs下的子节点信息

这使您可以停用多个 RegionServers,而不会存在将区域临时移动到稍后将停用的 RegionServer 的风险。

hbaseid其实就hbase集群的唯一标识符。因为我们可以将一个zk集群共享,供多个hbase集群复用,所以要唯一标识一个集群。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值