作者:EchoZhan
链接:https://www.jianshu.com/p/0f9578df7fbc
2.1 存储概览
a. 数据分片存储
在HBase中,一张表的数据会被分成几份,每一份数据为一个region;每个region内存储的key是连续范围内的,不同region存储的key范围不重合;这些region可能被存储在同一台机器上,也可能存储在不同的机器上。HBase作为一个分布式数据库,对数据进行分片,可以提升吞吐量。
b. HLog:Write-Ahead-Log,写操作先写日志
HLog的作用是,当一台regionServer crash了,可以利用HLog来恢复内存中未持久化到硬盘中的数据。需要注意的是,同一台server上的所有region共用一个HLog实例,因为假如每个region拥有一个独立的HLog,服务器会花费很多时间在磁盘寻道上。
c. MemStore:写缓存,每个store拥有独立的写缓存
在HBase中,所有的写操作全部写到内存中,当写缓存(MemStore)写满,再刷写(flush)到磁盘中[2],形成一个新的文件。这样做的目的,是为了高速响应那些写请求。
d. HFile:磁盘文件
在存储上,HBase完全依赖HDFS,磁盘操作是直接调用HDFS的API(HDFS在维持data locality这一点上足够智能)。另外,之前提过HBase定义列族的一个原因是为了方便存储,事实上,同一列族的数据会被写到同一文件,因为存储特性本来就是按照列族定义的。HBase的数据在底层文件中时以KeyValue键值对的形式存储的,HBase没有数据类型,HFile中存储的是字节,这些字节按字典序排列。
e. 读缓存:同一server上所有region共用
既然HBase有写缓存,相对应的应该有读缓存。与写缓存不同的是,HBase的读缓存是同一server上的所有region共用的。当HBase读取磁盘上某一条数据时,HBase会将整个HFile block[3]读到cache中[4]。因此,当client请求临近的数据时,因为临近数据已经被缓存到内存中,HBase的响应会更快,也就是说,HBase鼓励将那些相似的,会被一起查找的数据存放在一起。另外,当我们在做全表扫描时,为了不刷走读缓存中的热数据,千万记得关闭读缓存的功能。
2.3 将随机写转化成顺序写
HBase的存储是完全基于HDFS的,而HDFS的特点是不能对磁盘文件进行随机修改。因此,HBase无法对已写入磁盘文件的表记录进行随机修改,但是对于数据库来说,支持对表记录进行随机修改是基本功能。为此,HBase的方法是将随机写的操作转化成顺序写。
首先,随机的写操作转化为文件追加操作,按照时间顺序排列,client读数据时总是优先读到最新的修改。而删除操作则转化为写入一个tombstone标记,标记着早于这个tombstone时间戳的对应行所有记录作废。
显然,因为HBase总是进行文件追加,随着时间积累,文件膨胀很快。major compact的一个作用就是,真正删除所有无效的过时数据。
作者:EchoZhan
链接:https://www.jianshu.com/p/0f9578df7fbc
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:EchoZhan
链接:https://www.jianshu.com/p/0f9578df7fbc
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:EchoZhan
链接:https://www.jianshu.com/p/0f9578df7fbc
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。