最近在做项目时,遇到了一个问题,现在没有非常好的落地数据的key-value的库。下面就总结一下现有的实现方式,结合使用过程中发现的问题,最后找到一个简单的实现自用的库的方法。
首先总结一下现有的实现方式
1.在mysql上层封装一层接口,将mysql变成一个落地数据的key-value库,然后加上memcache。
这种方式比较适合域读多写少的地方,因为mysql的写性能比较差。读的时候多数会命中memcache所以性能比较好。
针对写性能差的缺点,mysql也有自己的解决方法:读写分离加上主从同步。
建立多个mysql节点,一个节点设置为master,然后其他节点设置为slave(这是扁平的mysql架构)。
在master上开启bin-log,然后slave会读取master的bin-log。
问题:
在一块磁盘上的分表作用有多大?
考虑只读的情况,对建立索引的查询,大部分都是一次IO就可以完成读操作。分表的作用就比较小
如果有写的情况,mysql如果只是锁记录的话,则分表做的作用也非常小。
2.leveldb
leveldb是一个非常好的支持落地数据的key-value的库,它的读性能和写性能都非常好。
性能分析:
读性能:在写不是很多的时候,能保证一次磁盘IO就能得到随机读的数据。
写性能:leveldb采取了合并写的模式,普通的写都是写到内存中,然后过一段时间会顺序的写到一个disk上。所以写的性能也是非常好的。
然后分析一下具体使用问题
在使用的过程中也发现了非常多的问题:
1.leveldb的读性能不是很稳定。我们几个开玩笑的时候说,如果一个库一般情况性能好,但是在某些情况下的性能差,还不如在所有情况下都比较差。因为在评估机器的时候,如果性能差,可以采用scale-out的方式来扩展。
leveldb的merge是一个非常耗时的操作,在通常情况下,merge会涉及到11-12个文件,一个文件2M,就是所涉及到22M文件的读写,这个会花费200ms(200M/s),这个最坏的情况会涉及到24次寻道的时间,大约会花费200ms(一次10ms)。在这个时间内,如果有读请求需要磁盘IO,那么就非常困难了。
可能的解决方法:
1).缩小文件的大小有可能能解决这个问题,比如一个文件1M,这样能降低一次merge花费的时间,涉及的文件会变少。
2).通过merge中的限制,减少merge中间可能会涉及的文件的数目。在merge时,leveldb生成一个文件时,会考虑如果这个文件merge会涉及到多少文件,可以修改这个参数做到减少merge中间可能会涉及的文件的数目。
2.leveldb不支持主从同步。
这个问题比较容易解决,可以采用和mysql的解决方法一样的思路,dump+bin-log的方法。
组装自己的落地数据的key-value库
个性化的leveldb+主从同步,用组装这个词非常合适,嘻嘻。
附:mysql主从同步的实现思路。
今天还学习了一下mysql的bin-log的实现思路,bin-log中记录了insert,update,delete操作的具体内容,然后在slave上重现执行一下bin-log。这种bin-log在slave上的执行时间是和master上一样的,本来我还以为mysql会在binlog中记录内部数据的一些操作(比如B+树的操作和文件diff等等),这样应该能减少slave上的执行时间。但是这样就会让bin-log的设计非常复杂。
分享到:
相关推荐
Key-value存储简介
针对以上问题,提出一种基于key-value数据库的快速地名地址输入提示方法。该方法基于Trie树结构进行改进,降低了地址索引的复杂度;基于key-value数据库构建Trie树,避免了内存消耗巨大的问题。实验结果表明,基于...
Werner_Vogels——Dynamo_amazon's_highly_available_key-value_store.pdfWerner_Vogels——Dynamo_amazon's_highly_available_key-value_store.pdfWerner_Vogels——Dynamo_amazon's_highly_available_key-value_...
分布式key-value存储系统入门,详细介绍cassandra系统
一个简单的类,主要应用一些适中规模数据的快速双向查找,通过key可以快速找到value,通过value可以快速找到key。 典型的空间换时间的小例子,代码简单实用
云计算Paas平台的Key-Value服务 背景介绍 •关于SAE •SAE的整体架构 •SAE的KVDB服务 •Key-Value服务的改进
想要明白什么是key/value数据库,就必须了解哈希表(Hash Table)这种数据结构。 比如,Berkley DB就是典型的key/value数据库。
gkvlite, go语言的简单有序key-value 持久库 gkvlitegkvlite是一个简单。有序。ACID 。key-value 持久化库。 概述gkvlite是一个提供简单 key-value 持久性存储的库,它受SQLite和 couchdb/couchstore启
基于关系型与Key-Value型数据库混合存储的多租户数据存储架构,蔺皓,王柏,针对SaaS多租户、可配置、易扩展的特点,在设计其数据存储架构时存在三种主流方案:数据库分离法、表空间分离法以及共享表空间法��
因为 PalDB 是只读的存储系统,只关注数据,相比其他嵌入式 key-value 系统来说非常简单,拥有较高的吞吐量。当前的基准测试基于 3.1Ghz Macbook Pro:PalDB, LevelDB 和 RocksDB 吞吐量比较(越高越好)PalDB 和一...
基于Gated Key-Value Memory Networks的知识库问答系统,刘帅,刘志晗,当前,使用记忆网络来实现知识库问答(KBQA)系统成为受人关注的焦点,因此本文提出了以基于GatedKey-Value Memory Networks模型为核心的知�...
赠送jar包:spring-data-keyvalue-2.5.5.jar; 赠送原API文档:spring-data-keyvalue-2.5.5-javadoc.jar; 赠送源代码:spring-data-keyvalue-2.5.5-sources.jar; 赠送Maven依赖信息文件:spring-data-keyvalue-...
赠送jar包:spring-data-keyvalue-2.3.9.RELEASE.jar; 赠送原API文档:spring-data-keyvalue-2.3.9.RELEASE-javadoc.jar; 赠送源代码:spring-data-keyvalue-2.3.9.RELEASE-sources.jar; 赠送Maven依赖信息文件:...
前端开源库-key-value-store-anysql键值存储any sql,事务键值存储在任何sql数据库之上
Snapshot 采用纯Golang编写的强大、可持久化,Key-Value (KV)存储
Go语言开发的基于DRH(Deep-Re-Hash)深度哈希分区算法的高性能高可用Key-Value嵌入式事务数据库。基于纯Go语言实现,具有优异的跨平台性,良好的高可用及文件IO复用设计,高效的底层数据库文件操作性能,支持原子操作...
赠送jar包:spring-data-keyvalue-2.0.9.RELEASE.jar; 赠送原API文档:spring-data-keyvalue-2.0.9.RELEASE-javadoc.jar; 赠送源代码:spring-data-keyvalue-2.0.9.RELEASE-sources.jar; 赠送Maven依赖信息文件:...
web应用程序获取资源文件的key-value;web应用程序获取资源文件的key-value
RocksDB 是一个来自 facebook 的可嵌入式的支持持久化的 key-value 存储系统,也可作为 C/S 模式下的存储数据库,但主要目的还是嵌入式。RocksDB 基于 LevelDB 构建。关于 RocksDB 的性能说明。 标签:...
赠送jar包:spring-data-keyvalue-2.6.1.jar; 赠送原API文档:spring-data-keyvalue-2.6.1-javadoc.jar; 赠送源代码:spring-data-keyvalue-2.6.1-sources.jar; 赠送Maven依赖信息文件:spring-data-keyvalue-...