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 挂载配置¶
-
在源集群节点上挂载 Ceph 文件系统:
mount -t ceph <monitor-ip>:6789:/ /mnt/source -o name=admin,secret=<key>
-
在目标集群节点上挂载 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 相反,在局域网中复制整个文件反而更快。 |
🧠 实战建议¶
-
大量小文件:
-
使用
-W
,减少元数据校验。 -
可加
--omit-dir-times
忽略目录时间同步加快。
rsync -avhW --progress /ceph/ ./
-
大文件:
-
使用
--inplace --no-whole-file
,提升大文件效率。 -
若网络传输较慢,可加
-z
启用压缩:
rsync -avh --inplace --no-whole-file -z --progress /ceph/ ./
- 带宽控制(限速):
rsync -avh --bwlimit=10000 --progress /ceph/ ./
限速 10MB/s,适用于公网或不影响其他用户的场景。
- 排除某些无关文件(减少数据量):
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
+-print0
和xargs -0
方式更安全:
find /ceph -mindepth 1 -maxdepth 1 -print0 | xargs -0 -I{} -P4 rsync -avhW --no-compress --omit-dir-times --progress "{}" "./"
5. 优化建议¶
- 网络优化:
- 使用
--bwlimit
参数限制带宽使用 -
考虑使用
--compress
选项减少网络传输量 -
性能优化:
- 根据系统资源调整
MAX_CONCURRENT
值 - 使用
--partial
选项支持断点续传 -
考虑使用
--delete
选项保持目录一致性 -
错误处理:
- 添加错误重试机制
- 实现失败文件记录和重试功能
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