巧用 JuiceFS Sync 命令跨雲遷移和同步資料
近年來,雲端計算已成為主流,企業從自身利益出發,或是不願意被單一雲服務商鎖定,或是業務和資料冗餘,或是出於成本優化考慮,會嘗試將部分或者全部業務從線下機房遷移到雲或者從一個雲平臺遷移到另一個雲平臺,業務遷移涉及到資料的遷移。正好 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
是儲存型別,比如s3
、oss
。詳情檢視所有支援的儲存服務ACCESS_KEY
和SECRET_KEY
是物件儲存的 API 訪問金鑰BUCKET[.ENDPOINT]
是物件儲存的訪問地址PREFIX
是可選的,限定要同步的目錄名字首。
以下是一個 Amazon S3 物件儲存的地址範例:
s3://ABCDEFG:[email protected]
特別地,SRC
和 DST
如果以 /
結尾將被視為目錄,例如:movies/
。沒有以 /
結尾則會被視為「字首」,將按照字首匹配的規則進行匹配,例如,當前目錄下有 test
和 text
兩個目錄,使用以下命令可以將它們同步到目標路徑 ~/mnt/
:
juicefs sync ./te ~/mnt/te
使用這種方式,sync
命令會以 te
字首匹配當前路徑下所有包含該字首的目錄或檔案,即 test
和 text
。而目標路徑 ~/mnt/te
中的 te
也是字首,它會替換所有同步過來的目錄和檔案的字首,在此示例中是將 te
替換為 te
,即保持字首不變。如果調整目標路徑的字首,例如將目標字首改為 ab
:
juicefs sync ./te ~/mnt/ab
目標路徑中同步來的 test
目錄名會變成 abst
,text
會變成 abxt
。
資源清單
這裡假設有以下儲存資源:
-
物件儲存 A <span id="bucketA" />
- Bucket 名:aaa
- Endpoint:
http://aaa.s3.us-west-1.amazonaws.com
-
物件儲存 B <span id="bucketB" />
- Bucket 名:bbb
- Endpoint:
http://bbb.oss-cn-hangzhou.aliyuncs.com
-
JuiceFS 檔案系統 <span id="bucketC" />
- 元資料儲存:
redis://10.10.0.8:6379/1
- 物件儲存:
http://ccc-125000.cos.ap-beijing.myqcloud.com
- 元資料儲存:
所有儲存的訪問金鑰均為:
- ACCESS_KEY:
ABCDEFG
- SECRET_KEY:
HIJKLMN
物件儲存與 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
選項開啟遇到符號鏈時同步其自身而不是其指向的物件的功能。同步後的符號連結指向的路徑為源符號連結中儲存的原始路徑,無論該路徑在同步前後是否可達都不會被轉換。
另外需要注意的幾個細節
- 符號連結自身的
mtime
不會被拷貝; --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✿)
- 30款提升組織效能 SaaS 工具,我們的寶藏工具箱大公開
- Grafana Prometheus 搭建 JuiceFS 視覺化監控系統
- 移動雲使用 JuiceFS 支援 Apache HBase 增效降本的探索
- Grafana Prometheus 搭建 JuiceFS 視覺化監控系統
- JuiceFS 在資料湖儲存架構上的探索
- JuiceFS 在資料湖儲存架構上的探索
- JuiceFS 快取預熱詳解
- JuiceFS 快取預熱詳解
- 巧用 JuiceFS Sync 命令跨雲遷移和同步資料
- 巧用 JuiceFS Sync 命令跨雲遷移和同步資料
- 老同事拉我創業,做一家開源儲存公司
- 小團隊如何妙用 JuiceFS
- 社群投稿|小團隊如何妙用 JuiceFS
- CSI 工作原理與JuiceFS CSI Driver 的架構設計詳解
- JuiceFS CSI Driver 架構設計詳解
- 怎麼做 HDFS 的原地平滑縮容?
- 來自開源社群的她力量
- 雲上共享檔案系統的相容性大比拼
- 用 JuiceFS 備份 Nginx 日誌可以這麼簡單
- 讓 JuiceFS 幫你做好「異地備份」