quickdb 另辟捷径高效解决NOSQL数据库 数据持久性问题

红薯 发布于 2012/01/14 01:23
阅读 1K+
收藏 5

目前的NOSQL主要分为两种,一种是基于内存型的如redis、memcached,一种是基于磁盘型的如Tokyo Tyrant、Tokyo Cabinet、Berkeley DB。

redis、memcached这类内存型NOSQL。虽然读写效率很高,但是有一个大问题,就是数据库持久性。memcached是一重启进程数据就没 了。redis支持两种持久化方式,一种是 Snapshotting(快照)也是默认方式,另一种是Append-only file(缩写aof)的方式。但是这两种效率都不高。 怎样才能做到高效读写,又能保持数据持久性了?

quickdb 是 一款基于内存文件系统的 HashTable数据结构的Key-Value数据引擎. . 什么是内存文件系统了?就是操作系统把系统内存划出一部分当作硬盘使用。你可以像操作磁盘那样的操作内存。但效率远远比硬盘来的快多了。通俗叫做内存文件 系统,只要服务器不重起数据将一直都在。

通俗的来讲 redis、memcached是自己申请内存管理数据。当进程重启或者挂了就会丢失数据。quickdb是把实体数据储存在内存文件系统里的。当 quickdb进程挂了,  实体数据依然还在。 一个进程可能因为各种原因比如修改了配置文件或者要调试数据。要经常重启。但是一个服务器不可能三天两天的重启或者死机。 一般服务器都是半年,或者 好几年都不重起的。 如果你的服务器经常断电或者死机重启那就不叫服务器了。叫家用电脑了。嘿嘿  为了起见,quickdb可以定期的从内存文件系统的数据同步到磁盘中去。这样当服务器重启,也不会丢失数据。 简单的来讲,进程可能会经常因为各种原 因要重启或者挂了,但是服务器不可能经常重启或者死机。这样很大程度上保证了数据持久性,也保证了读写效率。做到鱼和熊掌

quickDB Benchmark 性能测试 
写入3145739条数据 花费4.38秒  读取 3145739条数据花费3.88秒

Q: 既然是基于内存文件系统的,那leveldb、tokyocabinet等磁盘类的NOSQL可以直接使用了,为啥还用quickdb了?
A: leveldb、tokyocabinet是专门为硬盘特性而优化的NOSQL。比如增加了合并多个写为一次性写,并有内部的内存缓存系统。 如果使用内存文件系统的话,就会造成多次内存浪费。 quickdb不用缓存,不用合并写。做到简单就是快。

 

Q:  如果服务器内存不够大,是不是用不了quickdb

A:   内存不够大,也可以用quickdb。 内存文件系统可以用tmpfs。tmpfs是当内存不足的时候,把数据交换到swap区。下面讲解了linux下的三种不同的内存文件系统类型

quickdb 下载: http://code.google.com/p/loongsso/downloads/detail?name=quickdb-beta1.tar.bz2&can=2&q=#makechanges

目前quickdb是 测试版,只实现了基本的写入,和读取。年后回来就会出一个完善版
tar -jxvf quickdb.tar.bz2 
./install.sh
./quickdb /dev/shm/db/quickdb(内存文件系统路径) 3145739(读写的次数)

Linux 下的三种内存文件系统 

 (1)ramdisk,使用前需要先创建文件系统,并且调整文件系统大小比较麻烦,需要修改内核引导参数并重新启动操作系统,在繁杂多变的应用与 需要 7X24不间断运行的系统来说,并不是一个可以接受的选择.好处是自2.0版本起内核便支持(这也算好处?嗯,确实算,如果你手头真有这样的系统的话)

(2)ramfs,使用前不需要去创建文件系统了,直接通过mount的方式即可挂载上来用,需要的时候可以使用"mount -o remount,maxsize=..."这种方式来调整大小.

(3)tmpfs,同ramfs在表面上基本上一样啦,不同于ramfs针对"物理内存",tmpfs是在虚拟内存下分配空间的,也就是说tmpfs实例中存储的文件既可能存在于物理内存中,也可能存在于交换分区中,具体存在哪里,是由"虚拟内存子系统"来调度的.

纯性能角度讲,ramfs会在进程占用内存使用较多的情况下会优于tmpfs,在没有交换分区或进程占用内存较小而不发生swap行为的情况下,两者性能不会有差异

文章出处:cellphp

加载中
0
LongRaindy
LongRaindy

在我的环境中编译都不通过啊,郁闷了

[raindy@free01 shm]$ make

gcc -o quickdb hashtable.c  hash.c util.c zmalloc.c -I./jemalloc-2.2.5/include ./jemalloc-2.2.5/lib/libjemalloc.a -lpthread -lcrypto -lrt -D_GNU_SOURCE -D_LARGEFILE64_SOURCE

In file included from hashtable.c:11:

pstdint.h:411: error: conflicting types for 'int32_t'

/usr/include/sys/types.h:197: note: previous declaration of 'int32_t' was here

In file included from hashtable.c:11:

pstdint.h:712: error: conflicting types for 'intptr_t'

/usr/include/unistd.h:268: note: previous declaration of 'intptr_t' was here

hashtable.c:342: error: conflicting types for 'hash_size'

hashtable.h:23: note: previous declaration of 'hash_size' was here

In file included from util.c:8:

pstdint.h:411: error: conflicting types for 'int32_t'

/usr/include/sys/types.h:197: note: previous declaration of 'int32_t' was here

In file included from util.c:8:

pstdint.h:712: error: conflicting types for 'intptr_t'

/usr/include/unistd.h:268: note: previous declaration of 'intptr_t' was here

make: *** [quickdb] Error 1

0
飞翔的天空

quickdb 下载: http://code.google.com/p/loongsso/downloads/detail?name=quickdb-beta1.tar.bz2&can=2&q=#makechanges


下载不了,能发一份到我邮箱吗?万分感谢!


ljt8015@163.com


返回顶部
顶部