各位看官,下面跟着小二一起开始hbase原理的冒险之旅吧,坐稳了,go~
先上一张官方图片
首先指出图片的一个错误,Hlog应该属于HRegionserver的,不应该在HRegion中。
Hbase基本组件说明:
Client 包含访问HBase的接口,并维护cache来加快对HBase的访问,比如region的位置信息 Master 为Region server分配region 负责Region server的负载均衡 发现失效的Region server并重新分配其上的region 管理用户对table的增删改查操作 Region Server Regionserver维护region,处理对这些region的IO请求 Regionserver负责切分在运行过程中变得过大的region Zookeeper作用 通过选举,保证任何时候,集群中只有一个master,Master与RegionServers 启动时会向ZooKeeper注册 存贮所有Region的寻址入口 实时监控Region server的上线和下线信息。并实时通知给Master 存储HBase的schema和table元数据 Zookeeper的引入使得Master不再是单点故障 HLog 该机制用于数据的容错和恢复: 每个HRegionServer中都有一个HLog对象,HLog是一个实现Write Ahead Log的类,在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中(HLog文件格式见后续),HLog文件定期会滚动出新的,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知到,HMaster首先会处理遗留的 HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应region的目录下,然后再将失效的region重新分配,领取 到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复(Region就是StoreFiles,StoreFiles里由HFile构成,Hfile里由hbase的data块构成,一个data块里面又有很多keyvalue对,每个keyvalue里存了我们需要的值。
1.图片解释:
Client写入 -> 存入MemStore,一直到MemStore满 -> Flush成一个StoreFile,直至增长到一定阈值 -> 出发Compact合并操作 -> 多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除 -> 当StoreFiles Compact后,逐步形成越来越大的StoreFile -> 单个StoreFile大小超过一定阈值后,触发Split操作,把当前Region Split成2个Region,Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer 上。HBase只是增加数据,有所得更新和删除操作,都是在Compact阶段做的,所以,用户写操作只需要进入到内存即可立即返回,从而保证I/O高性能。
2.对应关系
Hbase为列式存储,table中所有行按照rowkwy字典顺序排列。table在行方向上分割成多个HRegion,一个HRegion对应一到多行。不同Region可以分到不同的RegionServer上(RegionServer对应着物理节点),另外同一个HRegion不会拆分到不同的RegionServer上。一个Hregion有一到多个Store组成,每个Store对应一个Columns Family。每一个Store有一个MemStore和0至多个StoreFIle组成,StoreFile以HFile存储到HDFS上
3.注意
上图中有个细节那就是HFile对应着HDFS Client,换句话说HFile是通过HDFS Client 写到HDFS上的,满足HDFS文件的所有性质
4.重点说明一下Client通过Zookeeper寻址的过程
图1:
Client访问流程 Client -> Zookeeper -> -ROOT- -> .META. -> 用户数据表 hbase 的数据字典: -ROOT- .META. 这俩表被hbase shell 的list 命令过滤掉,不显示,但是他们跟普通的hbase TABLE 是一样的。 .META. 表包含所有的用户空间region列表,同时,以及RegionServer的服务器地址,.META.也可以有多个region -ROOT- 记录.META.表的Region的路径信息,但是,-ROOT-只有一个region Zookeeper存储了-ROOT-表的地址和HMaster的地址,HRegionServer也会把自己以Ephemeral方式注册到Zookeeper中,使得HMaster可以随时感知到各个HRegionServer的健康状态(这也就是为什么官方图中zk会去连接HMaster)。 所以Client先连接zk,找到- ROOT-表的位置(meta-region-server),然后去Hbase中找到这张表根据TableName、startkey找到相应的regoninfo,从而找到相应的.META.的Region所在的Regionserver,从而找到目标表的信息,最后去访问目标表 需要注意的是:整个过程中并没有涉及到MasterServer,也就是说HBase日常的数据操作并不需要MasterServer,不会造成MasterServer的负担。 未启动hbase
启动hbase
图二:
首先是RowKey,RowKey由三部分组成:TableName, StartKey 和 TimeStamp。RowKey存储的内容我们又称之为Region的Name。 表中最主要的Family:info,info里面包含三个Column:regioninfo, server, serverstartcode。其中regioninfo就是Region的详细信息,包括StartKey, EndKey 以及每个Family的信息等等。server存储的就是管理这个Region的RegionServer的地址。 所以当Region被拆分、合并或者重新分配的时候,都需要来修改这张表的内容。