EvenDB: Optimizing Key-Value Storage for Spatial Locality

Eurosys'20

Eran Gilad Yahoo Research, Israel Edward Bortnikov Yahoo Research, Israel Anastasia Braginsky Yahoo Research, Israel Yonatan Gottesman Yahoo Research, Israel Eshcar Hillel Yahoo Research, Israel Idit Keidar Technion and Yahoo Research, Israel Nurit Moscovici∗Outbrain, Israel Rana Shahout∗Technion, Israel

本文是雅虎研究发表在Eurosys 2020上的文章,主要针对KV应用场景中的Spatial Locality的负载特征,设计了一个新的KV Store。现在的KV Store作为底层存储引擎,通常Key是多个属性组合起来的值,某些主属性的热点访问会导致KV Store中某个key range的数据成为访问热点,也就是所说的Spatial Locality。这个问题在FAST 2020上的RocksDB workload分析的文章中也有提到。本文针对这个Spatial locality特征,提出LSM-Tree不适用于这种场景,然后重新设计了一个新的结构并实现了EvenDB。

背景

Spatial locality

KV Store常作为应用或者其他存储系统的底层存储引擎,上层应用的数据在被转换成KV格式的时候,key往往会由多个属性组成,所以多个key也可能会有相同的前缀,比如一个表的数据,在存储到KV之后可能table-id就会作为key的一个前缀,这个表的所有数据前缀都相同。这样的影响是上层应用出现访问热点的时候,底层KV store可能热点会集中在某个key range内,也就是spatial locality。而数据热点现象在KV workload中也很常见,下图是本文做的一个统计,统计的是一个移动app数据分析平台的trace,横轴是app id,可以看到大约1%的app占了约94%的数据访问。

spatial locality

LSM-Tree的不适应

对于这种拥有spatial locality的workload,本文认为现在最常使用的LSM-Tree结构不再适用,主要的理由有三点:

  • LSM-Tree中主要按照时间顺序组织数据,会导致同一个key range的数据分散到不同的SST内;
  • LSM-Tree的compaction会消耗大量的带宽并产生读写放大;
    • 写放大缩短SSD这类存储设备的寿命;
    • compaction会将冷数据不断地进行读写;
  • 热数据会被flush到盘上,降低了数据访问效率。

EvenDB设计

EvenDB的设计核心思想是对于前缀相同的数据以chunk为单位进行组织,并以chunk为单位进行缓存或者写盘。

Design Goal

  • 针对spatial locality优化;
  • 减小写放大;
  • 针对热点数据可以完全存储到内存的应用场景;
  • 支持快速恢复。

结构

overall structure

EvenDB的组织数据的基本单位是chunk,当chunk被写入磁盘的时候成为一个funk(file chunk),被缓存在内存中的时候为一个munk(memory chunk),chunk以链表形式组织并通过index将key映射到对应的chunk,每个chunk代表一个key range。

Funk

funk是chunk在磁盘上的存储形式,由一个SSTable文件和一个log组成,新数据追加到log中并通过compaction合并到SST中。当log大小达到阈值之后,触发rebalance进行合并。由于log中查找数据是顺序查找,比较慢,所以每个funk有一个bloom filter用来减少不必要的log查找。

Munk

munk是chunk缓存到内存中的形式,数据通过一个数组链表来组织,数据首先根据前缀划分到各个数组中,前缀按照大小排序,然后同一个数组下标下的数据通过链表组织。新数据插入的时候先追加到log中,然后就追加到对应前缀的链表里面。查找的时候,首先在数组中进行二分查找,然后再在链表中顺序查找。

Reorganization

  • munk rebalance:对munk数据进行组织;
  • funk rebalance:频率较低(因为funk都是冷数据);
  • split:创建新的chunk。

加速磁盘访问

对于没有被cache的chunk的访问,本文提出两点优化措施:

  • 缓存单个KV的row cache

当某些chunk只有少量KV是访问热点,缓存整个chunk就没必要了,所以EvenDB也设计了一个KV为单位的row cache来缓存单个kv(rocksdb里面也有)。

  • bloom filter减少log访问

Concurrency and atomic scan

EvenDB支持原子的scan操作,并发控制通过一个简化的multi-version实现。get操作不需要锁和等待,put操作需要等待rebalance操作,scan可能需要等待put操作。

EvenDB中有一个全局的version number,被称为Global Version。这个version是针对scan的并发控制,put操作不需要修改。

对于scan,在执行scan之前需要创建一个snapshot,此时会访问global version并将其增加1。put操作将不允许修改version小于global version的KV数据。

对于旧版本的管理,EvenDB通过一个Pending Operation Array来记录每个活跃中的线程。当Array中的version不再被访问的时候就表明对应的旧版本数据可以被删除了。

对于不同操作的同步,put于scan之间可能存在的竞争通过Pending Operation Array处理,put与rebalance的竞争通过rebalance lock来处理。

基本操作

EvenDB中所有的操作之前都需要先定位key所在的chunk,这个操作通过内存中的index来进行。

put

  1. 通过index定位chunk;
  2. 获取rebalance lock;
  3. 获取global version,将要修改的key在po中注册;
  4. 写数据到log,如果有munk则更新munk;
  5. 如果key在row cache中,则同时更新row cache(row cache不服务scan,所以只保存最新的数据);
  6. 从po中注销key并释放rebalance lock。

对于同一个GV下针对同一个key的多次更新,EvenDB给每个chunk设置了一个counter,这样就能通过<GV,counter>对来对每个put操作进行排序。

scan

  1. 获取global version并将其加1;
  2. 在PO中注册scan的key range和GV;
  3. 等待小于GV的put操作的完成;
  4. 读数据;
  5. 注销;

Rebalance

Rebalance可以移除无效数据并提升数据有序性,当munk数据超过一定的阈值之后则触发Rebalance,Rebalance是在一个新的地方创建,过程中不会动原来的数据,避免影响并发操作。Rebalance操作需要获取锁避免与put的竞争,但是不会影响get和scan。

Funk的rebalance会创建新的sst和log。如果funk有对应的munk,则只对munk进行rebalance,然后再将munk flush成SST即可。

Split

如果munk的数据在rebalance的时候数据量超过阈值则进行split,此时当前chunk会被拆分成两个chunk。

split分成两个阶段进行:

阶段1:此阶段获取rebalance lock,不允许put

  1. 拆分munk;
  2. 创建两个新的chunk并分别引用两个munk,但是共享同一个funk;
  3. 将新的chunk插入chunk list(此时已经可以访问,可以通过旧的chunk访问到新的chunk);
  4. 更新index。

阶段2:拆分funk,此阶段释放锁,put通过新的munk进行服务。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容