从零构建分布式索引系统 OriginDB:原型

序
什么是 OriginDB
OriginDB 是一款全内存分布式索引系统,用于支持数据复杂的检索需求。
为什么想做 OriginDB
本科毕业,毕设方向《搜索引擎的设计与实现》,算是索引检索初探。
15 年~24 年间,从事广告系统开发,主攻广告检索和在线投放。在某知名大厂自主完成分布式内存索引系统 Kunl。
25 年离职,闲来无事,总结了下内存索引的新想法,随计划开发 OriginDB,一款分布式内存索引系统 O 中文名“起源”,纪念开发生涯。
OriginDB 有什么特点
易使用:类关系型数据库设计,支持 sql 查询,对开发人员友好,使用门槛低。
高性能:不需考虑 IO,充分发挥内存优势,充分使用多种内存友好的数据结构。
分布式:实现节点发现,数据同步,最终一致性,开放服务,可独立部署,用于生产环境。
关于本文
初步构建一个索引系统原型,阐述 OriginDB 内核的思路,后续会在该原型上演进出完整的系统
理论
什么是索引
加速查询的数据结构,本质空间换时间,但增加写入维护成本
索引常用数据结构

注:还有些高级数据结构如:字符串前后缀查询:“FST”,“双向 Radix 树”,地理位置查询:“KDTree”,“Geohash 网格索引” 后续随演进介绍。
快速原型构建:模拟 mysql 索引内存版
理论:Innodb 索引
主键索引:B+Tree 索引主键到数据
二级索引:B+Tree 索引字段值到主键,回表获取数据
需求
表
数据
查询
设计
前提:全内存,不需要考虑 IO
1)因此二级索引可以使用对象引用,不需要回表,提高效率(此设计并不好,后续演进)
2)二级索引到单字段索,可支持查询任意组合任意使用,提高灵活性
数据结构:
主键索引:Map<Object, T> mainIndex; 其中 key 是主键
二级索引集合:Map<String, Map<Object, Set<T>> secondaryIndex;其中 key 是字段名,子 key 是字段值,value 是 id 列表
检索过程:
获取每个字段过滤结果,集合结果集获得最终结果
实现
数据库表
使用
结果
总结

演进规划
索引
抽象库,表,正排,倒排等数据结构。
倒排存储逻辑 id:对象引用,更新删除,影响 JavaGC 回收,最好使用数值类型的 ID 方便空间优化。
软删除、数据清理:实时清理词典倒排成本高
存活对象列表:查询后过滤软删除的无效数据

查询
查询条件:=,!= ,<>,>,>=, <, <= , IN ,NOT IN, BETWEEN AND
查询关系:AND ,OR ,NOT
查询组:()

未完待续
附录
纪念 n 年前的文章:《基于BitSet的广告索引检索引擎实现》
版权声明: 本文为 InfoQ 作者【null】的原创文章。
原文链接:【http://xie.infoq.cn/article/6abb3e4542a5f9e36492df6bf】。未经作者许可,禁止转载。
评论