HBase系列(二)、架构原理
本篇内容介绍Hbase的架构原理。为Hbase系列的第二篇。HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase可在廉价服务器上搭建起大规模结构化存储集群。是Apache软件基金会的Hadoop项目的一部分,运行于HDFS文件系统之上,因此可以容错地存储海量稀疏的数据。HBase是一个开源的非关系型分布式数据库(NoSQL),它参考了谷歌的BigTable建模,使用Ja
目录
HBase系列:
架构
架构角色:
- Client:访问Hbase的接口,并维护Cache加速RegionServer的访问;
- Master:是RegionServer 的管理者,负责:
- 为RegionServer分配region;
- 负责RegionServer的负载均衡和故障转移;
- 处理表的操作请求(create,delete,alter);
- RegionServer:是Region 的管理者,负责:
- 维护master分配的region;
- 处理对这些region的IO请求(增删改查,put,get,delete);
- 负责Region的切分合并(splitRegion,compactRegion);
- Region:类似数据库的表,不同的是,Hbase定义表的时候只需要声明列族即可,不需要声明具体的列。这意味着,往 HBase 写入数据时,字段可以动态、按需指定。因此,和关系型数据库相比,HBase 能够轻松应对字段变更的场景。同时,一个HBase表中可以有1~n个Region。默认一个Region超过10GB(参数:hbase.hregion.max.filesize)就要进行切分,切分过程由RegionServer管理,而Region的分配由Master管理。
- Zookeeper:负责Master 的高可用,RegionServer 的监控,Region元数据的入口以及集群配置的维护等工作。
- HDFS:为HBase 提供底层数据存储服务,同时为 HBase 提供数据高可用的支持;
- Store:HBase表按照列族将同一列族内的数据存储在同一个文件夹内,按照Region将表进行横向切片,经过这两种切分之后得到的store就是真实存储数据的文件,该数据存储在HDFS内。
- StoreFile:保存实际数据的物理文件,StoreFile 以 HFile 的形式存储在 HDFS 上。每个 Store 中会有一个或多个StoreFile(HFile),数据在每个 StoreFile 中都是有序的。
- MemStore:写缓存,由于 HFile 中的数据要求是有序的,所以数据是先存储在 MemStore 中,排好序后,等满足flush策略才会刷写到 HFile,每次刷写都会形成一个新的 HFile。
- HLog:数据要经 MemStore 排序后才能刷写到 HFile,但把数据保存在内存中有可能会因各种原因导致数据丢失,因此数据会先写在一个叫做 WAL(Write-Ahead Logfile)的文件中,然后再写入 MemStore 中。当系统出现故障的时候,数据可以通过这个日志文件进行回放保证数据不丢失。
可以看出,Client访问HBase上的数据时并不需要Master参与,而是从zk中找到Region 的入口然后与RegionServer 通讯提交数据增删改查的请求,Master 仅维护Table 和Region 的元数据信息,处理表结构的变更请求。 HRegionServer存取一个子表时,会创建一个HRegion对象,然后对表的每个列族创建一个Store 实例,每个Store 都会有一个MemStore 和0个或多个StoreFile 与之对应,每个StoreFile都会对应一个HFile, HFile就是在HDFS上实际的存储文件。因此,一个HRegion 有多少个列族就有多少个Store,一个HRegionServer会有多个HRegion和一个HLog。
高可用机制
上面提到HBase通过ZooKeeper协调集群所有节点的共享信息,在HMaster 和HRegionServer 连接到ZooKeeper后创建临时Znode节点,并使用心跳机制维持这个节点的存活状态,如果某个临时节点失效,则HMaster会收到通知,并做相应的处理。
除了在HDFS存储数据,HBase还在Zookeeper中存储一些管理信息:
- /hbase/root-region-server :Root Region的位置(0.96版本后弃用)
- /hbase/table/-ROOT-:根元数据信息(0.96版本后弃用)
- /hbase/meta-region-server:元数据存储的RegionServer地址,Hbase读取数据的时候都要先在zookeeper中获取元数据,并且会把部分缓存在本地
- /hbase/master:Hbase集群中的高可用,当前活跃的Master;
- /hbase/backup-masters:Hbase集群中的高可用,备选的Master;
- /hbase/namespace:命名空间;
- /hbase/table:集群中所有表信息;
- /hbase/table-lock:表锁,在对一张表做DDL操作时,充当分布式表锁,保证DDL操作的顺序;
- /hbase/rs:集群中所运行的RegionServer;
- /hbase/online-snapshot:快照操作;
Master容错:
前面也提到由于增删改查并不需要Master参与,因此当HBase中没有Master时,不会影响数据的增删改查,但会影响Reguin的切分和负载均衡以及表结构变更等操作。同时ZK会重新选举新的Master接替上一个Master的工作。
RegionServer容错:
RS定时向ZK发送心跳,当发生故障时,Master会将该RS上的Region重新分配到其他RS上以保证数据安全和可用性。
Zookeeper容错:
Zookeeper本身是一个一致性协调服务,一般配置3个以上奇数个服务,详细请参考:Zookeeper系列(二)、核心原理
WAL预写日志:
数据要经 MemStore 排序后才能刷写到 HFile,但把数据保存在内存中有可能会因各种原因导致数据丢失,因此数据会先写在一个叫做 WAL(Write-Ahead Logfile)的文件中,然后再写入 MemStore 中。当系统出现故障的时候,数据可以通过这个日志文件进行回放保证数据不丢失。
在一个RegionServer上的所有的Region共享一个HLog,一次数据的提交是先写WAL,写入成功后,再写memstore。当memstore值到达一定阈值,就会形成一个个StoreFile(HFile)。
希望本文对你有帮助,请点个赞鼓励一下作者吧~ 谢谢!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)