ユーザーデータは2つのかなり大きな(> 1 PB)OpenStack Swiftストレージクラスターに格納されます。それらをCluster Aとします)およびクラスターB。
さらに、そのデータと対話する必要があるいくつかのPoPsがあります。これらのPoPのサーバーは実質的にディスクレスです。つまり、ユーザーデータがサーバーに保存されたり、ダウンロードされたりすることはありません。 PoPは一般的な世界にグループ化できますregions(egNorth America、南アフリカ、中央ヨーロッパ他)。
一部のPoPは、いずれかのクラスターのエンドポイントからSwiftエンドポイントからかなり離れているため、望ましくないレイテンシが発生します。これをある程度軽減するために、それぞれにキャッシングゲートウェイサーバーをセットアップしますリージョン。r/ wリクエストを最も近いクラスターにキャッシュします。
現在、任意のPoPのクライアントは、永続的にマウントされたSwift仮想ファイルシステムによってユーザーデータにアクセスします。これは、Swift ObjectをマウントするFuseモジュールですブロックデバイスとしてのストレージ(多かれ少なかれ)ただし、そもそもsvfsはそれほど安定していないため、クライアントは将来的にNFSを介してキャッシュサーバーにアクセスする必要があります。
これは、目的のアーキテクチャの1つのブランチの図です。
+------------------+ +------------------+ NFS +------------------+
| Cluster A | SVFS | Region 1 Cache +----------> R1 PoP a Client |
| +----------------> | | |
|Persistent Storage| |Ephemeral Storage+----+ |Generates R/W Load|
+-----------------++ +------------------+ | +------------------+
| |
| +------------------+ | NFS +------------------+
| SVFS | Region 2 Cache | +-----> R1 PoP b Client |
+-----------------> | | |
|Ephemeral Storage| |Generates R/W Load|
+------------------+ +------------------+
NFSの設定の基本 とsvfsに精通しています。
質問は:キャッシュサーバーを設定して、利用可能なすべてのリソース(指定されたキャッシュパーティション、RAM)を使用して、積極的かつ大量のデータをキャッシュする方法です。 svfsマウントポイントに書き込む前に可能な限り?基本的には次のようになります:Linuxでディレクトリをキャッシュするにはどうすればよいですか?
可能であれば、読み取りと書き込みを統合し、キャッシュをクラスターに書き込む必要がある場合は、スループットを最大化し、レイテンシを最小化するために、可能であればFuseリクエストのブロックサイズを少なくとも128kにする必要があります。
補遺1:いくつかのサーバーでクラスターマウントモジュールをsvfsからS3QLに切り替えました。 S3QLのキャッシングにより、パフォーマンスが少し向上しました。完全を期すために、いくつかのパフォーマンスデータを取得しようとします。
固有のLinuxメカニズム(cachefs
またはcachefilesd
など)が機能せず、予算がある場合は、 [〜#〜] wafs [ 〜#〜] (広域ファイルサービス)。これらは、NFS(およびCIFS)の積極的なキャッシングのために設計されたデバイスであり、通常WANリンクに含まれる待ち時間を隠そうとします。
私は本当にこの分野の専門家ではありません(しかし、それは確かに興味深いです!)。
私が最近見ているのは、主にLVMのdm-cacheで、その一部をキャッシュするSSDがあります。以下は、適切な概要を持つreadhatのテキストの例ですが、RHに関連付けられていません。 https://www.redhat.com/en/blog/improving-read-performance-dm-cache