phoenix row key设计

结合需求进行row key设计

HBase基础

  • Table:同传统数据库中的表是类似的,但他的不同之处在于它是基于SchemaLess的设计,比传统数据库表更加灵活。

  • Region:将表横向切割成一个个子表,从而实现分布式的存储,子表在HBase中称作Region,它关联了数据的一个区间。

  • Column Family:HBase可以将一行数据分成不同列的集合,这些列的集合称为Column Family,不同的Column Family文件被存储在不同的路径中。

  • RegionServer:指HBase里面数据服务的进程,每个Region必须要分到RegionServer上才能提供正常的读写服务。

  • MemStore:用来在内存中缓存一定大小的数据,达到一定大小后批量写入到底层文件系统中。

  • HFile:HBase数据在底层分布式文件系统中的文件组织格式。

HBase 存储结构

存储的逻辑视图如下

|rowkey |  column family1   |  colume family2  |
------------------------------------------------
|       | column1 |colume2  |  column3 |column4|
|rowkey1| t:cell  |t:cell   |  t:cell  |t:cell |
  • Row key :表的主键,按照字典序排序。
  • cf:在 HBase 中,列簇将表进行横向切割。
  • column:属于某一个列簇,在 HBase 中可以进行动态的添加。
  • cell : 是指具体的 Value 。
  • Version(t):这个是指版本号,用时间戳(TimeStamp )来表示。

hbase是kv数据库,那么key是如何构成的?

 |rowkey|cf|colume|timestamp|value| 同一个KEY可以有多个版本的Value值(可以通过配置来设置多少个版本)。查询的话是默认取回最新版本的那条数据,但是也可以进行查询多个版本号的数据,在接下来的进阶操作文章中会有演示。

row key 作用

读写数据时通过RowKey路由到对应的Region,MemStore中的数据按RowKey排序,HFile中的数据按RowKey排序。

row key设计原则

了解完HBase的存储结构,进入主题。

  • RowKey长度原则:设计定长,越短越好。
  • RowKey散列原则:为了避免查询热点问题,不建议将单调递增的时间字段放在RowKey的首位。(非要使用的话可以采用时间戳倒序的方式)
  • RowKey唯一原则:保证唯一

保证这几个原则的前提下根据实际的需求表的特点进行RowKey设计。

加盐表,数据倒序,哈希

加盐表:加盐的原理是对RowKey添加一个散列的前缀,计算公式如下:

new_row_key = ((byte) (hash(key) % BUCKETS_NUMBER) + original_key

数据倒序:类似时间这样递增有序的字段,可以通过数据反转,使其失去有序,产生随机性。

哈希: 将RowKey的部分或者全部值进行hash。以此打乱原有RowKey的有序。

Life is more than the present.