Rsync
(幾乎-)合併2個文件夾的原子方式
我正在探索為文件部署操作添加一些一致性的不同方法。目前的情況是:
current
包含大約 100K 個不同文件的版本文件夾
/目前的
/路徑1
- 文件 1
- 文件2
- …
/path2 - 文件 X
…
一個
update
包含大約 100 個文件的文件夾
/更新
/路徑1
- 文件 1
/path2 - 文件 X
…
最終目標是將所有文件從文件夾發送
update
到文件current
夾,我堅持“全部”。如果操作期間出現錯誤,則不應複製任何文件,或者應部署所有文件以將操作標記為成功。用一個理想的話來說,我正在尋找的場景將是一個“原子”rsync,它將根據操作期間發生的情況返回失敗錯誤程式碼或成功錯誤程式碼,並確保原始
current
目錄可以被看到系統立即(rsync
操作後)作為較新版本(= 由於潛在的電氣中斷或其他原因,在複製期間沒有中間狀態..)。據我了解,原子操作在大多數 UNIX 系統上是不可用的,所以我認為理想情況顯然不會達到。我試圖盡可能地近似這種行為。
我為此探索了不同的解決方案:
cp -al
將目錄鏡像current
到一個tmp
目錄,然後從其中的目錄中複製所有文件update
,然後刪除current
並重命名tmp
為current
rsync
(到目前為止最相關的)使用該--link-dest
選項來創建一個中間文件夾,其中包含指向current
目錄文件的硬連結。與前一種情況基本相同,但可能更清潔,因為它不需要任何cp
.atomic-rsync
我遇到了一個現有的 perl 腳本Perl atomic-rsync據說它會執行這種操作,但這導致只考慮目錄中存在的update
文件並擺脫“增量文件”current
文件夾。這兩種解決方案似乎都有效,但我對在實際生產案例中使用它們中的任何一個都沒有信心,問題是創建 100K 硬連結可能非常緩慢或成本高昂/無用。
current
我也知道一個非常一致的解決方案是使用快照並且有很多選項,但由於磁碟大小(~70GB 並且文件夾已經佔用~60GB),在我的情況下這是不可接受的。我用盡了我所知道的選項,是否有任何(更好的)方法來實現預期目標?
考慮使用 BTRFS 和快照。