
- 列式存储基于一种假设:对于特定查询,不是所有值都是必须的。列的数据是天生相似的,即便逻辑上每一行之间有轻微不同。
- HBase不是一个列式存储的数据库,但是它利用了磁盘上的列式存储格式。
- HBase比较适合键值对数据存取或有序的数据存取。
一致性模型:
- 严格一致性,数据的变化是原子的,一经改变即时生效,这是一致性的最高形式。
- 顺序一致性,每个客户端看到的数据依照它的操作执行的顺序而变化。
- 因果一致性,客户端以因果关系顺序观察到数据的改变。
- 最终一致性,在没有更新数据的一段时间里,系统将通过广播保证副本之间数据的一致性。
- 弱一致性,没有做出保证的情况下,所有更新会通过广播的形式传递,展现给不同客户端的数据顺序可能不一样。
结构
GFS\MR缺乏实时随机存取数据的能力
表、行、列和单元格
最基本的单位是列,一列或多列形成一行,并由唯一的行键来确定存储。
若干列构成一个列族,一个列族的所有列存储在同一个底层存储文件里,这个存储文件叫HFile。
列族需要在表创建时就定义好,并且不能修改得太频繁,数量不能太多。

每一列的值或单元格都有时间戳。一个单元格的不同版本的值按照降序排在一起,访问时优先读取最新值
(Table, RowKey, Family, Column, Timestamp) -> value

行数据的存取操作是原子的,可以读写任意数目的列。可以对行的状态作出安全的假设。
自动分区
- HBase中扩展和负载均衡的基本单元称为region,region本质上是以行键排序的连续存储区间。
- 每一个region只能由一台region服务器加载。
- 如果region大小超出限制,系统会在中间键处将这个region进行拆分。
存储API
-
实现
- BigTable的一种实现。
- HFile中存储的是经过排序的键值映射结构,文件内部由连续的块组成。块的索引信息存储在文件的尾部。当把HFile打开并加载到内存中时,索引信息会优先加载到内存中。
- 每次更新数据时,都会先将数据记录在提交日志中,也被称为预写日志WAL,然后再写到内存memstore。
- 一旦内存保存的写入数据累计大小超过阈值,就会将数据从内存刷写到磁盘。然后系统会丢弃预写日志。
- 存储文件是不可变更的,所以会打上删除标记来表明给定行已被删除。
- 读回数据是两部分合并的结果即磁盘上的文件和内存还没刷写的文件。数据恢复会用到WAL。
- 刷写的文件越来越多,就会执行合并,minor合并和major合并。major合并能扫描所有键值对,顺序重写全部的数据,将一个列族的若干个HFile重写为一个新HFile。

- HBase主要有3个组件,客户端库、一台主服务器、多台region服务器。
- master服务器负责跨region服务器的全局region负载均衡。轻量级服务器,仅做负载均衡集群管理。
小结
- 行键的查找以及修改是对数复杂度,极端为常数。
- 提供了行原子性操作。
- 表中每行数据只由一台服务器所服务。
- 列式存储结构允许不存储null值,可以被看作是个无限的、稀疏的表。
网友评论