Fluidは、オープンソースのKubernetesネイティブの分散データセットオーケストレータおよびアクセラレータで、クラウドネイティブのシナリオでデータを大量に消費するアプリケーション用です。 Fluidは、EFCRuntimesを管理およびスケジューリングすることにより、データセットの可観測性、スケーラビリティ、およびアクセス高速化を可能にします。 このトピックでは、Fluid EFCRuntimeを使用してApsara File Storage NAS (NAS) へのアクセスを高速化する方法について説明します。 ファイルシステム。
前提条件
Alibaba Cloud Linux 2はElastic Compute Service (ECS) インスタンスのオペレーティングシステムとして使用され、オペレーティングシステムのカーネルバージョンは4.19.91-23以降です。
Kubernetes 1.18以降を実行するContainer Service for Kubernetes (ACK) Proクラスターが作成されます。 詳細については、「ACK Proクラスターの作成」をご参照ください。
NAS がアクティブ化され、作成されたACK Proクラスター内のノードがCapacity NASファイルシステムまたはPerformance NASファイルシステムをマウントしてアクセスできます。.
説明AIトレーニングシナリオでは、トレーニングジョブに必要なスループットに基づいてNASファイルシステムタイプを選択することを推奨します。 詳細については、「ファイルシステムの選択」をご参照ください。
kubectlクライアントがACK Proクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
EFCの概要
Elastic File Client (EFC) は、NAS技術チームによって開発されたFUSEベースのPOSIXクライアントです。 EFCを使用して、カーネルモードのNFSクライアントを置き換えることができます。 EFCを使用すると、複数の接続、キャッシュメタデータ、およびキャッシュデータに基づくデータに分散してアクセスし、読み取り速度を向上させることができます。 EFCは、PrometheusのManaged Serviceに基づくパフォーマンスモニタリングもサポートしています。 カーネルモードのNFS V3およびV4.xクライアントおよびその他のFUSEベースのクライアントと比較して、EFCには次の利点があります。
強いセマンティック整合性: EFCは分散ロックメカニズムを使用して、ファイルとディレクトリの強い整合性を確保します。 ファイルにデータを書き込んだ後、そのデータは他のクライアントからすぐに読み取ることができます。 ファイルを作成すると、他のクライアントからファイルにすぐにアクセスできます。 この利点により、複数のノード間でデータを同期できます。
個々のサーバーでのキャッシュの読み取りと書き込み: EFCは、FUSEのキャッシュロジックを最適化し、ノード上の少量のメモリを占有して、小さなファイルでの読み取りと書き込みを高速化します。 従来のNFSクライアントと比較して、EFCはキャッシュの読み取りと書き込みのパフォーマンスを50% 以上向上させます。
分散型読み取り専用キャッシュ: EFCは分散型読み取り専用キャッシュをサポートし、複数のノードのメモリを使用してキャッシュプールを作成します。
スモールファイルプリフェッチ: EFCは、頻繁にアクセスされるディレクトリ内のホットデータをプリフェッチして、データフェッチに関連するオーバーヘッドを削減します。
ホットアップデートとフェールオーバー機能: EFCは数秒以内にフェールオーバーを実行し、サービスを中断することなくクライアントのホットアップデートを実行できます。
Fluid EFCRuntimeを使用してNASへのアクセスを高速化ファイルシステム
Fluidは、Fluid EFCRuntimeに関連するカスタムKubernetesリソースを使用してEFCに接続します。 データセットの可観測性とスケーラビリティの実装に役立ちます。
制限事項
Fluid EFCRuntimeには次の制限が適用されます。
Fluid EFCRuntimeはDataLoadキャッシュのプリフェッチをサポートしていません。 Fluid EFCRuntimeは、データが初めてアクセスされたときにのみデータをキャッシュします。
Fluid EFCRuntimeは、データセットのキャッシュステータスを公開しません。
流体EFCRuntimeは、中国 (張家口) 、中国 (北京) 、中国 (広州) 、中国 (深セン) 、中国 (上海) の各地域でのみサポートされています。
Fluid EFCRuntimeのしくみ
次の図は、Fluid EFCRuntimeがNASからデータをキャッシュする方法を示しています ローカルストレージにアクセスして、データアクセスを高速化します。 次のセクションでは、Fluid EFCRuntimeの仕組みについて説明します。
データセットとEFCRuntimesのカスタムリソース定義 (CRD) を作成して、ソースNASファイルシステムに関する情報を指定できます。.
Fluidコントローラーは、ソースファイルシステムに関する情報に基づいて、EFC Cache WorkerおよびEFC FUSEコンポーネントを展開します。
ポッドを作成するときに、永続ボリューム要求 (PVC) を使用して、EFC FUSEクライアントによって公開されるファイルシステムのマウントターゲットをポッドにマウントできます。
マウントされたNASファイルシステムのデータにアクセスする場合EFC FUSEクライアントは要求をEFC Cache Workerに転送します。 EFC Cache Workerは、データがローカルストレージにキャッシュされているかどうかを確認します。 データがローカルストレージにキャッシュされている場合は、キャッシュに直接アクセスできます。 データがローカルストレージにキャッシュされていない場合、EFC Cache WorkerはNASファイルシステムからデータを読み取ります。 データをローカルストレージにキャッシュします。 その後、ローカルストレージのキャッシュにアクセスできます。
データセット: Fluidによって定義されたCRD。 データセットは、上位層の計算エンジンによって使用される論理的に関連するデータの集合である。
EFCRuntime: データセットへのアクセスを高速化するランタイム。 EFCRuntimesはキャッシュエンジンとしてEFCを使用します。 EFCキャッシングエンジンは、EFCキャッシュワーカーおよびEFC FUSEコンポーネントを含む。
EFC Cache Worker: コンシステントハッシングに基づくキャッシュを有効にするサーバー側コンポーネント。 要件に基づいて、このコンポーネントを無効にできます。 このコンポーネントを無効にすると、分散読み取り専用キャッシュは無効になります。 その他の機能は影響を受けません。
EFC FUSE: POSIXプロトコルを介してデータアクセスインターフェイスを公開するEFCのクライアント側コンポーネント。
手順
ステップ1: ack-fluidをインストールする
クラウドネイティブAIスイートとack-fluid 0.9.10以降をインストールします。
オープンソースFluidをインストールしている場合は、ack-Fluidコンポーネントをインストールする前にfluidをアンインストールする必要があります。
クラウドネイティブAIスイートがインストールされていないときにack-fluidをインストールする
クラウドネイティブAIスイートをインストールすると、Fluidデータアクセラレーションを有効にできます。 詳細については、「クラウドネイティブAIセットのデプロイ」をご参照ください。
クラウドネイティブAIスイートのインストール時にack-fluidをインストールする
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
[クラウドネイティブAIスイート] ページで、[ack-fluid] を見つけ、[操作] 列の [デプロイ] をクリックします。
[コンポーネントのインストール] メッセージで、[確認] をクリックします。
ack-fluidを0.9.10以降に更新する
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
[クラウドネイティブAIスイート] ページで、[ack-fluid] を見つけ、[操作] 列の [アップグレード] をクリックします。
[コンポーネントのアップグレード] メッセージで、[確認] をクリックします。
ステップ2: NASファイルシステムへのデータの書き込み
データがすでにNASファイルシステムに保存されている場合は、この手順をスキップできます。
NASファイルシステムをECSインスタンスにマウントします。 詳細については、「NASコンソールでのNFSファイルシステムのマウント」をご参照ください。
次のコマンドを実行して、CPFSファイルシステムのマウントターゲットを照会します。
findmnt /mnt期待される出力:
ターゲットソースFSTYPEオプション /mnt/nf s xxxxxxxxxxx-xxxxx.cn-beijing.nas.aliyuncs.com:/ nfs rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,nolock,no次のコマンドを実行して、NASファイルシステムのマウントディレクトリにサイズが10 GBのファイルを作成します。
dd if=/dev/zeroの=/mnt/nfs/allzero-デモカウント=1024 bs=10M期待される出力:
1024 + 0レコード 1024 0レコードアウト 10737418240バイト (11 GB) コピー、50.9437秒、211 MB /秒
手順3: データセットとEFCRuntimeの作成
dataset.yamlという名前のファイルを作成し、次のコンテンツをファイルにコピーします。
NASファイルシステムのサンプルテンプレート
apiVersion: data.fluid.io/v1alpha 1 kind: データセット メタデータ: 名前: efc-demo spec: mounts: -mountPoint: "nfs://<nas_url >:< nas_dir>" 名前: efc パス: "/" --- apiVersion: data.fluid.io/v1alpha 1 kind: EFCRuntime メタデータ: 名前: efc-demo spec: replicas: 3 マスター: networkMode: ContainerNetwork ワーカー: networkMode: ContainerNetwork ヒューズ: networkMode: ContainerNetwork tieredstore: レベル: -mediumtype: MEM パス: /dev/shm クォータ: 15Gidataset.yamlファイルは、データセットとEFCRuntimeを作成するために使用されます。
データセットは、NASファイルシステムに関する情報を指定します。NASファイルシステムのURLなど とマウントするディレクトリ。
EFCRuntimeはEFCキャッシュシステムを起動してキャッシュサービスを提供します。 EFCキャッシュシステムのワーカーコンポーネントのレプリケートポッドの数と、各ワーカーコンポーネントのキャッシュ容量を指定できます。
パラメーター
説明
mountPoint
NASファイルシステムを使用する場合は、
nfs://<nas_url >:< nas_dir>形式で値を設定します。nas_url: NASファイルシステムのURL。
NASファイルシステムのURLを取得するには、次の操作を実行します。NASコンソールにログインします。 左側のナビゲーションウィンドウで、[ファイルシステム] > [ファイルシステム一覧] を選択します。 [ファイルシステムリスト] ページで、マウントするNASファイルシステムを見つけ、[操作] 列の [管理] をクリックします。 表示されるページで、[ターゲットのマウント] をクリックします。 詳細については、「マウントターゲットの管理」をご参照ください。
nas_dir: マウントするサブディレクトリ。 ほとんどの場合、値をルートディレクトリに設定できます。 たとえば、
efc:// xxxxxxxxxxx-xxxxx.cn-beijing.nas.aliyuncs.com:/の値は、NASファイルシステムのルートディレクトリを指定します。
レプリカ
EFCキャッシュシステムのワーカーコンポーネント用に作成された、レプリケートされたポッドの数。 計算ノードのメモリサイズとデータセットのサイズに基づいて値を設定できます。 クォータの値とレプリカの値の積がデータセットのサイズよりも大きくなるようにすることをお勧めします。
networkMode
有効な値: ContainerNetworkおよびHostNetwork。 ACK環境では、値をContainerNetworkに設定することを推奨します。 このネットワークモードは、ネットワークパフォーマンスを損なうことはありません。
mediumtype
キャッシュタイプ。 有効な値: HDD、SSD、およびMEM。MEMの値はメモリを示す。 AIトレーニングシナリオでは、このパラメーターをMEMに設定することを推奨します。このパラメーターをMEMに設定する場合、pathパラメーターをtmpfsなどのメモリファイルシステムに設定する必要があります。
パス
EFCキャッシュシステムのワーカーコンポーネントのポッド内のキャッシュディレクトリ。 このパラメーターの値を /dev/shmに設定することを推奨します。
クォータ
各ワーカーコンポーネントのキャッシュ容量。 計算ノードのメモリサイズとデータセットのサイズに基づいて値を設定できます。 クォータの値とレプリカの値の積がデータセットのサイズよりも大きくなるようにすることをお勧めします。
次のコマンドを実行して、EFCRuntimeとデータセットを作成します。
kubectl create -f dataset.yaml次のコマンドを実行して、データセットがデプロイされているかどうかを確認します。
kubectl getデータセットefc-demo期待される出力:
名UFS合計サイズキャッシュキャッシュ容量キャッシュパーセント位相年齢 efc-demoバウンド24mデータセットはバインド状態です。 これは、EFCキャッシュシステムがクラスタ内で期待どおりに実行され、アプリケーションポッドがデータセットによって提供されるデータにアクセスできることを示しています。
次のコマンドを実行して、EFCRuntimeがデプロイされているかどうかを確認します。
kubectl get efcruntime期待される出力:
名マスターフェーズ作業者フェーズヒューズフェーズ年齢 efc-デモレディレディ27m結果は、master、worker、FUSEコンポーネントがReady状態であることを示しています。
次のコマンドを実行して、永続ボリューム (PV) とPVCが作成されているかどうかを確認します。
データセットとEFCキャッシュシステムの準備が完了すると、FluidはPVCとPVを自動的に作成します。
kubectl get pv,pvc期待される出力:
が容量アクセスモードに名前を付けると、ポリシーステータスはSTORAGECLASSの理由年齢を主張します persistentvolume/default-efc-demo 100Gi ROX保持バインドdefault/efc-demo fluid 94m 名前ステータスボリューム容量アクセスモードSTORAGECLASS年齢 persistentvolumeclaim/efc-demoバインドされたデフォルト-efc-demo 100Gi ROX fluid 94m
手順4: データにアクセスするアプリケーションを作成する
データへのアクセスが高速化されているかどうかを確認するアプリケーションを作成します。 この例では、2つのポッドをプロビジョニングするアプリケーションが作成され、NASファイルシステムにアクセスするために使用されます。 2つのノードから複数回。 データへのアクセスに必要な時間に基づいて、Fluid EFCRuntimeのアクセラレーションパフォーマンスを評価できます。
という名前のファイルを作成します。app.yaml次の内容をファイルにコピーします。
次のコンテンツは、efc-appという名前のStatefulSetを定義します。 StatefulSetには2つのポッドがあります。 各ポッドには、/dataディレクトリにマウントされたefc-demo PVCがあります。
apiVersion: apps/v1 kind: StatefulSet メタデータ: 名前: efc-app ラベル: アプリ: nginx spec: serviceName: nginx レプリカ:2 セレクタ: matchLabels: アプリ:nginx template: metadata: labels: アプリ:nginx 仕様: containers: - name: nginx 画像: registry.openanolis.cn/openanolis/nginx:1.14.1-8.6 コマンド: ["/bin/bash"] args: ["-c", "sleep inf"] volumeMounts: - mountPath: "/data" 名前: data-vol volumes: -name: data-vol persistentVolumeClaim: claimName: efc-demo次のコマンドを実行して、efc-appという名前のStatefulSetを作成します。
kubectl create -f app.yaml次のコマンドを実行して、指定したファイルのサイズを照会します。
kubectl exec -it efc-app-0 -- du -h /data/allzero-demo期待される出力:
10G /データ /allzero-デモアプリケーションから指定されたファイルを読み取るのに必要な時間を照会します。
説明時間およびスループットの量は、ランタイム環境および測定方法に基づいて変化し得る。 このトピックでは、クラスターにECS. g7ne.8xlargeタイプのecsインスタンスが3つあります。 efc-demo EFCRuntimeには、同じECSインスタンスで実行される3つのワーカーポッドがあります。 efc-app StatefulSetには、他の2つのECSインスタンスで別々に実行される2つのポッドがあります。 データアクセスに必要な時間は、EFC FUSEクライアントが実行されているノードのカーネルキャッシュの影響を受けません。
次のコマンドを実行して、StatefulSetのefc-app-0ポッドから指定されたファイルを読み取るのに必要な時間を確認します。
説明別のファイルを読み取りたい場合は、/data/allzero-demoをファイルのパスに置き換えます。
kubectl exec -it efc-app-0 -- bash -c "time cat /data/allzero-demo > /dev/null"期待される出力:
リアル0m15.792s ユーザー0m0.023s sys 0m2.404s結果は、サイズが10 GBのファイルを読み取るには15.792秒が必要であり、読み取り速度は648 MiB/sであることを示しています。
次のコマンドを実行して、StatefulSetの他のポッドからサイズが10 GBの同じファイルを読み取るのに必要な時間を確認します。
説明別のファイルを読み取りたい場合は、
/data/allzero-demoをファイルのパスに置き換えます。kubectl exec -it efc-app-1 -- bash -c "time cat /data/allzero-demo > /dev/null"期待される出力:
リアル0m9.970s ユーザー0m0.012s sys 0m2.283s結果は、サイズが10 GBのファイルを読み取るには9.970秒が必要であり、読み取り速度は1,034.3 MiB/sであることを示しています。
Fluid EFCRuntimeを使用した後、読み取り速度は648 MiB/sから1,034.3 MiB/sに増加します。 同じファイルに対して、Fluid EFCRuntimeは読み取り速度を約100% 増加させます。