使用 rsync 同步 leveldb 应注意的问题
rsync 是一个常用的 Linux 应用程序,用于文件同步,更适合远程服务器文件断点传输。
它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件。它也可以当作文件复制工具,替代 cp
和 mv
命令。
leveldb 备份
leveldb 是高效简单的 key/value 数据库,接口简单,没有复杂的工具。
备份方法也很简单有效:遍历所有的 key/value ,写到新的数据库。
对数据一致性要求较高的最好不要热备(除非在程序级给数据写加锁)。较好的方式是停止源数据库读写后直接把文件复制到新的地方。
scp vs rsync
- 对比默认参数下, 两种方式消耗的系统资源情况
- 在都是空目录的情况下同步信息,scp 和 rsync 的执行效率相当,在一个量级。
- 当已经同步过一次之后,在后续同步内容的过程中会看到同步的效率 rsync 快了非常多,这是因为 scp 是复制,而rsync 是覆盖。
- 在服务器端存在对应服务的条件下
- scp 是加密的
- rsync 本身是不加密的,除非配置了使用 ssh 通道或者 vpn 通道,为此 ysync 的传输效率会比较高。
- scp 和 rsync 的具体适用场景
- 如果是频繁更新的文件并且是小文件,则建议使用 rsync
- 如果是很少更新的文件,建议使用 scp,简单方便快捷,同时还是加密传输
rsync 同步 leveldb
rsync 更适合做大量文件的增量备份,如果要使用 rsync 对 leveldb 在线数据库做热备份/同步,应该留意 leveldb 的一个特性, leveldb 会择时对数据进行整理/压缩,这会导致即使数据记录没有变化(增删改)的情况,数据库文件也会有变化。如下:
数据库原有下面几个文件
000007.ldb
000019.ldb
000022.ldb
000028.ldb
即使数据没有增删改操作,整理后可能会变成下面的文件列表
000024.ldb
000033.ldb
000035.ldb
(文件数量、文件名都有可能会改变)
因为 leveldb 会保留一些数据版本,在整理的时候才会舍弃。如果用 rsync 只做增量备份,就会发现备份的数据库文件越来越大,还可能发现数据不尽相同。所以上面建议对一致性要求高的数据库,最好停止或加锁源数据库。
非要用 rsync 作热备别忘了添加 --delete
参数。如
rsync -avzp --delete source/ destination
0
See Also
- HyperLevelDB 提高了LevelDB 性能的一个分支
- 云里mysql 主从数据的同步问题?
- 建议:发帖、可以自动同步到微博
- 开始使用youbbs做了文爱社区
- [使用反馈]不知道这种情况算不算bug ?
@ego008 我是直接使用 -it 参数强制更新同步解决的~