怎么解决NOSQL数据库数据持久性问题
目前的NOSQL主要分为两种,一种是基于内存型的如redis、memcached,一种是基于磁盘型的如Tokyo Tyrant、Tokyo Cabinet、Berkeley DB。redis、memcached这类内存型NOSQL。虽然读写效率很高,但是有一个大问题,就是数据库持久性。memcached是一重启进程数据就没了。redis支持两种持久化方式,一种是 Snapshotting(快照)也是默认方式,另一种是Append-only file(缩写aof)的方式。但是这两种效率都不高。 怎样才能做到高效读写,又能保持数据持久性了?
以下这个解决方案是由CU热心网友“七夜”带来的:
quickdb 是一款基于内存文件系统的 HashTable数据结构的Key-Value数据引擎. . 什么是内存文件系统了?就是操作系统把系统内存划出一部分当作硬盘使用。你可以像操作磁盘那样的操作内存。但效率远远比硬盘来的快多了。通俗叫做内存文件系统,只要服务器不重起数据将一直都在。
通俗的来讲 redis、memcached是自己申请内存管理数据。当进程重启或者挂了就会丢失数据。quickdb是把实体数据储存在内存文件系统里的。当quickdb进程挂了,实体数据依然还在。 一个进程可能因为各种原因比如修改了配置文件或者要调试数据。要经常重启。但是一个服务器不可能三天两天的重启或者死机。 一般服务器都是半年,或者 好几年都不重起的。 如果你的服务器经常断电或者死机重启那就不叫服务器了,叫家用电脑了。quickdb可以定期的从内存文件系统的数据同步到磁盘中去。这样当服务器重启,也不会丢失数据。 简单的来讲,进程可能会经常因为各种原因要重启或者挂了,但是服务器不可能经常重启或者死机。这样很大程度上保证了数据持久性,也保证了读写效率。做到鱼和熊掌兼得。
quickDB Benchmark 性能测试
写入3145739条数据 花费4.38秒读取 3145739条数据花费3.88秒
quickdb下载地址:
http://code.google.com/p/loongsso/downloads/detail?name=quickdb-beta1.tar.bz2&can=2&q=#makechanges
Q: 既然是基于内存文件系统的,那leveldb、tokyocabinet等磁盘类的NOSQL可以直接使用了,为啥还用quickdb了?
A: leveldb、tokyocabinet是专门为硬盘特性而优化的NOSQL。比如增加了合并多个写为一次性写,并有内部的内存缓存系统。 如果使用内存文件系统的话,就会造成多次内存浪费。 quickdb不用缓存,不用合并写。做到简单就是快。
Q:如果服务器内存不够大,是不是用不了quickdb
A: 内存不够大,也可以用quickdb。 内存文件系统可以用tmpfs。tmpfs是当内存不足的时候,把数据交换到swap区。
下面讲解了linux下的三种不同的内存文件系统类型:
(1)ramdisk,使用前需要先创建文件系统,并且调整文件系统大小比较麻烦,需要修改内核引导参数并重新启动操作系统,在繁杂多变的应用与需要 7X24不间断运行的系统来说,并不是一个可以接受的选择.好处是自2.0版本起内核便支持(这也算好处?嗯,确实算,如果你手头真有这样的系统的话)
(2)ramfs,使用前不需要去创建文件系统了,直接通过mount的方式即可挂载上来用,需要的时候可以使用"mount -o remount,maxsize=..."这种方式来调整大小.
(3)tmpfs,同ramfs在表面上基本上一样啦,不同于ramfs针对"物理内存",tmpfs是在虚拟内存下分配空间的,也就是说tmpfs实例中存储的文件既可能存在于物理内存中,也可能存在于交换分区中,具体存在哪里,是由"虚拟内存子系统"来调度的.
纯性能角度讲,ramfs会在进程占用内存使用较多的情况下会优于tmpfs,在没有交换分区或进程占用内存较小而不发生swap行为的情况下,两者性能不会有差异。
本期讨论话题:1,针对“怎么高效解决NOSQL数据库,数据持久性问题”这个话题分享您在实际生产中的解决方案,经验。
2,针对“七夜”带来的解决方案,进行讨论。
讨论时间:2012.1.10——2012.2.10
讨论有奖: 我们将对积极参与讨论的网友进行奖励,我们会对提出更优质方案的网友进行评选,优胜者(可以是多名)将获得CU十周年定制背包一个。
对积极参与活动网友(有效回复超过3贴),将获得由IBM笔记本内胆包一个(共5个)
十周年背包
IBM内胆包
沙发支持下. 看着这个持久化解决方案,比redis的数据持久化 高速,效率。 欢迎大家积极参与~!:wink: 相当给力啊,和redis有的一拼啊~~楼主实力! 这个在文件系统中有类似的做法,对于实时的文件系统,写内存,然后慢慢刷到磁盘中,但是LZ提的这个问题,从需求上来讲有矛盾。。。。我去找找以前做过这方面的优化的资料,到时候提出来讨论讨论 楼主不要忘了,把文档和售后工作做好啊,哈哈 回复 1# 无风之谷
关注NoSQL数据库话题:mrgreen:
太需要这东西了,晚上测试一下!~~ 马克