巧用 JuiceFS Sync 命令跨雲遷移和同步資料

語言: CN / TW / HK

近年來,雲端計算已成為主流,企業從自身利益出發,或是不願意被單一雲服務商鎖定,或是業務和資料冗餘,或是出於成本優化考慮,會嘗試將部分或者全部業務從線下機房遷移到雲或者從一個雲平臺遷移到另一個雲平臺,業務遷移涉及到資料的遷移。正好 JuiceFS 已經對接了各種物件儲存的 API ,也實現了資料同步的邏輯,讓我們來了解下 JuiceFS 的 sync 命令。

什麼是 JuiceFS Sync

JuiceFS 的 sync 子命令是功能完整的資料同步實用工具,可以在所有 JuiceFS 支援的物件儲存之間多執行緒併發同步或遷移資料,既支援在「物件儲存」與「JuiceFS」之間遷移資料,也支援在「物件儲存」與「物件儲存」之間跨雲跨區遷移資料。與 rsync 類似,除了物件儲存也支援同步本地目錄、通過 SSH 訪問遠端目錄、HDFS、WebDAV 等,同時提供全量同步、增量同步、條件模式匹配等高階功能。

基本用法

命令格式

juicefs sync [command options] SRC DST

即把 SRC 同步到 DST,既可以同步目錄,也可以同步檔案。

其中:

  • SRC 代表資料來源地址及路徑
  • DST 代表目標地址及路徑
  • [command options] 代表可選的同步選項,詳情檢視命令參考

地址格式均為 [NAME://][ACCESS_KEY:[email protected]]BUCKET[.ENDPOINT][/PREFIX]

其中:

  • NAME 是儲存型別,比如 s3oss。詳情檢視所有支援的儲存服務
  • ACCESS_KEYSECRET_KEY 是物件儲存的 API 訪問金鑰
  • BUCKET[.ENDPOINT] 是物件儲存的訪問地址
  • PREFIX 是可選的,限定要同步的目錄名字首。

以下是一個 Amazon S3 物件儲存的地址範例:

s3://ABCDEFG:[email protected]

特別地,SRCDST 如果以 / 結尾將被視為目錄,例如:movies/。沒有以 / 結尾則會被視為「字首」,將按照字首匹配的規則進行匹配,例如,當前目錄下有 testtext 兩個目錄,使用以下命令可以將它們同步到目標路徑 ~/mnt/

juicefs sync ./te ~/mnt/te

使用這種方式,sync 命令會以 te 字首匹配當前路徑下所有包含該字首的目錄或檔案,即 testtext。而目標路徑 ~/mnt/te 中的 te 也是字首,它會替換所有同步過來的目錄和檔案的字首,在此示例中是將 te 替換為 te,即保持字首不變。如果調整目標路徑的字首,例如將目標字首改為 ab

juicefs sync ./te ~/mnt/ab

目標路徑中同步來的 test 目錄名會變成 absttext 會變成 abxt

資源清單

這裡假設有以下儲存資源:

  1. 物件儲存 A <span id="bucketA" />

    • Bucket 名:aaa
    • Endpoint:https://aaa.s3.us-west-1.amazonaws.com
  2. 物件儲存 B <span id="bucketB" />

    • Bucket 名:bbb
    • Endpoint:https://bbb.oss-cn-hangzhou.aliyuncs.com
  3. JuiceFS 檔案系統 <span id="bucketC" />

    • 元資料儲存:redis://10.10.0.8:6379/1
    • 物件儲存:https://ccc-125000.cos.ap-beijing.myqcloud.com

所有儲存的訪問金鑰均為:

  • ACCESS_KEYABCDEFG
  • SECRET_KEYHIJKLMN

物件儲存與 JuiceFS 之間同步

將 物件儲存 A 的 movies 目錄同步到 JuiceFS 檔案系統:

# 掛載 JuiceFS
sudo juicefs mount -d redis://10.10.0.8:6379/1 /mnt/jfs
# 執行同步
juicefs sync s3://ABCDEFG:[email protected]/movies/ /mnt/jfs/movies/

將 JuiceFS 檔案系統的 images 目錄同步到 物件儲存 A:

# 掛載 JuiceFS
sudo juicefs mount -d redis://10.10.0.8:6379/1 /mnt/jfs
# 執行同步
juicefs sync /mnt/jfs/images/ s3://ABCDEFG:[email protected]/images/

物件儲存與物件儲存之間同步

將物件儲存 A的全部資料同步到物件儲存 B:

juicefs sync s3://ABCDEFG:[email protected] oss://ABCDEFG:[email protected]

高階用法

增量同步與全量同步

sync 命令預設以增量同步方式工作,即先對比源路徑與目標路徑之間的差異,然後僅同步有差異的部分。可以使用 --update-u 選項更新檔案的 mtime

如需全量同步,即不論目標路徑上是否存在相同的檔案都重新同步,可以使用 --force-update-f。例如,將物件儲存 A 的 movies 目錄全量同步到 JuiceFS 檔案系統:

# 掛載 JuiceFS
sudo juicefs mount -d redis://10.10.0.8:6379/1 /mnt/jfs
# 執行全量同步
juicefs sync --force-update s3://ABCDEFG:[email protected]/movies/ /mnt/jfs/movies/

模式匹配

sync 命令的模式匹配功能跟 rsync 類似,可以通過規則排除或包含某類檔案,並通過多個規則的組合實現任意集合的同步,規則如下:

  • / 結尾的模式會僅匹配目錄,否則會匹配檔案、連結或裝置;
  • 包含 *?[ 字元時會以萬用字元模式匹配,否則按照常規字串匹配;
  • * 匹配任意非空路徑元件,在 / 處停止匹配;
  • ? 匹配除 / 外的任意字元;
  • [ 匹配一組字元集合,例如 [a-z][[:alpha:]]
  • 在萬用字元模式中,反斜槓可以用來轉義萬用字元,但在沒有萬用字元的情況下,會按字面意思匹配;
  • 始終以模式作為字首遞迴匹配。

排除檔案/目錄

使用 --exclude 選項設定要排除的目錄或檔案。例如,將 JuiceFS 檔案系統完整同步到物件儲存 A,但不同步隱藏的檔案和資料夾:

在 Linux 系統中所有以 . 開始的名稱均被視為隱藏檔案

# 掛載 JuiceFS
sudo juicefs mount -d redis://10.10.0.8:6379/1 /mnt/jfs
# 完整同步,排除隱藏檔案和目錄
juicefs sync --exclude '.*' /mnt/jfs/ s3://ABCDEFG:[email protected]/

可以重複該選項匹配更多規則,例如,排除所有隱藏檔案、pic/ 目錄 和 4.png 檔案:

juicefs sync --exclude '.*' --exclude 'pic/' --exclude '4.png' /mnt/jfs/ s3://ABCDEFG:[email protected]

包含檔案/目錄

使用 --include 選項設定要包含(不被排除)的目錄或檔案,例如,只同步 pic/4.png 兩個檔案,其他檔案都排除:

juicefs sync --include 'pic/' --include '4.png' --exclude '*' /mnt/jfs/ s3://ABCDEFG:[email protected]

在使用包含/排除規則時,位置在前的選項優先順序更高。--include 應該排在前面,如果先設定 --exclude '*' 排除了所有檔案,那麼後面的 --include 'pic/' --include '4.png' 包含規則就不會生效。

多執行緒和頻寬限制

JuiceFS sync 預設啟用 10 個執行緒執行同步任務,可以根據需要設定 --thread 選項調大或減少執行緒數。

另外,如果需要限制同步任務佔用的頻寬,可以設定 --bwlimit 選項,單位 Mbps,預設值為 0 即不限制。

目錄結構與檔案許可權

預設情況下,sync 命令只同步檔案物件以及包含檔案物件的目錄,空目錄不會被同步。如需同步空目錄,可以使用 --dirs 選項。

另外,在 local、sftp、hdfs 等檔案系統之間同步時,如需保持檔案許可權,可以使用 --perms 選項。

拷貝符號連結

JuiceFS sync本地目錄之間同步時,支援通過設定 --links 選項開啟遇到符號鏈時同步其自身而不是其指向的物件的功能。同步後的符號連結指向的路徑為源符號連結中儲存的原始路徑,無論該路徑在同步前後是否可達都不會被轉換。

另外需要注意的幾個細節

  1. 符號連結自身的 mtime 不會被拷貝;
  2. --check-new--perms 選項的行為在遇到符號連結時會被忽略。

多機併發同步

本質上在兩個物件儲存之間同步資料就是從一端拉取資料再推送到另一端,如下圖所示,同步的效率取決於客戶端與雲之間的頻寬。

在同步大量資料時,單機頻寬往往會被佔滿出現瓶頸,針對這種情況,JuiceFS Sync 提供多機併發同步支援,如下圖。

Manager 作為主控執行 sync 命令,通過 --worker 引數定義多個 Worker 主機,JuiceFS 會根據 Worker 的總數量,動態拆分同步的工作量並分發給各個主機同時執行。即把原本在一臺主機上處理的同步任務量拆分成多份,分發到多臺主機上同時處理,單位時間內能處理的資料量更大,總頻寬也成倍增加。

在配置多機併發同步任務時,需要提前配置好 Manager 主機到 Worker 主機的 SSH 免密登陸,確保客戶端和任務能夠成功分發到 Worker。

Manager 會將 JuiceFS 客戶端程式分發到 Worker 主機,為了避免客戶端的相容性問題,請確保 Manager 和 Worker 使用相同型別和架構的作業系統。

例如,將物件儲存 A 同步到物件儲存 B,採用多主機並行同步:

juicefs sync --worker [email protected],[email protected] s3://ABCDEFG:[email protected] oss://ABCDEFG:[email protected]

當前主機與兩個 Worker 主機 [email protected][email protected] 將共同分擔兩個物件儲存之間的資料同步任務。

如果 Worker 主機的 SSH 服務不是預設的 22 號埠,請在 Manager 主機通過 .ssh/config 配置檔案設定 Worker 主機的 SSH 服務埠號。

場景應用

資料異地容災備份

異地容災備份針對的是檔案本身,因此應將 JuiceFS 中儲存的檔案同步到其他的物件儲存,例如,將 JuiceFS 檔案系統中的檔案同步到物件儲存 A:

# 掛載 JuiceFS
sudo juicefs mount -d redis://10.10.0.8:6379/1 /mnt/jfs
# 執行同步
sudo juicefs sync /mnt/jfs/ s3://ABCDEFG:[email protected]/

同步以後,在物件儲存 A中可以直接看到所有的檔案。

建立 JuiceFS 資料副本

與面向檔案本身的容災備份不同,建立 JuiceFS 資料副本的目的是為 JuiceFS 的資料儲存建立一個內容和結構完全相同的映象,當使用中的物件儲存發生了故障,可以通過修改配置切換到資料副本繼續工作。需要注意這裡僅複製了 JuiceFS 檔案系統的資料,並沒有複製元資料,元資料引擎的資料備份依然需要。

這需要直接操作 JucieFS 底層的物件儲存,將它與目標物件儲存之間進行同步。例如,要把物件儲存 B 作為 JuiceFS 檔案系統的資料副本:

juicefs sync cos://ABCDEFG:[email protected] oss://ABCDEFG:[email protected]

同步以後,在物件儲存 B 中看到的與 JuiceFS 使用的物件儲存中的內容和結構完全一樣。

如有幫助的話歡迎關注我們專案 Juicedata/JuiceFS 喲! (0ᴗ0✿)