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集群复用,所以要唯一标识一个集群。