Google 公司开源的 LevelDB KV 存储引擎是一个非常不错的东西, 支持 zset 数据结构的 SSDB 存储服务器便是使用 LevelDB 作为存储引擎. SSDB 的目的是用来替代 Redis, 作为大数据量存储的服务器. 为什么要在 LevelDB 上面做封装呢? 因为传统的 KV 存储天生不适合存储集合数据, 但实际业务几乎都要求处理集合数据.
LevelDB 将数据写到磁盘上以保证持久化, 但一个重要的问题是, LevelDB 会丢数据吗? 如果程序意外退出, 或者机器掉电, LevelDB 的数据会丢失吗? 其实, 包括 Redis 在内, 甚至是所有的关系数据库系统, 也会面临这个问题.
LevelDB 的写操作是直接操作文件描述符的, 虽然不是带缓冲的标准 IO 的 FILE, 看起来数据会被立即写到磁盘上, 但这个"立即"所对应的时间可就长了.
首先, write() 函数返回时, 数据可能并未到达磁盘, 甚至到达了磁盘也可能只存在于磁盘的可丢失缓冲区. 当然, 如果数据确实达到了磁盘, 丢失的机率就非常小了. 数据何时被写到磁盘, 一般由操作系统内核控制. Linux 内核默认需要 30 秒才将数据刷新到磁盘上. 30 秒可是很长的时间! 丢失的数据可能达到几十万条.
而 LevelDB 使用了 mmap, 这个时间可能更长!
我给 LevelDB 提了一个 issue, 希望能给加上一个类似 Redis 的 sync everysecond 机制, 起一个单独的线程, 每隔一秒将数据刷到磁盘. 不过, 开发者认为这个线程不应该被加入到 LevelDB 里, 而是应该由使用者自己来实现.
一些有用的讨论: http://oldblog.antirez.com/post/redis-persistence-demystified.html
路过看到, 如有冒犯, 忽略 Reply
按照你说的leveldb 只支持KV存储,而SSDB支持zset、hash等,也就是在传统的kv上封装了一层,封装后,有对这些封装后的命令和redis 做过对比么?性能如何?
感谢! Reply
这里是一个leveldb windows port的一个实现, 希望对您能有帮助!
http://code.google.com/r/kkowalczyk-leveldb/
这个则是nodejs的一个leveldb封装(支持windows):
https://github.com/rvagg/node-levelup Reply