聊聊HBase分布式数据库设计那些事

数据模型传统的关系型数据库,一张表(table)由行(row)和列(column)组成 。相对Hbase分布式数据库却有所差别,可以把Hbase中的表理解成不同维度Map的集合 。包含以下主要概念 。

  • table
    hbase数据库中的表 。
  • row
    hbase数据库表中的行 。一张表包含多行 。每一行由row key和一个或多个column的值组成 。row key按字母表顺序排序存储 。在设计表的row key时,推荐按业务含义把相近的内容放到一起,这样可以有效地提高查询效率 。比如:一张表的row key为domain(域名)时,对应row key值最好设计成域名的倒叙值(如:org.Apache.www, org.apache.mail, org.apache.jira),hbase存储时就可以把相同根域名的值放到同一块存储区域中,查询起来更快 。row key不宜设计过大,hbase中每个值都会保存相关keys (row key, family qualifier, and timestamp) 。
  • column
    hbase数据库表中的列 。列由列族(column family)和列修饰符(column qualifier)构成 。两者通过':'符号分隔 。
  • column family
    框架性能方面的考虑,列族在物理上是多个列以及列中的相应值的集合 。列族中还会存储一些基础的元数据,比如当前列族内容是否需要缓存在内存中,row key编码规则,数据压缩方式等 。一张hbase表中的列族不宜过多,一般建议不超过3个,过多时在数据块压缩调整时会导致相互影响,从而影响性能 。
  • column qualifier
    列修饰符被加入到某个列族中,并在列族中提供索引关联列修饰符中的值 。如:列族content中的html修饰符,表示content:html;另一个修饰符pdf,则表示content:pdf 。
  • cell
    一个单元对应表中一行(row)中列族(column family)下某个列修饰符(column qualifier)的值,包含具体值和时间戳(timestamp),其中时间戳用来标识当前值所属的版本(version) 。
  • timestamp
    cell值被写入时,附带会写入相应的timestamp时间,作为该值的一个版本信息 。timestamp默认取当前RegionServer服务机器上的时间,当然你也可以自行指定时间值 。
概念视图上面数据模型介绍的概念通过以下表格可以帮助理解 。
聊聊HBase分布式数据库设计那些事

文章插图
 
将以上表格转换成json格式
聊聊HBase分布式数据库设计那些事

文章插图
 
通过以上图示,可以了解:
一个row key具有多个版本的数据,不同版本通过不同的timestamp定义 。
一个column family可以有多个column qualifier 。
row key下的column family可以为空 。
一个row key多版本数据按版本号时间倒序排列 。当查询条件不带版本号时,以倒叙顺序依次从上往下查找 。如:rowkey="com.cnn.www",列族=contents:html,返回值t6版本的值 。
NOSQL特性hbase是一个nosql数据库,相较于RDBMS,它不支持传统关系型数据库的typed columns(列类型), secondary indexes(二级索引), triggers(触发器), and advanced query languages(高级查询语言)等特性 。它的长处在数据存储,是真正意义上的分布式数据库 。通过添加RegionServer机器,即可实现hbase的线性和模块化扩展 。
Hbase具有以下特性: