数据模型

介绍

Pegasus 的数据模型非常简单,就是 Key-Value 模型,不支持复杂的 Schema。但是为了增强其表达能力,Key被分裂为 HashKeySortKey,即组合键(composite key, [HashKey, SortKey] -> Value),这与 DynamoDB 中的 composite primary key(partition key and sort key)是类似的。

HashKey

字节串。类似于 DynamoDB 中的 partition key,HashKey 用于计算数据属于哪个分片。Pegasus 使用一个特定的 hash 函数,对HashKey 计算出一个hash值,然后对分片个数取模,就得到该数据对应的 Partition ID 。因此,HashKey 相同的数据总是存储在同一个分片中。

注意: 在C++客户端侧,HashKey长度限制为64KB。 在Java客户侧,如果开启了WriteLimiter,则限制为1KB。 在Server侧,从Pegasus 2.0.0开始,如果设置 [replication]max_allowed_write_size 为非0,则限制整个请求包的大小为该值,默认为1MB。

SortKey

字节串。类似于 DynamoDB 中的 sort key,SortKey 用于数据在分片内的排序。实际上,在内部存储到RocksDB时,我们将 HashKey 和 SortKey 拼在一起作为 RocksDB 的 key。

注意:在C++客户端侧,SortKey长度无限制。在Java客户侧,如果开启了WriteLimiter,则限制为1KB。 在Server侧,从Pegasus 2.0.0开始,如果设置 [replication]max_allowed_write_size 为非0,则限制整个请求包的大小为该值,默认为1MB。

Value

字节串。

注意:在C++客户端侧,Value长度无限制。在Java客户侧,如果开启了WriteLimiter,则限制为400KB。 在Server侧,从Pegasus 2.0.0开始,如果设置 [replication]max_allowed_write_size 为非0,则限制整个请求包的大小为该值,默认为1MB。

pegasus-data-model

Pegasus vs. HBase

虽然不及 HBase 的表格模型语义丰富,但是 Pegasus 也能满足大部分业务需求,这得益于其 HashKey+SortKey 组合键的设计。

譬如用户可以将 HashKey 当作 row key,将 SortKey 当作 attribute name 或者 column name,这样同一 HashKey 的多条数据可以看作一行,同样能表达出 HBase 中 row 的概念。正是考虑到这一点,Pegasus 除了提供存取单条数据的 get/set/del 接口,还提供了存取同一 HashKey 数据的 multi_get/multi_set/multi_del 接口,并且这些接口都是单行原子操作,让用户在使用时更加简单。

pegasus-data-model

Pegasus vs. Redis

虽然不像Redis一样支持丰富的List/Set/Hash等数据结构,但用户同样可以使用Pegasus实现类似的语义。

譬如用户可以将 HashKey 等同于 Redis 的 key,将 SortKey 作为 Hash 的 field(或 Set 的member),实现 Redis 中 Hash (或 Set)。