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

标签:
键值存储sstablenosql杂谈 |
分类: 存储 |
NoSQL存储指非关系型数据库,它以键值对存储,结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,不局限于固定的结构,可以减少一些时间和空间的开销。
键值存储,即Key-Value存储,简称KV存储。它是NoSQL存储的一种方式。它的数据按照键值对的形式进行组织,索引和存储。KV存储非常适合不涉及过多数据关系业务关系的业务数据,同时能有效减少读写磁盘的次数,比SQL数据库存储拥有更好的读写性能。
关系型数据库中的表都是存储一些格式化的数据结构,每个元组字段的组成都一样,即使不是每个元组都需要所有的字段,但数据库会为每个元组分配所有的字段,这样的结构可以便于表与表之间进行连接等操作,但从另一个角度来说它也是关系型数据库性能瓶颈的一个因素。它不能满足以下“高”需求:
- 对数据库高并发读写的需求;
- 对海量数据的高效率存储和访问的需求;
- 对数据库的高可扩展性和高可用性的需求
为了解决这类问题,非关系数据库应运而生。Google 的BigTable与Amazon的Dynamo是非常成功的商业 NoSQL 实现。一些开源的NoSQL体系,如Membase,MongoDB,Cassandra,BeansDB,Redis等,也得到了广泛认同。
键值存储机制采用键值对形式存储,值可以是任意不定长数据。
http://s10/middle/502d765ftb3f3ddd0bba9&690
图1:KV存储的合并
如上图所示,更新数据和历史数据才用0、1目录管理,假设当前的更新数据目录和历史数据目录都为0目录,在合并时,最新历史数据写到1目录,同时更新数据开始写在1目录。注意的是,需要对更新数据目录和历史数据目录的当前0、1目录进行维护。
一般情况下,更新数据采用Memtable存储,历史数据采用SSTable结构存储。为了提高查询效率,需要能快速定位Key所在的SSTable,而不需要读取所有SSTable。KV存储在内存需保存key到SSTable的映射。
KV存储支持写操作和读操作,如使用主键可作简单查询和复杂查询(如列表查询和范围查询),同时通过更新数据和历史数据的合并定期处理过期数据
1.
写数据时先写到更新目录下(0/1),再写Memtable。更新目录下只追加写,做标记。
2.
读数据时分别读Memtable和SStable的数据合并后返回。
3.
列表查询对指定的主键列表进行查询,返回对应的值列表。
范围查找对指定的主键范围进行查询,返回对应的值列表。
4.
写操作如更新和删除操作会产生很多的无用数据,这些垃圾数据的回收是通过定时合并操作实现的。
kv存储包含未排序的更新数据和排序的历史数据。历史排序数据使用SSTable存储,按照键值排序,可支持范围查找。
http://s4/middle/502d765ftb3f3df1902a3&690
图2:SSTable结构