近年來,雲計算已成為主流,企業從自身利益出發,或是不願意被單一雲服務商鎖定,或是業務和數據冗餘,或是出於成本優化考慮,會嘗試將部分或者全部業務從線下機房遷移到雲或者從一個雲平臺遷移到另一個雲平臺,業務遷移涉及到數據的遷移。正好 JuiceFS 已經對接了各種對象存儲的 API ,也實現了數據同步的邏 ...
近年來,雲計算已成為主流,企業從自身利益出發,或是不願意被單一雲服務商鎖定,或是業務和數據冗餘,或是出於成本優化考慮,會嘗試將部分或者全部業務從線下機房遷移到雲或者從一個雲平臺遷移到另一個雲平臺,業務遷移涉及到數據的遷移。正好 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:SECRET_KEY@]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
- Bucket 名:aaa
- Endpoint:
https://aaa.s3.us-west-1.amazonaws.com
-
對象存儲 B
- Bucket 名:bbb
- Endpoint:
https://bbb.oss-cn-hangzhou.aliyuncs.com
-
JuiceFS 文件系統
- 元數據存儲:
redis://10.10.0.8:6379/1
- 對象存儲:
https://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✿)