2013-04-02

LevelDB 会丢数据吗?

Views: 38090 | 14 Comments

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

Related posts:

  1. 为什么LevelDB用了大量VIRT虚拟内存
  2. LevelDB 服务器 SSDB 支持主从(master-slave)同步了!
  3. SSDB – 支持 zset 的 LevelDB 服务器
  4. SSDB 解决了 Snappy 导致 LevelDB 编译失败的问题
  5. SSDB(LevelDB 服务器) PPT
Posted by ideawu at 2013-04-02 20:30:23 Tags:

14 Responses to "LevelDB 会丢数据吗?"

Leave a Comment