JuiceFS 新手必知 24 問

JuiceFS 是一個創(chuàng)新性的軟件產(chǎn)品,很多初次嘗試的小伙伴對產(chǎn)品和用法感到很多疑惑,所以為了幫助大家快速理解并上手 JuiceFS,我們整理了24個關于 JuiceFS 經(jīng)典的問題答案,相信經(jīng)過這 24 問,大家對 JuiceFS 會有更清晰的認識,使用上也會更加得心應手。

1. JuiceFS 的基本能力是什么

JuiceFS 是一款面向云原生設計的高性能共享文件系統(tǒng),在 Apache 2.0 開源協(xié)議下發(fā)布。提供完備的 POSIX 兼容性,可將幾乎所有對象存儲接入本地作為海量本地磁盤使用,亦可同時在跨平臺、跨地區(qū)的不同主機上掛載讀寫。

2. JuiceFS 的性能如何

JuiceFS 是一個分布式文件系統(tǒng),元數(shù)據(jù)訪問的延時取決于掛載點到服務端之間 1 到 2 個網(wǎng)絡來回(通常 1-3 ms),數(shù)據(jù)訪問的延時取決于對象存儲的延時 (通常 20-100 ms)。順序讀寫的吞吐量可以到 50MiB/s 至 2800MiB/s(查看 fio 測試結(jié)果),取決于網(wǎng)絡帶寬以及數(shù)據(jù)是否容易被壓縮。

JuiceFS 內(nèi)置多級緩存(主動失效),一旦緩存預熱好,訪問的延時和吞吐量非常接近單機文件系統(tǒng)的性能(FUSE 會帶來少量的開銷)。

3. JuiceFS 的運行的必要條件

在運行前,需要準備元數(shù)據(jù)引擎與對象存儲, 元數(shù)據(jù)引擎中存儲的是文件的名稱,大小,修改時間等元數(shù)據(jù),而對象存儲中存儲的是文件的內(nèi)容。

元數(shù)據(jù)引擎當前支持:Redis,TiKV,MySQL,PostgreSQL等,當前元數(shù)據(jù)引擎的支持清單與具體配置參考如何設置元數(shù)據(jù)引擎文檔

對象存儲支持的就更多了,基本常見的對象存儲都支持了,比如 AWS S3,阿里云 OSS,華為云 OBS,騰訊云 COS等等,另外為了方便測試,還特別支持本地磁盤作為對象存儲。當前對象存儲的支持清單與具體配置參考如何設置對象存儲文檔

4. JuiceFS 使用的步驟

使用步驟非常簡單,分兩步,第一步格式化,第二步掛載到本地。下面就是使用 JuiceFS 與 Redis 將阿里云 OSS 掛載到本地的示例:

# 1. 格式化一個文件系統(tǒng)
juicefs format \
--storage oss \
--bucket https://zhijian-dev.oss-cn-hangzhou.aliyuncs.com \
--access-key xxxx \ 
--secret-key xxxx \
redis://localhost:6379/1 \
test1 

# 2. 后臺掛載文件系統(tǒng)到 /tmp/jfs 目錄
juicefs mount -d redis://localhost:6379/1 /tmp/jfs

5. 最快體驗 JuiceFS 的方式

我本地沒有 Redis,也沒有對象存儲,能否體驗 JuiceFS 那 ?當然可以,拉起 JuiceFS 服務需要元數(shù)據(jù)引擎以及對象存儲兩個組件,但在這兩個組件我們可以使用最簡單的,比如元數(shù)據(jù)引擎用 SQLite這個嵌入式數(shù)據(jù)庫,而對象存儲使用本地磁盤(format 時的—bucket參數(shù)不填即為默認參數(shù),默認為使用本地磁盤作為對象存儲,root 用戶默認存儲路徑為 /var/jfs
,普通用戶默認存儲路徑為 ~/.juicefs/local)。這樣就可以只需要 JuiceFS 二進制不需要任何外部組件就能體驗 JuiceFS 產(chǎn)品了。

# 1. 使用 sqlite 作為元數(shù)據(jù)引擎格式化文件系統(tǒng) 
juicefs format "sqlite3://my-jfs.db" test1

# 2. 后臺掛載文件系統(tǒng)到 /tmp/jfs 目錄
juicefs mount -d sqlite3://my-jfs.db /tmp/jfs

6. 可以用 root 以外的用戶掛載嗎

可以,JuiceFS 可以由任何用戶掛載。默認的緩存目錄是 $HOME/.juicefs/cache(macOS)或者 /var/jfsCache(Linux),請確保該用戶對這個目錄有寫權(quán)限,或者切換到其它有權(quán)限的目錄。請查看「客戶端讀緩存」了解更多信息。

7. JuiceFS 對 POSIX 協(xié)議的兼容性如何

JuiceFS 借助 PjdfstestLTP 來驗證其對 POSIX 的兼容性,最終測試結(jié)果為通過了 pjdfstest 中的所有測試用例以及 LTP 中的絕大部分用例。

8. JuiceFS 除了普通掛載外還支持哪些方式訪問數(shù)據(jù)

除了普通掛載外,還支持以下幾種方式:

  • Kuberenetes CSI 驅(qū)動:通過 Kubernetes CSI 驅(qū)動的方式將 JuiceFS 作為 Kubernetes 集群的存儲層,詳情請參考「Kubernetes 使用 JuiceFS」。
  • Hadoop Java SDK:方便在 Hadoop 體系中使用兼容 HDFS 接口的 Java 客戶端訪問 JuiceFS。詳情請參考「Hadoop 使用 JuiceFS」
  • S3 網(wǎng)關:通過 S3 協(xié)議訪問 JuiceFS,詳情請參考「配置 JuiceFS S3 網(wǎng)關」。
  • Docker Volume 插件:在 Docker 中方便使用 JuiceFS 的方式,詳情請參考「Docker 使用 JuiceFS」。
  • WebDAV 網(wǎng)關:通過 WebDAV 協(xié)議訪問 JuiceFS

9. 支持哨兵或者集群模式的 Redis 作為 JuiceFS 的元數(shù)據(jù)引擎嗎?

支持,另外這里還有一篇 Redis 作為 JuiceFS 元數(shù)據(jù)引擎的最佳實踐文章可供參考。

10. 如何測試 JuiceFS 的性能

將 JuiceFS Mount 到本地目錄后,對這個目錄執(zhí)行 JuiceFS bench 命令。JuiceFS bench 命令會在該目錄上進行大文件與小文件讀寫測試。比如:

# /tmp/jfs 是 JuiceFS 掛載在本地的目錄
$ juicefs bench /tmp/jfs
Cleaning kernel cache, may ask for root privilege...
Password:
  Write big blocks count: 1024 / 1024 [==============================================================]  done
   Read big blocks count: 1024 / 1024 [==============================================================]  done
Write small blocks count: 100 / 100 [==============================================================]  done
 Read small blocks count: 100 / 100 [==============================================================]  done
  Stat small files count: 100 / 100 [==============================================================]  done
Benchmark finished!
BlockSize: 1 MiB, BigFileSize: 1024 MiB, SmallFileSize: 128 KiB, SmallFileCount: 100, NumThreads: 1
+------------------+-----------------+--------------+
|       ITEM       |      VALUE      |     COST     |
+------------------+-----------------+--------------+
|   Write big file |   1236.96 MiB/s |  0.83 s/file |
|    Read big file |   2962.88 MiB/s |  0.35 s/file |
| Write small file |  2277.4 files/s | 0.44 ms/file |
|  Read small file |  2753.0 files/s | 0.36 ms/file |
|        Stat file | 16603.3 files/s | 0.06 ms/file |
+------------------+-----------------+--------------+

juicefs bench命令還可以作為 mount 后的簡單的測試方便快速判斷 JuiceFS 服務是否正常。更多關于 JuiceFS 性能測試相關的問題可以看這篇性能評估指南文檔

11. 如何測試對象存儲的兼容性與性能

對象存儲是 JuiceFS 的重要的組件,對象存儲的正確性與性能直接影響 JuiceFS 服務的正確性與性能,所以當 JuiceFS 出現(xiàn)問題的時候可以嘗試先排除對象存儲出問題的可能性。為了方便大家測試,我們內(nèi)置了juicefs objbench命令,該命令可以快速測試對象存儲的正確性以及其性能。示例:

$ juicefs objbench --storage minio  http://127.0.0.1:9000/testbucket --access-key admin --secret-key admin123
Start Functional Testing ...
+----------+---------------------+-------------+
| CATEGORY |         TEST        |    RESULT   |
+----------+---------------------+-------------+
|    basic |     create a bucket |        pass |
|    basic |       put an object |        pass |
|    basic |       get an object |        pass |
|    basic |       get non-exist |        pass |
|    basic |  get partial object |        pass |
|    basic |      head an object |        pass |
|    basic |    delete an object |        pass |
|    basic |    delete non-exist |        pass |
|    basic |        list objects |        pass |
|     sync |    put a big object |        pass |
|     sync | put an empty object |        pass |
|     sync |    multipart upload |        pass |
|     sync |  change owner/group | not support |
|     sync |   change permission | not support |
|     sync |        change mtime | not support |
+----------+---------------------+-------------+

Start Performance Testing ...
put small objects count: 100 / 100 [==============================================================]  done
get small objects count: 100 / 100 [==============================================================]  done
   upload objects count: 256 / 256 [==============================================================]  done
 download objects count: 256 / 256 [==============================================================]  done
     list objects count: 100 / 100 [==============================================================]  done
     head objects count: 100 / 100 [==============================================================]  done
   delete objects count: 100 / 100 [==============================================================]  done
Benchmark finished! block-size: 4096 KiB, big-object-size: 1024 MiB, small-object-size: 128 KiB, small-objects: 100, NumThreads: 4
+--------------------+--------------------+-----------------+
|        ITEM        |        VALUE       |       COST      |
+--------------------+--------------------+-----------------+
|     upload objects |        67.12 MiB/s | 59.59 ms/object |
|   download objects |       106.86 MiB/s | 37.43 ms/object |
|  put small objects |    508.2 objects/s |  1.97 ms/object |
|  get small objects |    728.0 objects/s |  1.37 ms/object |
|       list objects | 46890.01 objects/s |      2.13 ms/op |
|       head objects |   2861.2 objects/s |  0.35 ms/object |
|     delete objects |   2295.1 objects/s |  0.44 ms/object |
| change permissions |        not support |     not support |
| change owner/group |        not support |     not support |
|       update mtime |        not support |     not support |
+--------------------+--------------------+-----------------+

12. 卸載掛載點報 Resource busy -- try 'diskutil unmount' 錯誤

這代表掛載點下的某個文件或者目錄正在被使用,無法直接 umount,可以檢查(如通過 lsof 命令)是否有打開的終端正位于 JuiceFS 掛載點的某個目錄,或者某個應用程序正在處理掛載點中的文件。如果有,則退出終端或應用程序后再嘗試使用 juicefs umount 命令卸載文件系統(tǒng)。

13. 如何銷毀一個文件系統(tǒng)

使用 juicefs destroy 命令銷毀一個文件系統(tǒng),該命令將會清空元數(shù)據(jù)引擎與對象存儲中的相關數(shù)據(jù)。關于該命令的使用詳情請參考文檔

14. JuiceFS 的日志在哪里

JuiceFS 后臺掛載的時候日志才會寫入日志文件,前臺掛載或者其他前臺的命令都會將日志直接打印到終端

Mac 系統(tǒng)上日志文件默認是/Users/$User/.juicefs/juicefs.log

Linux 系統(tǒng)上日志文件默認是/var/log/juicefs.log

15. 為什么在對象存儲中看不到存入 JuiceFS 的原文件

使用 JuiceFS,文件最終會被拆分成 Chunks、Slices 和 Blocks 存儲在對象存儲。因此,你會發(fā)現(xiàn)在對象存儲平臺的文件瀏覽器中找不到存入 JuiceFS 的源文件,存儲桶中只有一個 chunks 目錄和一堆數(shù)字編號的目錄和文件。不要驚慌,這正是 JuiceFS 文件系統(tǒng)高性能運作的秘訣!詳情參考 JuiceFS 如何存儲文件

16. JuiceFS 隨機寫的基本原理是什么

JuiceFS 不將原始文件存入對象存儲,而是將其按照某個大?。J為 4MiB)拆分為 N 個數(shù)據(jù)塊(Block)后,上傳到對象存儲,然后將數(shù)據(jù)塊的 ID 存入元數(shù)據(jù)引擎。隨機寫的時候,邏輯上是要覆蓋原本的內(nèi)容,實際上是把要覆蓋的數(shù)據(jù)塊的元數(shù)據(jù)標記為舊數(shù)據(jù),同時只上傳隨機寫時產(chǎn)生的新數(shù)據(jù)塊到對象存儲,并將新數(shù)據(jù)塊對應的元數(shù)據(jù)更新到元數(shù)據(jù)引擎中。

當讀取被覆蓋部分的數(shù)據(jù)時,根據(jù)最新的元數(shù)據(jù),從隨機寫時上傳的新數(shù)據(jù)塊讀取即可,同時舊數(shù)據(jù)塊可能會被后臺運行的垃圾回收任務自動清理。這樣就將隨機寫的復雜度轉(zhuǎn)移到讀的復雜度上,。

這個只是很粗略的實現(xiàn)邏輯介紹,具體的讀寫流程非常復雜,可以研讀 JuiceFS內(nèi)部實現(xiàn)讀寫流程這兩篇文檔并結(jié)合代碼一起梳理。

17. 為什么我在掛載點刪除了文件,但是對象存儲占用空間沒有變化或者變化很小

第一個原因是你可能開起了回收站特性,為了保證數(shù)據(jù)安全回收站默認開啟,刪除的文件其實被放到了回收站,實際并沒有被刪除,所以對象存儲大小不會變化?;厥照镜谋A魰r間可以通過 juicefs format指定或者通過 juicefs config 修改。請參考「回收站」文檔了解更多信息。

第二個原因是 JuiceFS 是異步刪除對象存儲中的數(shù)據(jù),所以對象存儲的空間變化會慢一點。如果你需要立即清理對象存儲中需要被刪除的數(shù)據(jù),可以嘗試運行 juicefs gc命令。

18. 為什么掛載點顯示的大小與對象存儲占用空間存在差異

通過「JuiceFS 支持隨機寫的實現(xiàn)原理是什么?」這個問題的答案可以推斷出,對象存儲的占用空間大部分情況下是大于等于實際大小的,尤其是短時間內(nèi)進行大量的覆蓋寫產(chǎn)生許多文件碎片后。這些碎片在未觸發(fā)合并與回收前其仍舊占用著對象存儲的空間。不過也不必擔心這些碎片一直占用空間,因為在每次讀/寫文件的時候都會檢查并在必要的時候觸發(fā)該文件相關碎片的整理工作。另外你可以通過 juicefs gc —-compact -—delete 命令手動觸發(fā)合并與回收。

另外如果 JuiceFS 文件系統(tǒng)開啟了壓縮功能(默認不開啟),那么對象存儲上存儲的對象有可能比實際文件大小更?。ㄈQ于不同類型文件的壓縮比)。

如果以上因素都已經(jīng)排除,請檢查你使用的對象存儲的存儲類型是什么,云服務商可能會針對某些存儲類型設置最小計量單位。例如阿里云 OSS 低頻訪問存儲的最小計量單位是 64KB,如果單個文件小于 64KB 也會按照 64KB 計算。

19. JuiceFS S3 網(wǎng)關支持多用戶管理等高級功能嗎

JuiceFS 內(nèi)置的 gateway 子命令不支持多用戶管理等功能,只提供基本的 S3 Gateway 功能。如果需要使用這些高級功能,可以參考我們的這個倉庫,其將 JuiceFS 作為 MinIO gateway 后端的一種實現(xiàn),支持 MinIO gateway 的完整功能。

20. JuiceFS 與 XXX 的區(qū)別是什么

請查看「同類技術對比」文檔了解更多信息。

21. JuiceFS 支持使用對象存儲中的某個目錄作為 —-bucket 選項的值嗎

到 JuiceFS 1.0.0-rc3 為止,還不支持該功能。

22. JuiceFS 支持讀取對象存儲中已經(jīng)存在的數(shù)據(jù)嗎

到 JuiceFS 1.0.0-rc3 為止,還不支持該功能。

23. JuiceFS 目前支持分布式緩存嗎

到 JuiceFS 1.0.0-rc3 為止,還不支持該功能

24. JuiceFS 目前有 SDK 可以使用嗎

截止到 JuiceFS 1.0.0-rc3 發(fā)布,社區(qū)有兩個 SDK,一個是 Juicedata 官方維護的 HDFS 接口高度兼容的 Java SDK,另一個是由社區(qū)用戶維護的 Python SDK。

如有幫助的話歡迎關注我們項目 Juicedata/JuiceFS 喲! (0?0?)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容