hbase原理解读

regionServer之zookeeper

regionServer在zookeeper上创建一个短暂的临时节点,通过一个会话session与zookeeper建立链接,zookeeper是通过heartbeat来为活跃的会话维护创建的短暂的临时节点;zookeeper留存了服务器健康状态和是否可用的信息,HMaster监视这些节点以发现可用的RegionServer以及可能的服务器故障;如果RegionServer与zookeeper之间的heartbeat失败,那么会话终止,alive master会监听着regionServer,并将它们从故障中恢复。

master HA之zookeeper

接着,HMaster也会创建一个短暂节点。Zookeeper找到第一个节点,并用它来保证只有一个master处于活跃状态。活跃的HMaster会发送heartbeat给Zookeeper;同时,不活泼的HMaster会监听着活跃HMaster故障的消息。alive master和zookeeper之间的heartbeat失败,standby master会监听到该故障,如果故障,会替补上去,进而成为alive master。

region的职责

Region负责响应用户io请求,并向hdfs读写数据,当访问数据时,客户端client会直接与regionServer建立链接,Region负责对数据的读写;

master的职责

master负责region的分配、管理用户对表的创建、删除操作;

写数据时

一个regionserver可以有多个region,建议维持1000个左右最佳,当hbase初次写入时,只有一个region,每个region共享一个WAL,会先写到WAL,一旦数据写入WAL,他们就会被放到MemStore(写数据的缓存,每个列簇一个MemStore,一个MemStore对应多个Hfile),当MemStore中数据达到最大时,会进行flush到Hfile(是StoreFile的存储格式),当某一个Hfile达到配置的阈值时或region过大或手动触发region split时,region会进行split,一旦split,就会生成两个region是父region的一半大小,会把拆分报告该master,master进行分配,可能会为了分配均衡,把region分配到其他的节点。

WAL(write ahead log)。容错机制,由于每次写数据会先写到WAL,WAL会定期滚动更新,删除以前的数据。所以,当其中一个region挂了,MemStore中的数据没有来得及持久化到磁盘,这时,master会重新该region,并从WAL中取数据。


读取数据

  • 初次读取与meta缓存

初次读数据会直接去regionserver中读,但是怎么知道去哪个regionserver中读?之前的版本时通过zookeeper中记录的root表信息,去查找root表,再根据root表中记录的meta表信息,去查询meta表,再根据meta表,去查找对应regionServer的region;现在直接根据zookeeper中记录的meta信息去查询meta表,然后去对应regionServer中查询数据,然后把meta表存到缓存中,下次直接在缓存中拿。

刚开始从缓存中拿meta信息去查找对应region时,可能会存在region miss,这是由于region split,meta中的地址记录的region分裂成另外两个region,之前的region不存在了。这使就需要再去查找meta表更新缓存,所以刚开始会不断的查询更新,但是随着时间推移,region miss的情况就会很少。

  • 读取数据的merge与Compaction

读数据时的缓存叫blockcache,会把经常查询的放进去,如果该缓存达到阈值,会删除那些查询量小的。去具体的region查询时,会先查询blockcache中的数据,然后是Memcache,如果都没有,会去Hfile中查询,这时有大量的Hfile,会影响性能,这种情况被称之为read amplification(读出放大),为了解决这种情况,引入Major Compaction,他们把每个列簇中的娇小的文件合并成一个大的Hfile,这个过程涉及到文件重写剔除等操作,会造成网络拥堵,此种现象称之为write amplification(写入放大),因此建议在网络空闲比如晚上的时候进行Major Compaction。

  • 为什么大多数教程都说在zookeeper中含有root表信息,而真实使用时在zookeeper中看到的是meta?

hbase 0.96之前是存在两个表root和meta两个表来进行查询的,zookeeper上存在一个/root的目录,里面有root表的信息,这个表规定只能有一个region,首次查询时,会根据zookeeper查询到root表的regionServer,然后会根据root表中的信息查询到meta表在哪个regionServer,最后再去对应的regionServer中查找数据;
之后就没有root表,只有meta表,在zookeeper上存在一个/meta,根据这个区对应regionServer上查找数据。

扫描二维码关注公众号,回复: 181643 查看本文章

猜你喜欢

转载自blog.csdn.net/focuson_/article/details/80229393
今日推荐