JuiceFS 初心者は 24 の質問を知っておく必要があります

JuiceFS は革新的なソフトウェア製品です.初めて使用する友人の多くは、製品とその使用方法について多くの疑問を感じているため、JuiceFS をすばやく理解して使い始めるのに役立つように、古典的な質問に対する 24 の回答をまとめました。 JuiceFS について. これらの 24 の質問の後、誰もが JuiceFS をより明確に理解し、より便利に使用できるようになると思います。

1. JuiceFS の基本機能とは

JuiceFS は、クラウド ネイティブ向けに設計された高性能共有ファイル システムであり、Apache 2.0 オープン ソース契約に基づいてリリースされています。完全なPOSIX互換性を提供し、ほぼすべてのオブジェクト ストレージを大規模なローカル ディスクとしてローカルに接続できます。また、複数のプラットフォームや地域にまたがるさまざまなホストに同時にマウントして読み取ることもできます。

2. JuiceFS はどのように機能しますか?

JuiceFS は分散ファイル システムです. メタデータ アクセスのレイテンシは、マウント ポイントとサーバー間の 1 ~ 2 回のネットワーク ラウンド トリップ (通常は 1 ~ 3 ミリ秒) に依存します. データ アクセスのレイテンシは、オブジェクト ストレージのレイテンシに依存します. (通常は20 ~ 100 ミリ秒)。シーケンシャルな読み取りと書き込みのスループットは、ネットワーク帯域幅とデータが圧縮されやすいかどうかに応じて、50MiB/s から 2800MiB/s ( fio テスト結果を参照) に達する可能性があります。

JuiceFS には組み込みのマルチレベル キャッシュ (アクティブな無効化) があります. キャッシュがウォームアップされると、アクセス レイテンシとスループットはスタンドアロン ファイル システムのパフォーマンスに非常に近くなります (FUSE は少量のオーバーヘッドをもたらします)。 .

3. JuiceFSの動作に必要な条件

実行する前に、メタデータ エンジンとオブジェクト ストレージを準備する必要があります。メタデータ エンジンはファイルの名前、サイズ、変更時刻などのメタデータを格納し、オブジェクト ストレージはファイルのコンテンツを格納します。

メタデータ エンジンは現在、Redis、TiKV、MySQL、PostgreSQL などをサポートしています。現在のメタデータ エンジンのサポート リストと特定の構成については、メタデータ エンジンの設定方法に関するドキュメントを参照してください。

オブジェクト ストレージはより多くをサポートし、AWS S3、Alibaba Cloud OSS、Huawei Cloud OBS、Tencent Cloud COS など、基本的に一般的なオブジェクト ストレージがサポートされています。さらに、テストの便宜上、ローカル ディスクもオブジェクト ストレージとして特別にサポートされています。 . 現在のオブジェクト ストレージのサポート リストと特定の構成は、オブジェクト ストレージのドキュメントのセットアップ方法を参照してください。

4. JuiceFS の使用手順

使用手順は非常にシンプルで、最初のステップはフォーマット、次のステップはローカルにマウントするという 2 つのステップがあります。以下は、JuiceFS と Redis を使用して Alibaba Cloud OSS をローカルにマウントする例です。

# 1. 格式化一个文件系统
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. 后台挂载文件系统到 /tmp/jfs 目录
juicefs mount -d redis://localhost:6379/1 /tmp/jfs

5. JuiceFS を体験する最速の方法

ローカルに Redis またはオブジェクト ストレージを持っていませんが、JuiceFS を体験できますか? もちろん、JuiceFS サービスをプルアップすることも可能です. メタデータ エンジンとオブジェクト ストレージは 2 つのコンポーネントですが、これら 2 つのコンポーネントの中で最も単純なものを使用できます. たとえば、メタデータ エンジンは SQLite の組み込みデータベースを使用し、オブジェクト ストレージはオブジェクト ストレージを使用します.ローカル ディスクを使用します (フォーマット)—bucketパラメータが入力されていない場合、それがデフォルトのパラメータです。デフォルトでは、ローカル ディスクがオブジェクト ストレージとして使用されます。ルート ユーザーのデフォルトのストレージ パスは であり、通常のユーザーのデフォルトのストレージ パスは です/var/jfs~/.juicefs/local)。このように、JuiceFS バイナリのみによって、外部コンポーネントなしで JuiceFS 製品を体験できます。

# 1. 使用 sqlite 作为元数据引擎格式化文件系统 
juicefs format "sqlite3://my-jfs.db" test1

# 2. 后台挂载文件系统到 /tmp/jfs 目录
juicefs mount -d sqlite3://my-jfs.db /tmp/jfs

6.root以外の?

はい、JuiceFS はどのユーザーでもマウントできます。デフォルトのキャッシュ ディレクトリは$HOME/.juicefs/cache(macOS) または/var/jfsCache(Linux) です。ユーザーがこのディレクトリへの書き込み権限を持っていることを確認するか、権限のある別のディレクトリに切り替えてください。詳細については、「クライアント読み取りキャッシュ」を参照してください。

7. JuiceFS は POSIX プロトコルとどの程度互換性がありますか?

JuiceFS はPjdfstestLTPを使用して、POSIX との互換性を検証します. 最終的なテスト結果は、pjdfstest のすべてのテスト ケースと LTP のほとんどのユース ケースに合格したことです.

8. 通常のマウント以外に、データにアクセスするために JuiceFS がサポートする方法は何ですか?

通常の取り付けに加えて、以下の方法にも対応しています。

  • Kuberenetes CSI driver: Use JuiceFS as the storage layer of Kubernetes cluster through the Kubernetes CSI driver. 詳細については、「Kubernetes uses JuiceFS」を参照してください。
  • Hadoop Java SDK: Hadoop システムで JuiceFS にアクセスするには、HDFS インターフェースと互換性のある Java クライアントを使用すると便利です。詳しくは「JuiceFSを使ったHadoop」をご覧ください。
  • S3 ゲートウェイ: S3 プロトコルを介して JuiceFS にアクセスします。詳細については、「JuiceFS S3 ゲートウェイの構成」を参照してください。
  • Docker Volume プラグイン: Docker で JuiceFS を利用すると便利です. 詳しくは「Docker が JuiceFS を利用する」を参照してください.
  • WebDAV ゲートウェイ: WebDAV プロトコル経由で JuiceFS にアクセスします

9. Sentinel またはクラスターモードの Redis は JuiceFS メタデータエンジンをサポートしていますか?

サポートされています。参照用のJuiceFS メタデータ エンジンとしての Redis に関するベスト プラクティスの記事はこちらです。

10. JuiceFS のパフォーマンスをテストする方法

JuiceFS をローカル ディレクトリにマウントした後、このディレクトリで JuiceFS ベンチ コマンドを実行します。JuiceFS ベンチ コマンドは、このディレクトリで大小のファイルの読み取りおよび書き込みテストを実行します。例えば:

# /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このコマンドは、マウント後の簡単なテストとしても使用でき、JuiceFS サービスが正常かどうかをすばやく判断できます。JuiceFS のパフォーマンス テストに関するその他の質問については、このパフォーマンス評価ガイド ドキュメントを参照してください。

11.オブジェクトストレージの互換性とパフォーマンスをテストする方法

オブジェクト ストレージは JuiceFS の重要なコンポーネントです. オブジェクト ストレージの正確性とパフォーマンスは、JuiceFS サービスの正確性とパフォーマンスに直接影響します. したがって、JuiceFS に問題がある場合は、オブジェクト ストレージの問題の可能性を排除することができます. 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'エラー

これは、マウント ポイントの下にある特定のファイルまたはディレクトリが使用されていることを意味します。JuiceFSマウント ポイントの特定のディレクトリに開いているターミナルがあるかどうか、またはアプリケーションが処理中であるかどうかをumount(lsofコマンドことはできません。マウント ポイント.ロードポイント内のファイル。その場合は、juicefs umountコマンドを。

13. ファイルシステムを破壊する方法

juicefs destroyコマンドを使用してファイル システムを破棄します。このコマンドは、メタデータ エンジンとオブジェクト ストレージ内の関連データを消去します。このコマンドの使用方法の詳細については、ドキュメントを参照してください。

14. JuiceFS ログはどこにありますか

JuiceFS がバックグラウンドでマウントされている場合、ログはログ ファイルに書き込まれ、フォアグラウンドまたは他のフォアグラウンド コマンドでマウントされている場合、ログは端末に直接出力されます。

Mac システムのデフォルトのログ ファイルは/Users/$User/.juicefs/juicefs.log

Linux システムのデフォルトのログ ファイルは次のとおりです。/var/log/juicefs.log

15. JuiceFS に保存されている元のファイルがオブジェクト ストレージに表示されないのはなぜですか

JuiceFS を使用すると、ファイルは最終的にチャンク、スライス、ブロックに分割され、オブジェクト ストレージに格納されます。そのため、JuiceFS に保存されているソース ファイルは、オブジェクト ストレージ プラットフォームのファイル ブラウザーで見つけることができず、ストレージ バケットには、チャンク ディレクトリと、デジタル番号が付けられた一連のディレクトリとファイルしかありません。パニックにならないでください。これが JuiceFS ファイル システムの高性能の秘密です。詳細については、JuiceFS がファイルを保存する方法を参照してください

16. JuiceFS ランダム書き込みの基本原理は何ですか?

JuiceFS は、元のファイルをオブジェクト ストレージに格納するのではなく、特定のサイズ (デフォルトで 4MiB) に従って N 個のデータ ブロック (ブロック) に分割し、それらをオブジェクト ストレージにアップロードしてから、データ ブロックの ID を格納します。メタデータ エンジン。ランダムに書き込む場合、ロジックは元のコンテンツを上書きすることです. 実際には、上書きされるデータ ブロックのメタデータは古いデータとしてマークされます. 同時に、ランダム書き込み中に生成された新しいデータ ブロックのみがオブジェクトにアップロードされます.ストレージ、および新しいデータ ブロックに対応するメタデータがメタデータ エンジンに更新されます。

上書きされた部分のデータを読み取る場合、最新のメタデータに従って、ランダム書き込み中にアップロードされた新しいデータ ブロックから読み取ることができ、古いデータ ブロックはバックグラウンドで実行されているガベージ コレクション タスクによって自動的にクリーンアップされる場合があります。これにより、ランダム書き込みの複雑さが読み取りの複雑さに変わります。

これは実装ロジックの大まかな紹介にすぎません. 具体的な読み取りと書き込みのプロセスは非常に複雑です. JuiceFS の内部実装と読み取りと書き込みのプロセスの 2 つのドキュメントを調べて、コードと一緒にそれらを組み合わせることができます.

17. マウント ポイントでファイルを削除するのに、オブジェクト ストレージのフットプリントが変わらないか、ほとんど変わらないのはなぜですか

最初の理由は、ごみ箱機能を有効にした可能性があることです.データのセキュリティを確保するために、ごみ箱はデフォルトで有効になっています.削除されたファイルは実際にはごみ箱に置かれますが、実際には削除されません.したがって、オブジェクトストレージのサイズ変わりません。ごみ箱の保存期間はjuicefs formatjuicefs configで指定または変更できます。詳細については、ごみ箱のドキュメントを参照してください。

2 つ目の理由は、JuiceFS がオブジェクト ストレージ内のデータを非同期的に削除するため、オブジェクト ストレージのスペースの変更が遅くなることです。オブジェクト ストレージで削除する必要があるデータをすぐにクリーンアップする必要がある場合は、juicefs gcコマンドの実行を試すことができます。

18. マウントポイントが表示するサイズとオブジェクトストレージが占有するスペースに違いがあるのはなぜですか?

「ランダム書き込みをサポートする JuiceFS の実装原理は何ですか?」という質問への回答から、オブジェクト ストレージが占有するスペースは、ほとんどの場合、特に多数の上書きが行われる場合、実際のサイズ以上であると推測できます。短時間で多くのファイルを生成するために実行されます。これらのフラグメントは、マージとリサイクルがトリガーされる前にオブジェクト ストレージ スペースを占有します。ただし、ファイルが読み書きされるたびに、必要に応じてファイルに関連する最適化作業をチェックしてトリガーするため、これらのフラグメントが常にスペースを占有することを心配する必要はありません。さらに、juicefs gc —-compact -—deleteコマンドを。

また、JuiceFS ファイルシステムで圧縮機能が有効になっている場合 (デフォルトでは有効になっていません)、オブジェクトストレージに格納されたオブジェクトは、実際のファイルサイズよりも小さくなる場合があります (さまざまな種類のファイルの圧縮率によって異なります)。 .

上記の要因が除外された場合は、使用しているオブジェクト ストレージのストレージ タイプを確認してください. クラウド サービス プロバイダーは、特定のストレージ タイプに対して測定の最小単位を設定する場合があります。たとえば、 Alibaba Cloud OSS 低頻度アクセス ストレージの最小測定単位は64KB であり、1 つのファイルが 64KB より小さい場合も 64KB として計算されます。

19. JuiceFS S3 ゲートウェイは、マルチユーザー管理などの高度な機能をサポートしていますか?

JuiceFS の組み込みgatewayサブコマンドはマルチユーザー管理などの機能をサポートせず、基本的な S3 ゲートウェイ機能のみを提供します。これらの高度な機能を使用する必要がある場合は、 MinIO ゲートウェイ バックエンドの実装として JuiceFS を使用し、MinIO ゲートウェイの全機能をサポートするリポジトリを参照してください。

20. JuiceFS と XXX の違いは何ですか?

詳細については、テクノロジー比較ドキュメントを参照してください。

21. JuiceFS は、オブジェクト ストレージ内のディレクトリを—-bucketオプション

この機能は、JuiceFS 1.0.0-rc3 ではサポートされていません。

22. JuiceFS は、オブジェクト ストレージ内の既存のデータの読み取りをサポートしていますか?

この機能は、JuiceFS 1.0.0-rc3 ではサポートされていません。

23. 現在、JuiceFS は分散キャッシングをサポートしていますか?

この機能は JuiceFS 1.0.0-rc3 ではサポートされていません

24. JuiceFS で利用できる SDK はありますか?

JuiceFS 1.0.0-rc3 のリリース時点で、コミュニティには 2 つの SDK があり、1 つは Juicedata によって公式に維持されているJava SDKで、HDFS インターフェースは互換性が高く、もう 1 つはコミュニティ ユーザーによって維持されているPython SDKです。

お役に立てれば、私たちのプロジェクト Juicedata/JuiceFSに注目してください ! (0ᴗ0✿)

{{o.name}}
{{m.name}}

おすすめ

転載: my.oschina.net/u/5389802/blog/5561502