跳转至

Ceph 集群间数据同步方案:基于 rsync 的并行同步实现

1. 环境准备

1.1 系统要求

  • 两个独立的 Ceph 集群(可以是 rook-ceph)
  • 源集群和目标集群只需要一个配置宿主机网络模式
  • 操作系统:Linux(Ubuntu 22.04)
  • 需要 root 或具有 sudo 权限的用户

1.2 网络配置

  • 确保两个 Ceph 集群之间网络互通
  • 建议使用千兆或更高带宽的网络连接(优先使用万兆)
  • 配置防火墙允许必要的端口(默认 873 用于 rsync)

2. 安装和配置

2.1 安装必要软件

# 在两个集群的同步节点上安装 rsync
yum install -y rsync  # CentOS/RHEL
# 或
apt-get install -y rsync  # Ubuntu/Debian

2.2 Ceph 挂载配置

  1. 在源集群节点上挂载 Ceph 文件系统:

    mount -t ceph <monitor-ip>:6789:/ /mnt/source -o name=admin,secret=<key>
    

  2. 在目标集群节点上挂载 Ceph 文件系统:

    mount -t ceph <monitor-ip>:6789:/ /mnt/destination -o name=admin,secret=<key>
    

3. 并行 rsync 同步实现

rsync 显示同步进度给出命令

使用 rsync 显示同步进度可以加上 --progress 选项。以下是一个示例命令:

rsync -avh --progress 源路径 目标路径

解释:

  • -a:归档模式,表示递归复制目录并保持符号链接、权限等。

  • -v:详细输出,显示同步过程。

  • -h:人类可读的格式,显示文件大小时会以合适的单位(如 KB、MB)展示。

  • --progress:显示文件传输的详细进度。

如果你有特定的源路径和目标路径,可以替换命令中的 "源路径" 和 "目标路径"。

源目录: - 是/ceph 下的所有文件 同步到当前目录下

如果你想把 /ceph 目录下的所有文件和子目录(不包括 /ceph 这个目录本身)同步到当前目录下,并显示同步进度,可以使用以下命令:

rsync -avh --progress /ceph/ ./

注意这里的 /ceph/ 最后有个斜杠 /,这表示如果你想把 /ceph 目录下的所有文件和子目录(不包括 /ceph 这个目录本身)**同步到当前目录下,并显示同步进度,可以使用以下命令:

rsync -avh --progress /ceph/ ./

注意这里的 /ceph/ 最后有个斜杠 /,这表示同步的是 /ceph 目录里的内容** ;如果你写成 /ceph(不带斜杠),rsync 会把整个目录 /ceph 同步过来。

所以,推荐使用:

rsync -avh --progress /ceph/ ./

如果你还希望支持断点续传(比如中途中断了能接着传),可以加上 --partial--partial-dir=.rsync-partial,例如:

rsync -avh --progress --partial /ceph/ ./

4. 如何加快 rsync 同步的速度?

要加快 rsync 同步速度,可以从多个方面入手优化,以下是实用建议及命令参数推荐:


✅ 推荐参数组合

rsync -avh --progress --inplace --no-whole-file --compress-level=0 --info=progress2 /ceph/ ./

🚀 提速技巧讲解

优化手段 命令参数 说明
避免重复构建临时文件 --inplace 直接在目标文件上修改,节省 I/O 和磁盘空间。适合大文件或局域网同步。
避免重新复制整个文件 --no-whole-file 默认只在本地使用,强制进行"增量块同步",对大文件更高效。
压缩开销最小化 --compress-level=0 若在局域网或本机传输,禁用压缩避免 CPU 负担。
避免系统额外开销 -W(可选) 复制整个文件(不进行增量),适合小文件非常多时,但禁用增量特性。
提高并发能力(外部) 用 parallel 或 xargs -P 手动多线程多个子目录并行同步。
使用 --whole-file 局域网优化(可选) 与 --no-whole-file 相反,在局域网中复制整个文件反而更快。

🧠 实战建议

  1. 大量小文件:

  2. 使用 -W,减少元数据校验。

  3. 可加 --omit-dir-times 忽略目录时间同步加快。

rsync -avhW --progress /ceph/ ./
  1. 大文件:

  2. 使用 --inplace --no-whole-file,提升大文件效率。

  3. 若网络传输较慢,可加 -z 启用压缩:

rsync -avh --inplace --no-whole-file -z --progress /ceph/ ./
  1. 带宽控制(限速):
rsync -avh --bwlimit=10000 --progress /ceph/ ./

限速 10MB/s,适用于公网或不影响其他用户的场景。

  1. 排除某些无关文件(减少数据量):
rsync -avh --progress --exclude='*.tmp' --exclude='cache/' /ceph/ ./

如果当前使用环境(比如:局域网/公网、文件类型、大文件为主 or 小文件为主)定制一个最佳命令吗?

既然你的环境是以小文件为主 ,那我们可以针对这种情况来优化 rsync 的同步效率。以下是适合你的命令和说明:


✅ 推荐命令(小文件优化):

rsync -avhW --omit-dir-times --no-compress --progress /ceph/ ./

📌 参数解释(针对小文件优化):

  • -a:归档模式,保留权限、时间等。

  • -v:详细输出。

  • -h:人类可读大小。

  • -W:直接复制整个文件,跳过增量算法,加快小文件传输。

  • --omit-dir-times:不保留目录时间戳,减少开销。

  • --no-compress:小文件压缩反而可能拖慢速度,局域网传输禁用压缩更快。

  • --progress:显示当前传输进度。


🚀 额外建议(非常推荐可以加快速度)

命令 1:

如果你想进一步加快,可以并发执行多个子目录同步任务 ,比如:

ls /ceph | xargs -I{} -P4 rsync -avhW --omit-dir-times /ceph/{} ./{}

这里 -P4 表示并发 4 个同步任务(你可以根据机器负载和硬盘情况调整)。


命令 2:

ls /ceph | xargs -I{} -P4 rsync -avhW --no-compress --progress  /ceph/{} ./{}

命令 3:

利用 xargs -P4 实现你的这条命令总体思路是正确的,利用 xargs -P4 实现并发同步 /ceph 下的子目录或文件 ,适合小文件多的场景。但我们稍微优化一下可以更健壮一点:


✅ 改进版命令(并发 rsync 同步):

ls -1 /ceph | xargs -I{} -P4 rsync -avhW --no-compress --omit-dir-times --progress "/ceph/{}" "./{}"

✅ 说明和优化点:

部分 说明
ls -1 强制一行一个输出,避免异常空格干扰。
-P4 同时执行 4 个 rsync 实例(你可调整为 8、16 等看 CPU 和磁盘负载)。
-W 小文件不做增量计算,直接复制整个文件,加速小文件同步。
--no-compress 禁用压缩,适合本地或局域网环境的小文件同步。
--omit-dir-times 不同步目录时间,加快扫描和写入效率。
--progress 显示进度,便于观察每个文件传输情况。

⚠️ 注意事项

  • 目录/文件名中如果有 空格特殊字符 ,推荐使用 find + -print0xargs -0 方式更安全:
find /ceph -mindepth 1 -maxdepth 1 -print0 | xargs -0 -I{} -P4 rsync -avhW --no-compress --omit-dir-times --progress "{}" "./"

5. 优化建议

  1. 网络优化
  2. 使用 --bwlimit 参数限制带宽使用
  3. 考虑使用 --compress 选项减少网络传输量

  4. 性能优化

  5. 根据系统资源调整 MAX_CONCURRENT
  6. 使用 --partial 选项支持断点续传
  7. 考虑使用 --delete 选项保持目录一致性

  8. 错误处理

  9. 添加错误重试机制
  10. 实现失败文件记录和重试功能

Screen 虚拟窗口

可以利用 screen 把同步命令放到后台,这样既可以观察同步状态,也不用担心 rsync 终端

screen -R  rsync-p4
ls -1 /ceph | xargs -I{} -P4 rsync -avhW --no-compress --omit-dir-times --progress "/ceph/{}" "./{}"
ctrl + ad
screen -ls
回到页面顶部