HBase读写流程详细解读

HBase 写入流程:

插入一条数据到某个表,因为HBase通过Zookeeper协调
Client 首先连接Zookeeper,从Zookeeper中获取表region相关信息。
根据要插入的rowkey,获取指定的Regionserver信息,如果是批量提交的话,会把rowkey根据HRegion Location进行分组。
当得到了需要访问的Regionserver之后,Client,会向对应的Regionserver发起写请求,并将对应的数据发送到该Regionserver检查操作,看Region是不是只读状态,BlockMemorySize大小限制等。
数据写入流程,依次将数据写入MemoryStore 和HLog,只有这两个都写入成功,此次写入才算成功。
写入MemoryStore 和HLog的过程比较复杂,需要获取相关的锁,而且写入MemoryStore 和HLog是原子性的,要么都成功,要么都失败。
当写入MemoryStore的数据大小达到我们设置的阈值之后,会将MemoryStore flush 成 StroeFile文件,当StoreFile文件增长到一定数量之后,会触发 Compact合并机制,将多个StoreFile 合并为一个大的StoreFile文件,如果Region大到一定的阈值,会将Region一分为二,HBase给两个Region分配相应的Regionserver进行管理,从而分担压力。

Regionserver处理数据的输入输出请求,Regionserver管理多个Region,Region是数据存储的基本单元。
一个Region只存储一个Column Family的数据,或者一个Column Family的一部分。当Region达到一定大小之后,会根据Rowkey的排序,划分多个Region每一个Region又划分多个Store对象,每个Store对象,包括一个MemoryStore 和一个到多个StoreFile,MemoryStore是数据在内存中的实体,并且是有序的。
当有数据写入的时候,会先写入MemoryStore,当MemoryStore达到一定大小的时候会Flush到Storefile,Storefile是HFile的一层封装,HFile存储在HDFS上,所以存储到HBase中的数据最终会存储到HDFS。
那么HBase怎么保证内存中数据不会丢失,HLog 是WAL的一种实现,预写日志。他是事务中常见的一种保证一致性实现方式,每一个Regionserver都有一个HLog实例,每一个HBase的更新操作,都会先写入MemoryStore中,然后更新到HLog中,只有成功更新到HLog之后,这条数据才会更新成功。这样,就算MemoryStore中数据丢失,也可以通过HLog恢复。 注意,一般的WAL预写日志,是先写入日志,再写入内存的,而HBase是先写入内存,后写入日志,依托MVCC模式,确保数据不会丢失。

HBase读流程:

Rowkey读取为例,跟写流程一样,先跟Zookeeper简历连接,通过访问Meta Regionserver节点信息,HBase的meta表缓存到本地,获取要访问的表的Region的信息。
当Client知道要访问的表在哪个Regionserver之后,Client就对那个Regionserver 发起读请求。
Regionserver接收该读请求之后,经过复杂的处理之后,就将结果返回给客户端。
(
Regionserver先扫描自己的Memorystore,如果没有找到,就会扫描BlockCache加速读内容的缓冲区,如果还没有找到,就会到StoreFile中查找这条数据,然后将这条数据返回给client
)

通过对读写流程的描述,发现Client对HBase读写请求,跟HMaster没有任何关系,客户端只需要知道Zookeeper的地址即可。

为什么Client只需要知道Zookeeper地址就可以了呢?
HMaster启动的时候,会把Meta信息表加载到zookeeper。
Meta信息表存储了HBase所有的表,所有的Region的详细的信息,比如Region开始的key,结束的key,所在Regionserver的地址。Meta信息表就相当于一个目录,通过它,可以快速定位到数据的实际位置,所以读写数据,只需要跟Zookeeper对应的Regionserver进行交互就可以了。HMaster只需要存储Region和表的元数据信息,协调各个Regionserver,所以他的负载就小了很多。

HBase三大模块如何一起协作的。(HMaster,RegionServer,Zookeeper)
通过三个问题解释

  • 当HBase启动的时候发生了什么?
  • 如果Regionserver失效了,会发生什么?
  • 当HMaster失效后会发生什么?

1.当HBase启动的时候发生了什么?
HMaster启动的时候会连接zookeeper,将自己注册到Zookeeper,首先将自己注册到Backup Master上,因为可能会有很多的节点抢占Master,最终的Active Master要看他们抢占锁的速度。
将会把自己从Backup Master删除,成为Active Master之后,才会去实例化一些类,比如Master Filesytem,table state manager
当一个节点成为Active Master之后,他就会等待Regionserver汇报。
首先Regionserver注册Zookeeper,之后向HMaster汇报。HMaster现在手里就有一份关于Regionserver状态的清单,对各个Regionserver(包括失效的)的数据进行整理,
最后HMaster整理出了一张Meta表,这张表中记录了,所有表相关的Region,还有各个Regionserver到底负责哪些数据等等。然后将这张表,交给Zookeeper。
之后的读写请求,都只需要经过Zookeeper就行了。
Backup Master 会定期同步 Active Master信息,保证信息是最新的。

2.如果Regionserver失效了,会发生什么?
如果某一个Regionserver挂了,HMaster会把该Regionserver删除,之后将Regionserver存储的数据,分配给其他的Regionserver,将更新之后meta表,交给Zookeeper
所以当某一个Regionserver失效了,并不会对系统稳定性产生任何影响。

3.当HMaster失效后会发生什么?
如果Active 的HMaster出现故障
处于Backup状态的其他HMaster节点会推选出一个转为Active状态。
当之前出现故障的HMaster从故障中恢复,他也只能成为Backup HMaster,等待当前Active HMaster失效了,他才有机会重新成为Active HMaster

对于HA高可用集群,当Active状态的HMaster失效,会有处于Backup 的HMaster可以顶上去,集群可以继续正常运行。
如果没有配置HA,那么对于客户端的新建表,修改表结构等需求,因为新建表,修改表结构,需要HMaster来执行,会涉及meta表更新。那么 会抛出一个HMaster 不可用的异常,但是不会影响客户端正常的读写数据请求。

你可能感兴趣的:(hbase存储系统)