真实事件:一个斜杠引发的“雪案”

142 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 2 天,点击查看活动详情

我怎么会错呢,我错了我会知道的 ...

                      -- 张三如是说

1. 事件始末

#JFrog Artifactory 存储迁移方案踩坑指南文中,介绍了同时挂载两个 S3 存储的方案,在此基础上,底层 S3 做增量文件同步。

Artifactory 底层采用哈希值命名文件,所有文件分布在 00,01,02,...,fe,ff 这些文件夹中,为实现同步加速,我们采用多台服务器分段同步的方式进行。

下面是最初的同步脚本,target.txt 每行一个目录名称,00,01,02...

#!/bin/bash

for line in $(cat target.txt); do
        rsync -auvrt --progress --ignore-existing --ignore-errors /artifactory/filestore/${line} /eds-artifactory/filestore/${line} > ${line}.log
done

十一假期里,三台服务器开足马力的同步,结果刚上班,就一群人报障: Artifactory 无法下载制品。经过各种排查,最后发现同步导致的,竟然在目标目录中又创建了新的目录。目标路径变成了 00/00/*

紧急修复,就是挪路径,又跑了一天一夜。😭

2. 寻找真相

构建如下试验环境:

$ tree -L 3 .
.
├── abc
│   └── a
│       ├── a.txt
│       └── b.txt
└── bcd

执行与生产环境类似的命令:

$ rsync -auvt --progress --ignore-existing --ignore-errors ./abc/a ./bcd
sending incremental file list
a/            <--- 看到没,这里新增了目录
a/a.txt
              0 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/3)
a/b.txt
              0 100%    0.00kB/s    0:00:00 (xfr#2, to-chk=0/3)

sent 179 bytes  received 58 bytes  474.00 bytes/sec
total size is 0  speedup is 0.00

根据经验判断,极有可能是斜杠导致的。执行修改后的命令:

$ rsync -auvt --progress --ignore-existing --ignore-errors ./abc/a/ ./bcd
sending incremental file list
./            <--- 看到没,不再新增路径
a.txt
              0 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/3)
b.txt
              0 100%    0.00kB/s    0:00:00 (xfr#2, to-chk=0/3)

sent 168 bytes  received 57 bytes  450.00 bytes/sec
total size is 0  speedup is 0.00

3. 结论

到此,如果你还没有发现问题在哪,我们来对比下:

# 异常
rsync -auvt --progress --ignore-existing --ignore-errors ./abc/a ./bcd
# 正常
rsync -auvt --progress --ignore-existing --ignore-errors ./abc/a/ ./bcd

也就是说,源地址中,最后少了个斜杠。看来想做个 斜杠好少年并没有那么容易,一不小心掉坑里,真是几天爬不出来。