加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

键值存储【KV存储】以及SSTable介绍

(2011-12-13 15:02:21)
标签:

键值存储

sstable

nosql

杂谈

分类: 存储

NoSQL存储指非关系型数据库,它以键值对存储,结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,不局限于固定的结构,可以减少一些时间和空间的开销。

键值存储,即Key-Value存储,简称KV存储。它是NoSQL存储的一种方式。它的数据按照键值对的形式进行组织,索引和存储。KV存储非常适合不涉及过多数据关系业务关系的业务数据,同时能有效减少读写磁盘的次数,比SQL数据库存储拥有更好的读写性能。

关系型数据库中的表都是存储一些格式化的数据结构,每个元组字段的组成都一样,即使不是每个元组都需要所有的字段,但数据库会为每个元组分配所有的字段,这样的结构可以便于表与表之间进行连接等操作,但从另一个角度来说它也是关系型数据库性能瓶颈的一个因素。它不能满足以下“高”需求:

  • 对数据库高并发读写的需求;
  • 对海量数据的高效率存储和访问的需求;
  • 对数据库的高可扩展性和高可用性的需求

为了解决这类问题,非关系数据库应运而生。Google BigTableAmazonDynamo是非常成功的商业 NoSQL 实现。一些开源的NoSQL体系,如MembaseMongoDBCassandraBeansDBRedis等,也得到了广泛认同。

键值存储机制采用键值对形式存储,值可以是任意不定长数据。

http://s10/middle/502d765ftb3f3ddd0bba9&690

1KV存储的合并

如上图所示,更新数据和历史数据才用01目录管理,假设当前的更新数据目录和历史数据目录都为0目录,在合并时,最新历史数据写到1目录,同时更新数据开始写在1目录。注意的是,需要对更新数据目录和历史数据目录的当前01目录进行维护。

一般情况下,更新数据采用Memtable存储,历史数据采用SSTable结构存储。为了提高查询效率,需要能快速定位Key所在的SSTable,而不需要读取所有SSTableKV存储在内存需保存keySSTable的映射。

KV存储支持写操作和读操作,如使用主键可作简单查询和复杂查询(如列表查询和范围查询),同时通过更新数据和历史数据的合并定期处理过期数据

1.       写操作:增加,修改,删除一个键值对

写数据时先写到更新目录下(0/1),再写Memtable。更新目录下只追加写,做标记。

2.       简单查询:查询某个主键对应的值

读数据时分别读MemtableSStable的数据合并后返回。

3.       复杂查询:列表查询,范围查询

列表查询对指定的主键列表进行查询,返回对应的值列表。

范围查找对指定的主键范围进行查询,返回对应的值列表。

4.       过期数据处理:合并

写操作如更新和删除操作会产生很多的无用数据,这些垃圾数据的回收是通过定时合并操作实现的。

kv存储包含未排序的更新数据和排序的历史数据。历史排序数据使用SSTable存储,按照键值排序,可支持范围查找。

http://s4/middle/502d765ftb3f3df1902a3&690

2SSTable结构

    每个SSTable中的key是排序的,SSTable的索引存储了它的开始key,整个SSTable在文件中的偏移,以及SSTablekey的个数,同时SSTable内部有块内索引,存储每个keySSTable内的局部偏移和数据长度。SSTable一旦完成写入,就不可变更,只能读取。下一次合并时,因为SSTable内部的key是排序的,因此只需要做一次合并排序将历史数据刷新到一个新的SSTable中。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有