ego008 avatar

使用 rsync 同步 leveldb 应注意的问题

🕟 by ego008

rsync 是一个常用的 Linux 应用程序,用于文件同步,更适合远程服务器文件断点传输。

它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件。它也可以当作文件复制工具,替代 cpmv 命令。

leveldb 备份

leveldb 是高效简单的 key/value 数据库,接口简单,没有复杂的工具。

备份方法也很简单有效:遍历所有的 key/value ,写到新的数据库。

对数据一致性要求较高的最好不要热备(除非在程序级给数据写加锁)。较好的方式是停止源数据库读写后直接把文件复制到新的地方。

scp vs rsync

  1. 对比默认参数下, 两种方式消耗的系统资源情况
    • 在都是空目录的情况下同步信息,scp 和 rsync 的执行效率相当,在一个量级。
    • 当已经同步过一次之后,在后续同步内容的过程中会看到同步的效率 rsync 快了非常多,这是因为 scp 是复制,而rsync 是覆盖。
  2. 在服务器端存在对应服务的条件下
    • scp 是加密的
    • rsync 本身是不加密的,除非配置了使用 ssh 通道或者 vpn 通道,为此 ysync 的传输效率会比较高。
  3. scp 和 rsync 的具体适用场景
    • 如果是频繁更新的文件并且是小文件,则建议使用 rsync
    • 如果是很少更新的文件,建议使用 scp,简单方便快捷,同时还是加密传输

rsync 同步 leveldb

rsync 更适合做大量文件的增量备份,如果要使用 rsync 对 leveldb 在线数据库做热备份/同步,应该留意 leveldb 的一个特性, leveldb 会择时对数据进行整理/压缩,这会导致即使数据记录没有变化(增删改)的情况,数据库文件也会有变化。如下:

plaintext:
1
2
3
4
5
6
7
8
9
10
11
12
数据库原有下面几个文件
000007.ldb
000019.ldb
000022.ldb
000028.ldb

即使数据没有增删改操作,整理后可能会变成下面的文件列表
000024.ldb
000033.ldb
000035.ldb

(文件数量、文件名都有可能会改变)

因为 leveldb 会保留一些数据版本,在整理的时候才会舍弃。如果用 rsync 只做增量备份,就会发现备份的数据库文件越来越大,还可能发现数据不尽相同。所以上面建议对一致性要求高的数据库,最好停止或加锁源数据库。

非要用 rsync 作热备别忘了添加 --delete 参数。如

Bash: rsync leveldb
1
rsync -avzp --delete source/ destination

💘 相关文章

评论

共1条关于"使用 rsync 同步 leveldb 应注意的问题"的评论

写一条评论

Based on Golang + fastHTTP + sdb | go1.17.3 Processed in 0ms