フランス拠点の障害対応でrsyncの差分転送が止まった原因

这篇内容暂时只有 日本語 版本,以下是原文。

フランスの拠点で、障害対応用のログ収集スクリプトが特定の条件で止まる現象を追った。環境は Debian 11、rsync 3.2.3、日次で 40GB 前後のログをパリの踏み台から日本の保管庫へ転送している。障害時は直近 2 時間分だけを別ディレクトリに集めて転送する運用で、普段は 1 分未満で終わる処理が、ある夜だけ 25 分経っても終わらずタイムアウトした。

再現したのはファイル数が 12 万を超え、かつ同時刻に書き込みが続いているケース。ls では見えるのに rsync が「file has vanished」を繰り返していた。まず転送をファイル単位からディレクトリ単位に変え、消えても致命的でないものは除外した。

rsync -a --delete-delay \
  --exclude='*.tmp' --exclude='*.log.1' \
  --timeout=120 --contimeout=15 \
  /var/log/app/ incident@storage:/srv/incident/2024-xx/

加えて、rsync の前に find で更新時刻を絞り、対象を 1 時間以内に書かれたものだけにした。find /var/log/app -type f -mmin -90 -print0 | rsync -a --files-from=- --from0 / /srv/stage/ のように一度ステージングへ寄せてから転送すると、転送中のファイル消失を避けられる。

なぜこれで直るかというと、rsync はファイル一覧を作った時点と転送時点の差に弱く、書き込みが続くディレクトリでは一覧と実体がずれる。ステージングにコピーする段階で「その瞬間のスナップショット」を作り、転送は静的な集合に対して行う。代わりにディスクを一時的に余分に食う。40GB なら 1.5 倍は見ておいたほうがいい。

効かない境界もある。ファイル数が 50 万を超えると find の一覧作成自体が重くなり、ステージングのコピーも O(n) で効いてくる。また NFS 越しのステージングは、かえって遅くなる例を見た。自分の場合はローカル SSD に置いてから転送する形に落ち着いた。

同じように「ls では見えるのに転送から漏れる」現象を、フランス側のどのツールで踏んだか。書き込みが続くディレクトリをどう切っているか、運用を聞いてみたい。

0
赞同度 100% · 0 条评论 · 2 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。