HBa学习之路——HBa底层机制简单总结
前⾔南岳衡山在哪里
经过前⾯的学习了解,我们可以明确HBa是为了适应⼤容量数据交互和多类型数据存储⽽产⽣的列式存储数据库,数据类型为key-value,所有的数据属性都表现在列族上,可以说列族是HBa表中的最关键数据模型。
⼀般在完全分布式集群中,集群中的slave服务器⼀般为HBa存储数据的RegionServer,每⼀个RegionServer可以有多个
Region,Region中存储多⾏的数据,(master与RegionServer间的管理调⽤通过ZooKeeper集群管理器进⾏)数据最终存储在HDFS 中。
在HBa中,基本的数据模型是表table,⾏键rowkey,列族column family,列column qualifier,单元格cell,时间戳timestamp,版本号version(⼀般不特别说明的话,version为数据存储的时间,如果特别指定version,则为当前数据的版本号。在HDFS中单元格的数据是按照version排序的,⽽version是以字典顺序为依据进⾏排序,也即version11在version1和version2间;⾏键同理,row11在row1和row2之间)
存储数据机制拌和
此处参考《HBa不睡觉书》,按照数据存储的过程来讲解HBa存储数据的架构机制。
1. 宏观架构
葵花籽吃多了有什么坏处>牡蛎蒸多久
如上图所⽰,HBa中的最重要的就是Master和RegionServer,其中⼀半Master为1-2个(2个⼀般是使⽤HA模式,⼀个作为候补机),多个RegionServer,⼀般⼀个slave为⼀个RegionServer,⼀个RegionServer上⼀般有多个Region,Region中存储⼀⾏⾏的数据,⽽数据最终存储在HDFS中。
HBa中有⾃带的ZooKeeper,⽬的在于管理master和regionrver间的任务调度,当需要进⾏表操作时,master在zookeeper中注册⽣成⼀个ssion,zookeeper检查regionrver中健康的空闲的选择master表操作的对象,同时监控表操作的整个过程。当任务结束或者任务宕机⽣成的ssion会⾃动被删除,进⾏下⼀步操作(zookeeper等待下⼀次注册/重新选择健康的regionrver并重复原过程)。
在客户端和服务端的交互中,客户端发出数据操作请求,请求发送给zookeeper,zookeeper根据情况处理任务。
需要注意的是,和⼀般的产品不同,HBa集群中,master宕机并不会造成巨⼤的损失,因为regionrver依旧可以⼯作,因为master主要是表删除新建数据需要,普通的数据查询更新是直接在regionrver上进⾏的。这点设计也是为hba⾼效⼯作和宕机处理提供很好的缓冲时间。但如果将zookeeper关掉,就不能读数据了,因为读取数据所需要的元数据表hba:meta存储在zookeeper上。
2. RegionServer
在RegionServer中很重要的也是设计的特别棒的⼀个产品就是WAL。Write-Ahead-Log,预写⽇志,顾名思义。当数据到达RegionServer时,先写⼊WAL,之后会先存于Region中的MetaStore进⾏排序,此处为内存存储,当内存容量到达⼀个阀值时,会根据LSM算法刷写(flush)到HFile中。在这个过程中,如果服务器宕机或者其他事件,数据丢失了,可以及时从WAL⽇志中找回并继续进⾏写操作从⽽恢复数据,WAL是⼀个保险机制。更细⼀步讲,WAL是⼀个环状的滚动⽇志结构,写⼊效率很⾼,并且可保证空间不会持续变⼤。
优容在Region中,都有起始rowkey和终⽌rowkey,代表其存储的row范围,可存储多个列族,这也体现了HBa数据表⽰⾏分散的,row间没啥联系,⽽⼀般⼀个store存储⼀个列族。
WAL是存储在HDFS上的,MemStore是存储在内存中的,HFile是存储在HDFS上的。之所以最终存储HDFS上的数据是从MemStore中来的,⽽⾮⼀开始写⼊的WAL,是因为HDFS只⽀持创建、追加和删除,不⽀持修改,⽽对于⼀个数据库⽽⾔,顺序存储是⼀件⾮常重要的事,所以就提前在进⼊HDFS之前在MemStore中排完序⽣成LSM树(Log Structured Merge Tree,可以提⾼写性能,适⽤于写多读少的场景),每次刷写⽣成⼀个新的HFile,存储在HDFS上,实现HDFS中表数据按rowkey有序存储。由此也可以知道MemStore存在的意义是维持数据按照rowkey顺序排列,⽽不是做⼀个缓存。
在读取的过程中,如果直接读内存的话过于低效率,所以⼜设计了⼀个缓冲区BlockCache,先在BlockStore中找,找不到去MemStore,再找不到去存于磁盘的HDFS上寻找。特别需要注意的是,⼀个RegionServer只有⼀个BlockCache
3. HFile
HFile是数据存储的 实际载体,我们创建的表、列等数据都最终存储在HFile中,HFile是有⼀个个的块组成的,⼀个块的默认⼤⼩为64KB,是在列族上BLOCKSIZE属性定义的。
Data为数据块,每个HFile中有多个Data块,存储HBa表中的数据。
Meta为元数据块,只有在HFile⽂件关闭的时候才会写⼊,存储了该HFile⽂件的元数据信息。
FileInfo是⽂件信息,只有在HFile⽂件关闭时写⼊,存储⽂件的信息例如最后⼀个Key等信息。
DataIndex存储Data索引信息,也即Data块的偏移值offt,有Data才会有DataIndex
MetaIndex存储Meta索引信息,有Meta才会有MetaIndex
Trailer存储了FileInfo、DataIndex、MetaIndex块的偏移值,是HFile中必需的
4. Data
BlockType Cell(KeyValue)Cell Cell……
Data块中先有的是块类型BlockType,后⾯存储很多的KeyValue键值对,也即Hba数据表中的单元格的实现类,需要了解的是,Cell是⼀个接⼝,KeyValue是其实现类。
对于Data中存储的是⼀个列族中某⼀⾏的某⼀单元格的数据,BlockType为单元格数据的属性,每⼀个Cell为⼀个version的数据。所以HFile中的Data为⼀个或多个row的所有单元格的数据。
5. Key-Value
Key Len Value Len Row Len Row CF Len CF Col TimeStamp Key Type Value
KeyValue中是存储数据的Value,是⼀个Cell下表⽰⼀个Verison的Value值,其余块是这个Value相关的信息,例如列族信息(长度、名字),列信息(名字),⾏信息(⾏长度、⾏名字),key信息(类型、长度),时间戳等。
⾄此,HBa的存储结构由宏观到不可再分割的KeyValue结束,完美~\(≧▽≦)/~
6. 数据写⼊过程
在总结完HBa数据存储结构后,来写⼀个数据写⼊过程具体体会HBa惊艳的存储结构。
需要注意的是,存于WAL的数据是不能直接读取和使⽤的。HFile是真正数据最终存储的位置,是持久化写⼊磁盘中的,即使宕机也不会丢失数据的。
全球化时代7. 数据读出过程
在前⾯也提到过,读取数据会先从BlockCache中查询,如果查不到,会在MemStore和HFile中扫描查询。HBa⽀持Scan操作,在Scan 扫描时会创建StoreScanner实例,会将MemStore和HFile结合起来扫描,的那个StoreScanner打开时会先定位于⼀个STARTROW上,然后按row顺序扫描直到找到⽬标数据。Scan会把所有符合条件的StoreScanner扫描之后会把⽬标数据返回给Client,同时将Block块缓存到BlockCache中去。
拓展补充
HBa不⽀持表间关联,不⽀持Windows系统,⽀持ACID(Atomicity原⼦性、Consistency⼀致性、Isolation隔离性、Durability持久性)。在HBa中,表命名空间Namespace主要是为了把多个属于相同业务领域的表分成⼀个组,创建使⽤create 'mytable:table1',
'mycf1' 需要注意的是在HBa中创建新表,⾄少需要跟⼀个列族
如果之前接触过数据库表的设计的话,我们会有⼀个好的认知,数据不需要的时候不会直接删除,⽽是借⽤某⼀个boolean数据的属性值将其禁⽌掉即可,以避免因为表间紧密的关联删除数据引起不可估计的蝴蝶效应。那么在HBa中也是有这样的机制的,表现在数据的删除和修改,⼀般来讲新增⼀个数据那在HDFS上对应新增⼀个数据⽆可反驳。Hba在数据修改和删除也是在HDFS上新增⼀条数据,修改时新增的数据只是版本号⽐修改前的⼤⽽已,删除时HDFS还是新增⼀个数据,只是没有Value,类型为DELETE,这样的数据也被称为Tombstone墓碑标记。真正删除在于HBa每隔⼀段时间的合并操作Compaction,在合并中将有⽤的数据重新记录,剩下的真正删除掉,这也印证了HDFS上只能新增更新修改,不能删除。
总结生态文明建设论文
和平的名言学习当循序渐进,学会总结,相信⽔滴⽯穿,加油↖(^ω^)↗