HMaster/HRegion Server 工作原理
1.HBase系统架构
![](https://images2017.cnblogs.com/blog/1229957/201709/1229957-20170915105730610-843324639.png)
![](https://images2017.cnblogs.com/blog/1229957/201709/1229957-20170915152954422-2061588753.png)
2. HRegion Sever架构图
- 0.94之前的版本
- 0.96+的版本
![](https://images2017.cnblogs.com/blog/1229957/201709/1229957-20170915163131797-202342814.png)
- WAL: 即Write Ahead Log, 是HDFS上一个文件,早期版本中称为HLog,用以存储尚未进行持久化的数据。
所有写操作都会先保证将数据写入这个Log文件后,才会真正更新MemStore,最后写入HFile中。采用这种模式,可以保证HRegionServer宕机后,我们依然可以从该Log文件中读取数据,Replay所有的操作,而不至于数据丢失。这个Log文件会定期Roll出新的文件而删除旧的文件(那些已持久化到HFile中的Log可以删除)。
WAL文件存储在/hbase/WALs/${HRegionServer_Name}的目录中(在0.94之前,存储在/hbase/.logs/目录中),一般一个HRegionServer只有一个WAL实例,也就是说一个HRegionServer的所有WAL写都是串行的(就像log4j的日志写也是串行的),这当然会引起性能问题,因而在HBase 1.0之后,通过HBASE-5699实现了多个WAL并行写(MultiWAL),该实现采用HDFS的多个管道写,以单个HRegion为单位。
- BlockCache: 是一个读缓存。在内存中存放经常读的数据,提升读性能。当缓存满的时候,最近最少使用的数据(Least Recently Used data )被踢出去。
- MemStore:是一个写缓存。存储尚未写到磁盘中的数据。在写到磁盘之前,数据是经过排序的。在Region中每个column family对应一个HStore,每个HStore有一个MemStore和0到过个HFile。
- Hfiles :在磁盘上,用于存储排序后的数据行(KeyValues.)
3. HMaster/HRegion 工作原理
HRegion Server上线
HMaster通过Zookeeper来追踪HRegion Server的状态。
HRegion Server 上线时,首先在Zookeeper的server目录中创建自己的文件,并取得文件的独占锁。
由于HMaser订阅了server目录,当目录下有文件增加或者删除时,HMaster能收到来自Zookeeper的实时通知,因此当HRegion Server上线时HMaster能马上得到消息。
HRegion Server下线
HRegion server下线时,它断掉了Zookeeper的通讯,Zookeeper便会释放代表server的文件的独占锁。
HMaster轮询Zookeeper server目录下文件的独占锁。 当HMaster发现某个Region server丢失了自己的独占锁(或者HMaster与HRegion server连续几次通讯都不成功), HMaster将尝试获取该文件的读写锁,一旦获取成功,说明:
- 该HRegion server与Zookeeper通讯已经断开
- 该HResion server挂了
无论哪种情况,HMaster将删除Server目录下代表该server的文件,并将该server的所有region,并将其分配给其他或者的server。 如果HRegion server因为临时网络断开丢失了锁,并很快恢复与Zookeeper的通讯,只要代表其的文件没有被删除,它会继续尝试或许该文件的锁,一旦获取成功,它就可以接着服务
HMaster上线
HMaster启动时:
1. 从 Zookeeper中获取一个代表HMaster的锁,用以阻止其他Master成为Master
2. 扫描Zookpper中的server目录,获取HRegion server的list
3. 与2中获取的server 通讯,获取已分配的region和region server的对应关系
我的理解:
前面讲过region的encode值就是存放region的文件的目录名,这些目录位于hdfs中的hbase相关的数据目录中.
所以HMaster可以扫描这些目录获取region的信息,根据region的名字就可以从hbase:meta中获取相应的HRegion Server信息
4扫描hbase:meta表,记录尚未分配的region的信息,并添加到待分配的region列表中
HMaster下线
HMaster下线时,由于它不参与client的IO操作,所以这些操作不受影响。HMaster下线仅导致元数据的操作(比如无法创建表,无法修改表结构,无法进行负载均衡,无法进行region的合并,但是split可以进行,因为split只有HRegion server参与)受影响,用户的IO操作可以继续进行。所以短时间内的HMaster下线对HBase集群影响不大。
小结:HMaster 和HRegion Server通在Zookeeper中创建Ephemeral(临时的)节点来完成注册。
具体来说,HMaster默认在 /hbasae/master目录下创建,HRegion Server在 /hbase/rs/*下创建, 创建后通过HeartBeat来维持关系。
参考文献:
http://www.blogjava.net/DLevin/archive/2015/08/22/426877.html