在有序的KV引擎之上建造结构化数据库引擎

标签: SSDB | 发表时间:2020-01-15 19:30 | 作者:ideawu
出处:http://www.ideawu.net/blog

KV 数据结构极大地简化了存储引擎的接口和实现. 基本的 KV 接口一般就是 Get(), Set(), 实现上代码也很简单, 极简的实现可以直接利用编码语言提供的 map(哈希, 红黑树)来提供内存数据结构, 而且硬盘上直接 dump 内存数据即可(类似 Redis 的策略).

不过, KV 存储引擎自己省事了, 但使用者不喜欢, 因为大部分的业务并不是 KV 所能表达的, 业务需要丰富的数据结构, 表格(table), 列表(list), map 等各种容器. 另外还需要排序功能, 业务依赖排序.

当前比较流行的 KV 存储引擎如 LevelDB, RocksDB, 因为其数据是 key 有序的, 所以许多结构化数据库引擎都基于其开发. 大家的思路都是使用 LevelDB 作为底层的持久化存储引擎, 通过在 key 上面做文章来实现丰富的数据结构支持. 类似的数据库有:

* SSDB, 兼容 Redis 数据结构
* tidb, 分布式关系数据库, 支持 SQL
* MyRocks, FaceBook 开源的 MySQL 引擎

SSDB 应该是最先开创在 KV 存储引擎之上建立结构化数据库的项目, SSDB 在 2012 年就使用这种模式开发并开源了生产环境使用的数据库.

在 KV 存储引擎之上建立数据结构, 关键点是利用其数据的有序性, 实现方式是巧妙地设计 key 以及数据冗余来表达数据结构. 例如 map 集合结构, 就可以这样在 LevelDB 上设计 key 的结构:

* 集合的 size: key = "map" + $name + "size", value = $size
* 集合的 pair: key = "map" + $name + $key, value = $value

而 SSDB 的 zset(SortedSet) 就相对复杂一些:

* 集合的 size: key = "zset" + $name + "size", value = $size
* 集合的元素按 score 排序: key = "zset_score" + $name + $score" + $item, value = ""
* 集合的元素按 item 排序: key = "zset_item" + $name + $item, value = $score

像 tidb 和 MyRocks 这样的关系数据库, 要实现表结构也并不更加复杂, 只是可能要存储事多的信息:

* 表的 meta 信息
* 主键索引: key = "PK" + $table + $PK, value = json_encode($row)
* 普通索引: key = "NK" + $table + $col + $PK, value = ""
* 更多的普通索引

可以看到, 主键索引是聚簇的, 其它索引带有主键的信息, 类似 innodb.

Related posts:

  1. 百行代码实现一个简单的Zset(SortedSet)
  2. SSDB在大数据量日志分析中的应用案例
  3. 如何使用SSDB的zscan命令
  4. 用PHP遍历SSDB中的zset集合
  5. SSDB – 支持 zset 的 LevelDB 服务器

相关 [kv 引擎 建造] 推荐:

在有序的KV引擎之上建造结构化数据库引擎

- - idea's blog
KV 数据结构极大地简化了存储引擎的接口和实现. 基本的 KV 接口一般就是 Get(), Set(), 实现上代码也很简单, 极简的实现可以直接利用编码语言提供的 map(哈希, 红黑树)来提供内存数据结构, 而且硬盘上直接 dump 内存数据即可(类似 Redis 的策略).. 不过, KV 存储引擎自己省事了, 但使用者不喜欢, 因为大部分的业务并不是 KV 所能表达的, 业务需要丰富的数据结构, 表格(table), 列表(list), map 等各种容器.

Nginx+KV db进行AB灰度测试

- - IT技术博客大学习
周6参加华东运维大会,听了人家淘宝用nginx的一些场景,其中AB的灰度测试可能适用场景会比较普遍,当然大会上,并没有详细讨论实现. 大概需求是: 网站类业务在更新new feature时,并不想让全量用户看到,可以针对地区性用户开放此feature. 大概构思了一个方式,使用 nginx+redis/memcache+IP库实现,简单的流程图如下:.

基于lucene的内嵌式kv存储

- - 开源软件 - ITeye博客
诸多业务场景下,都有使用kv型式存储数据供快速查询的需求. 正常的做法有使用HashMap存入内存,或者存入外部的nosql KV数据库/缓存. 使用HashMap做KV存储,速度快,但是如果数据量达到百万及至千万级时,HashMap必将占用大量的java堆内存,给应用带来极大的内存回收压力. 外部kv存储,以堆外(offHeap)存储的方式让我们的应用免于内存回收之忧,但其查询性能往往低于内存map.

滴滴从KV存储到NewSQL实战

- - DockOne.io
【编者的话】本文讲诉滴滴在分布式NoSQL存储Fusion之上构建NewSQL的实践之路. 详细描述Fusion-NewSQL的特性,应用场景,设计方案. Fusion-NewSQL是由滴滴自研的在分布式KV存储基础上构建的NewSQL存储系统. Fusion-NewSQ兼容了MySQL协议,支持二级索引功能,提供超大规模数据持久化存储和高性能读写.

高性能kv存储之Redis、Redis Cluster、Pika:如何应对4000亿的日访问量?

- - 运维派
随着360公司业务发展,业务使用kv存储的需求越来越大. 为了应对kv存储需求爆发式的增长和多使用场景的需求,360web平台部致力于打造一个全方位,适用于多场景需求的kv解决方案. 目前,我们线上大规模使用的kv存储有Redis,Redis cluster以及Pika. 为什么说是爆发式的需求增长呢.

JS游戏引擎

- 米随随 - HTML5研究小组
If you don’t have anything better to do and want to help fellow redditors interested in JS game dev out, feel free to fork the list and modify it as you like.

mysql 引擎优化

- - CSDN博客推荐文章
MySQL数 据库引擎取决于MySQL在安装的时候是如何被编译的. 要添加一个新的引擎,就必须重新编译MYSQL. 在缺省情况下,MYSQL支持三个引擎:ISAM、MYISAM和HEAP. 另外两种类型INNODB和BERKLEY(BDB),也常常可以使用. 如果技术高超,还可以使用MySQL++ API自己做一个引擎.

谈流程引擎

- - 人月神话的BLOG
在分布式的架构中,流程引擎和权限引擎也不适合分离构建,两者之间的耦合度相当高,一个好的流程引擎首先要依赖于一个完善的权限模型和架构,其中包括了细粒度的数据权限控制等. 流程引擎中会产生动态权限控制,动态权限和静态权限的区别是静态权限是固定的,而动态权限是跟随流程节点的执行动态变化的,如当你处理到某个流程节点的时候,你对某个工单有查看权限,但是一旦审核或处理完成后,即权限自动回收.

Mysql Innodb 引擎优化

- 彦强 - 阿辉的空间
作/译者:吴炳锡,来源:http://imysql.cn/ & http://www.mysqlsupport.cn 转载请注明作/译者和出处,并且不能用于商业用途,违者必究. InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎. InnoDB锁定在行级并且也在SELECT语句提供 一个Oracle风格一致的非锁定读.

Zend引擎的优化

- Angus - 风雪之隅
作者: Laruence(. 本文地址: http://www.laruence.com/2011/07/14/2115.html. 在PHP 5.4的更新list上, 有一句: 提升了Zend引擎的性能, 减少了内存占用.. 那么, 到底是怎么提升的呢?. 避免不必要的Hashtable. 我们知道在PHP中, 类的属性/静态属性/常量, 都是保存在Hashtable中的, 而在以前, 即使一个类没有申明属性/静态属性/常量, Zend引擎也会为他们分配Hashtable..