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

fmms 12年前
     <p>目前的NOSQL主要分为两种,一种是基于内存型的如redis、memcached,一种是基于磁盘型的如Tokyo Tyrant、Tokyo Cabinet、Berkeley DB。</p>    <p>redis、memcached这类内存型NOSQL。虽然读写效率很高,但是有一个大问题,就是数据库持久性。memcached是一重启进程数 据就没 了。redis支持两种持久化方式,一种是 Snapshotting(快照)也是默认方式,另一种是Append-only file(缩写aof)的方式。但是这两种效率都不高。 怎样才能做到高效读写,又能保持数据持久性了?</p>    <p><a href="http://www.open-open.com/lib/view/open1326512050530.html" target="_blank"><strong><span style="color:#e53333;">quickdb </span></strong></a>是 一款基于内存文件系统的 HashTable数据结构的Key-Value数据引擎. . 什么是内存文件系统了?就是操作系统把系统内存划出一部分当作硬盘使用。你可以像操作磁盘那样的操作内存。但效率远远比硬盘来的快多了。通俗叫做内存文件 系统,只要服务器不重起数据将一直都在。</p>    <p>通俗的来讲 redis、memcached是自己申请内存管理数据。当进程重启或者挂了就会丢失数据。quickdb是把实体数据储存在内存文件系统里的。当 quickdb进程挂了,  实体数据依然还在。 一个进程可能因为各种原因比如修改了配置文件或者要调试数据。要经常重启。但是一个服务器不可能三天两天的重启或者死机。 一般服务器都是半年,或者 好几年都不重起的。 如果你的服务器经常断电或者死机重启那就不叫服务器了。叫家用电脑了。嘿嘿  为了起见,quickdb可以定期的从内存文件系统的数据同步到磁盘中去。这样当服务器重启,也不会丢失数据。 简单的来讲,进程可能会经常因为各种原 因要重启或者挂了,但是服务器不可能经常重启或者死机。这样很大程度上保证了数据持久性,也保证了读写效率。做到鱼和熊掌</p>    <h3><span style="color:#e53333;">quickDB Benchmark 性能测试 <br /> </span><span style="color:#e53333;">写入3145739条数据 花费4.38秒  读取</span> <span style="color:#e53333;">3145739条数据花费3.88秒</span> </h3>    <p><img style="cursor:pointer;" alt="quickdb 另辟捷径高效解决NOSQL数据库 数据持久性问题" src="https://simg.open-open.com/show/d6e960de95b514480bdab248e4b69cde.png" width="748" height="70" /></p>    <h3>Q: 既然是基于内存文件系统的,那leveldb、tokyocabinet等磁盘类的NOSQL可以直接使用了,为啥还用quickdb了?<br /> A: leveldb、tokyocabinet是专门为硬盘特性而优化的NOSQL。比如增加了合并多个写为一次性写,并有内部的内存缓存系统。 如果使用内存文件系统的话,就会造成多次内存浪费。 quickdb不用缓存,不用合并写。做到简单就是快。 <p> </p> <p>Q:  如果服务器内存不够大,是不是用不了quickdb</p> <p>A:   内存不够大,也可以用quickdb。 内存文件系统可以用tmpfs。tmpfs是当内存不足的时候,把数据交换到swap区。下面讲解了linux下的三种不同的内存文件系统类型</p> </h3>    <p>quickdb 下载: <a href="http://code.google.com/p/loongsso/downloads/detail?name=quickdb-beta1.tar.bz2&can=2&q=#makechanges" rel="nofollow" target="_blank">http://code.google.com/p/loongsso/downloads/detail?name=quickdb-beta1.tar.bz2&can=2&q=#makechanges</a></p> 目前quickdb是 测试版,只实现了基本的写入,和读取。年后回来就会出一个完善版    <div id="highlighter_253321" class="syntaxhighlighter ">     <div class="lines">      <div class="line alt1">       <table class="ke-zeroborder">        <tbody>         <tr>          <td class="number"><code>1</code></td>          <td class="content"><code class="functions">tar</code> <code class="plain">-jxvf quickdb.</code><code class="functions">tar</code><code class="plain">.bz2 </code></td>         </tr>        </tbody>       </table>      </div>      <div class="line alt2">       <table class="ke-zeroborder">        <tbody>         <tr>          <td class="number"><code>2</code></td>          <td class="content"><code class="plain">./</code><code class="functions">install</code><code class="plain">.sh</code></td>         </tr>        </tbody>       </table>      </div>      <div class="line alt1">       <table class="ke-zeroborder">        <tbody>         <tr>          <td class="number"><code>3</code></td>          <td class="content"><code class="plain">./quickdb /dev/shm/db/quickdb(内存文件系统路径) 3145739(读写的次数)</code></td>         </tr>        </tbody>       </table>      </div>     </div>    </div>    <p>Linux 下的三种内存文件系统  </p>    <p> (1)ramdisk,使用前需要先创建文件系统,并且调整文件系统大小比较麻烦,需要修改内核引导参数并重新启动操作系统,在繁杂多变的应用与 需要 7X24不间断运行的系统来说,并不是一个可以接受的选择.好处是自2.0版本起内核便支持(这也算好处?嗯,确实算,如果你手头真有这样的系统的话)<br /> <br /> (2)ramfs,使用前不需要去创建文件系统了,直接通过mount的方式即可挂载上来用,需要的时候可以使用"mount -o remount,maxsize=..."这种方式来调整大小.<br /> <br /> (3)tmpfs,同ramfs在表面上基本上一样啦,不同于ramfs针对"物理内存",tmpfs是在虚拟内存下分配空间的,也就是说tmpfs实例中存储的文件既可能存在于物理内存中,也可能存在于交换分区中,具体存在哪里,是由"虚拟内存子系统"来调度的.<br /> <br /> 纯性能角度讲,ramfs会在进程占用内存使用较多的情况下会优于tmpfs,在没有交换分区或进程占用内存较小而不发生swap行为的情况下,两者性能不会有差异</p>    <p>文章出处:<a href="/misc/goto?guid=4959500781068305304" rel="nofollow" target="_blank">cellphp</a></p>