Real-Time Engine

リアルタイム・エンジン

最新のテクノロジを余すこと無く利用することで、Aerospikeのリアルタイム・エンジンは、最大限のパフォーマンスを実現し、数百万TPSをミリ秒以下のレイテンシで提供します。

 

 

極めて高いスループットを低レイテンシで提供するようなシステムは、多くのノードにスケールアウトするだけではなく、個々のノードをスケールアップできる必要があり、以下のようなことを可能にします:

  1. 数少ないノードで高いスループット
  2. 障害時のより良い特性(ノード障害の発生頻度は、一般的に、クラスタを構成するノードが多い程、より増加します)
  3. より容易な運用(クラスタが10台構成の場合と200台構成の場合を想像してください)
  4. より少ないTCO(Total Cost of Ownership):ハイブリッド・メモリ・アーキテクチャのセクションをご参照ください

このセクションでは、一台のノードで数百万TPSをミリ秒以下のレイテンシで提供する、Aerospikeのリアルタイム・エンジンをシステムレベルでご紹介します。

RTE1

図1. マルチ・コア・アーキテクチャ

 

インデックスやグローバル変数等の同時アクセスが必要なデータ構造のために、3つのデザイン・モデルが考えられます:

Aerospikeでは、三番目のアプローチを採用し、すべての重要なデータ構造はパーティションに分割され、各々は別々のロックを持ち、パーティション間の競合を避けています。インデックス・ツリーのようなネストされたデータ構造へのアクセスは、各レベルでの複数のロックを使用しません。代わりに、各ツリー要素は、リファレンス回数とそれ自体のロックを持っています。これにより、複数のロックを維持することなく、安全に同時の読み込み、書き込み、削除が可能となります。このようなデータ構造は、注意深く設計され、頻繁に共通的にアクセスされるデータは、キャッシュ・ミスを削減し、データが一ヶ所に存在するように局在し、単一のキャッシュ・ラインに入るようにされています。例えば、Aerospikeのインデックスは、きっちり64バイトであり、キャッシュ・ラインと同じサイズになっています。

基本的なキー・バリュー・ストアの操作に加えて、バッチ・クエリ、スキャン、セカンダリ・インデックス・クエリ等をサポートしています。スキャンは、データ全体を検索する重いバックグラウンド・ジョブになります。バッチ・クエリやセカンダリ・インデックス・クエリは、合致したデータ・セットを返します。それゆえ、個々のユースケースに基づいた、種々の検索となります。そのような多様なクエリに対して、スループットと正確性のバランスを取るのは、大変な作業ですが、以下の3つの方針により実現可能と考えています。

  1. タイプによるパーティション・ジョブ:個々のジョブ・タイプは各々のスレッド・プールに配置され、プールニ対する優先度が付けられる。特定のタイプのジョブは、さらにプール内で優先度が付けられる。
  2. 作業量を基準とした作業単位:作業の基本単位は、検索、I/O、検証を含む、単一レコードを処理する際の作業量となる。各ジョブは複数の作業単位から構成される。
  3. 制御された負荷発生:スレッド・プールは負荷を発生させ、それが作業の発生率を制御します。そのプール内のスレッドが実際の作業を行います。

Aerospikeでは、協調型スケジューリングを使用し、ワーカ・スレッドはある量の処理をした後、他のワーカにCPUを明け渡します。それらのワーカは、CPUコアとパーティションのアフィニティを持ち、並列稼働するワーカがあるデータに対して競合することを避けています。

Aerospikeでは、ある基本処理の同時作業は、各リクエストのレイテンシを低くするように、通常、最初に来たものを最初に処理します。また、スキャンやクエリのように、長期に渡り動作するような作業に関しては、その進捗を管理する必要があります。そのような場合は、システムは、タスクをラウンドロビンで実行するように自動的に調整し、タスクを実行・一時停止することで、複数のタスクを並列的に処理します。

プログラミング言語やランタイム・システムに依存することなく、Aerospikeでは、メモリ割り当ては、ネイティブに行われます。その意味において、Aerospikeは、種々の特定目的のスラブ割り当てを行い、サーバ内の異なるオブジェクト・タイプを扱うことになります。インデックスをRAM上に配置することにより、Aerospikeのイン・メモリ・システムは、リソースを十二分に活用します。

rte2

図2. メモリ領域の割り当て

 

上図に示したように、データ・オブジェクトをNamespaceとしてグルーピングし、同じ領域に格納することにより、長期に渡るオブジェクト生成、アクセス、修正、削除の各パターンが最適化され、フラグメンテーションが最小化されます。

X