DUICUO

メモリ速度機能を備えた分散データベース、Apache Ignite

導入

企業は驚異的な速度でデータを蓄積しており、膨大なストレージ容量を必要としています。開発者は、テラバイト規模のデータの保存と処理に苦労することがよくあります。Apache Igniteは、トランザクション、分析、ストリーミングワークロード向けのメモリ中心の分散データベース、キャッシュ、および処理プラットフォームであり、ペタバイト規模のデータに対してメモリレベルのパフォーマンスを提供します。Igniteは、アプリケーションや多様なデータソースにまたがるデータの整理と管理のための、高性能な分散型インメモリフレームワークを提供します。

Ignite の際立った特徴は、分散 SQL 結合を完全にサポートしていることです。Ignite は、共存データ結合と非共存データ結合の両方をサポートしています。共存結合では、各ノードの利用可能なデータセットに対して結合が実行され、大量のデータをネットワーク経由で移動する必要はありません。このアプローチは、分散データベースの中で最高のスケーラビリティとパフォーマンスを提供します。Ignite は他のリレーショナルデータベースと同様に動作しますが、制約とインデックスの処理が若干異なります。Ignite は第 1 レベルと第 2 レベルの両方のインデックスをサポートしていますが、一意性をサポートするのは第 1 レベルのインデックスのみです。永続性に関しては、Ignite のメモリ永続性はメモリ内とディスク上の両方で適切に機能しますが、ディスク永続性は無効にすることができます。Ignite は通常、インメモリデータベースとして使用されます。

開発の歴史

特性

  • 多層ストレージ: Apache Ignite 多層ストレージは、メモリのパフォーマンス上の利点とディスクベースデータベースのスケーラビリティおよび永続性を兼ね備えた最先端のストレージアーキテクチャを実装しています。ストレージモードには、インメモリモード、インメモリ + 外部データベースモード、多層データベースモードがあります。
  • ACID互換性: Igniteに保存されるデータは、メモリとディスクの両方でACIDをサポートしているため、Igniteは強力な一貫性を備えたシステムとなっています。Igniteは、ネットワーク上の複数のサーバー間でトランザクションを維持できます。
  • SQLサポート: IgniteはSQL、DDL、DMLを完全にサポートしており、コードを記述することなく、純粋なSQLを使用してIgniteとやり取りできます。つまり、テーブルやインデックスの作成、データの挿入、更新、クエリをSQLのみで実行できます。この完全なSQLサポートにより、Igniteは分散SQLデータベースとして機能します。
  • Key-Value: Ignite のインメモリデータグリッドコンポーネントは、数百台のサーバーで構成されるクラスタ上で水平方向に拡張可能な、完全なトランザクション分散型 Key-Value ストアです。永続性を有効にすると、Ignite はメモリ容量を超える量のデータを保存でき、クラスタの再起動後も引き続き利用できます。
  • 同時処理:従来のデータベースの多くはクライアントサーバーモデルで動作し、データを処理するためにクライアントに送信する必要があります。このアプローチでは、クライアントとサーバー間で大量のデータ移動が必要となり、一般的にスケーラブルではありません。しかし、Igniteは異なるアプローチを採用し、軽量な計算をデータに送信します。つまり、データの同時計算です。その結果、Igniteは優れたスケーラビリティを提供し、データ移動を最小限に抑えます。
  • スケーラビリティと永続性: Igniteは、オンデマンドでノードの追加と削除をサポートする、回復力に優れた水平スケーラブルな分散システムです。また、Igniteはデータの複数のコピーを保存できるため、部分的な障害からクラスターを回復できます。永続性を有効にすると、クラスター全体に障害が発生した場合でも、Igniteに保存されたデータを復元できます。Igniteクラスターの再起動は非常に高速で、データはディスクから取得され、即座に操作可能になります。そのため、処理前にデータをメモリにプリロードする必要がなく、Igniteはゆっくりとメモリレベルのパフォーマンスを回復します。
  • 機械学習: Ignite の機械学習 (ML) は、高価なデータ転送を必要とせずに予測機械学習モデルを構築するためのシンプルでスケーラブルかつ効率的なツールキットです。
  • 多言語サポート: Ignite は主に Java で開発されているため、JVM でサポートされているあらゆるオペレーティング システムおよびアーキテクチャに展開して実行できます。

シーン

3つの主な使用例

  • アプリケーションの高速化と水平スケーリング: Ignite をメモリ キャッシュとして使用するか、1 つ以上の外部データベースに展開されたインメモリ データ グリッドとして使用して、既存のアプリケーションを最大 100 倍高速化します。
  • HTAP ワークロード用の分散データベース:使用可能なメモリを超えて拡張できるデータベースとして Ignite を使用して、トランザクションおよび分析ワークロードをサポートするアプリケーションを構築します。
  • デジタル統合センター:複数のバックエンド システムとデータベースを低遅延の共有データ ストアに集約する高度なプラットフォーム アーキテクチャを作成します。

保管モード

Apache Ignite Tier 1 Storageは、メモリのパフォーマンス上の利点とディスクベースデータベースのスケーラビリティおよび永続性を兼ね備えた最先端のストレージアーキテクチャを実装しています。ストレージモードには、インメモリモード、インメモリ + 外部データベースモード、Tier 1データベースモードがあります。

メモリモード

インメモリコンピューティングソリューションのあらゆる利点を活用することで、データは最小限のレイテンシと最大限のスループットで保存・処理されます。データセット全体はメモリ内でのみ利用可能です。ノード障害の影響を軽減するため、クラスター内に少なくとも1つのデータのバックアップコピーを保持することをお勧めします。これは、データキャッシュ、ハイパフォーマンスコンピューティング、Webセッションキャッシュ、そして継続的なデータストリームのリアルタイム処理に適しています。

メモリ + 外部データベースモード

既存のディスクベースのデータベースやバックエンドシステムの上にIgniteをキャッシュレイヤーとして導入することで、既存のデータベースの高速化とオフロードを実現します。RDBMSやApache Cassandra、MongoDBなどのNoSQLデータベースなどの既存のデータベースの上にIgniteをキャッシュレイヤーとして使用するために、IgniteはApache Cassandraとのすぐに利用可能な統合機能を提供しています。他のNoSQLデータベースのようにすぐに統合できない場合は、独自のCacheStoreインターフェース実装を提供できます。

多層データベースモデル

通常、メモリキャッシュとデータベースは永続化機能に限界があります。しかし、Ignite にはそのような制限はありません。利用可能なメモリを超えてデータを永続化し、再起動時のメモリウォームアップをスキップします。データの100%がIgniteのネイティブ永続化に永続化され、メモリにキャッシュされるデータは同量以下です。キャッシュされるデータが多いほど、パフォーマンスが向上します。アプリケーションはメモリ内とディスク上のレコードのみをクエリできるため、利用可能なメモリ容量を超えて透過的にスケーリングできます。Ignite はディスクからデータを提供できるため、再起動時のメモリウォームアップは不要です。

分散SQL

ネイティブSQLサポートにより、Igniteは標準SQLデータベースのように使用できます。Apache Igniteには、JDBCおよびODBCドライバーに加え、Java、C#、C++、Pythonなどのプログラミング言語をサポートするSQL APIが付属しています。Igniteは、SELECT、UPDATE、INSERT、DELETEを含むすべてのDMLコマンドをサポートし、分散システムに関連するDDLコマンドのサブセットも実装しています。Igniteの顕著な特徴は、分散SQL結合を完全にサポートしていることです。Igniteは、共存データ結合と非共存データ結合の両方をサポートしています。共存結合では、大量のデータをネットワーク経由で移動することなく、各ノードの利用可能なデータセットに対して結合が実行されます。このアプローチにより、分散データベースで最高のスケーラビリティとパフォーマンスが実現します。

分散ACID

Igniteは、分散ACIDトランザクションを完全にサポートし、メモリレベルとディスクレベルの両方で同一の一貫性を保証する、強力な一貫性プラットフォームです。Igniteのトランザクションは、複数のノード、複数のキャッシュ(またはテーブル)、そして複数のパーティションにまたがって実行できます。アプリケーションでは、楽観的ロックと悲観的ロックの両方が利用可能です。楽観的モードではデッドロックフリーのトランザクションもサポートされ、ビジネスコードレベルでの分散デッドロックを回避できます。

Ignite は 2 フェーズ コミット プロトコルを採用しています。分散システムでは、トランザクションが複数のノードにまたがる場合があり、参加しているすべてのノード間でデータの一貫性を確保することは明らかに重要な課題です。たとえば、ノードに障害が発生した場合、障害が発生したノード上のトランザクションは完全にコミットできません。このようなシナリオでは、データの一貫性を保証するために広く使用されている方法が 2 フェーズ コミット プロトコル (2PC) です。Ignite は、2 フェーズ コミット プロトコルの最高速な実装を提供します。さらに、トランザクションが 1 つのパーティションまたは 1 つのノードのみに関係する場合、Ignite はより高速な 1 フェーズ コミット プロトコルを使用します。トランザクション内でデータが変更されると、Ignite は変更をコミットする前に、ローカル トランザクション マップ内にトランザクション状態を保持します。コミットすると、データは関連するリモート ノードに送信され、関連するデータのプライマリ レプリカを保持しているノードのみがトランザクションに参加します。

一貫性と持続性を刺激する

Ignite のネイティブ永続化機能を使用すると、すべての更新が Write-Ahead Log (WAL) ファイルに書き込まれるため、トランザクション実行中にクラスターまたはノードに障害が発生した場合でも、一貫性が確保されます。WAL の目的は、アタッチモードで更新をディスクに伝播することです。これは、データをディスクに永続化する最速の方法です。クラスターまたはノードに障害が発生した場合、WAL は障害シナリオに対するリカバリメカニズムを提供し、クラスターは常に最後に正常にコミットされたトランザクションの状態にリカバリできます。

一貫性とサードパーティの永続性

Ignite が RDBMS などのサードパーティデータベース上のキャッシュ層として実行される場合でも、Ignite はキャッシュされたデータと外部データ間のトランザクションの一貫性を確保します。例えば、RDBMS が永続化層として使用されている場合、Ignite は関連するクラスタノードにコミットメッセージを送信する前に、トランザクションをデータベースに書き込みます。このように、データベース層でトランザクションエラーが発生した場合でも、Ignite は関連するすべてのノードにロールバックメッセージを送信し、両者間のデータの一貫性を維持します。

建築

  • 永続化レイヤー: Ignite は、ネイティブの永続化と、RMDBMS や HDFS などのサードパーティ製ストレージを使用した永続化の両方をサポートしています。Ignite はメモリ中心のストレージを備えていますが、ノード障害が発生するとメモリ内のデータが失われる可能性があります。そのため、永続化レイヤーは Ignite に障害回復機能を提供します。さらに、永続化により、ホットデータとコールドデータの両方でメモリをより効率的に使用できます。例えば、メモリが十分な場合は、すべてのデータをメモリにロードできます。メモリが限られている場合は、ホットデータのみをメモリにロードし、コールドデータはディスク上に残します。
  • Ignite インメモリストレージ層:この層は Ignite の中核と言えるでしょう。データは、Ignite クラスター内のすべてのノード、一部のノード、またはローカルノードに、様々なパーティションとレプリケーションモードを通じて分散できます。1 マスター - 複数スレーブ構成などのデータパーティションとレプリケーションは、データの可用性を向上させます。プライマリデータノードに障害が発生した場合でも、クラスター内のバックアップデータノードがプライマリノードに切り替わり、読み取りおよび書き込みサービスを継続できます。同時に、バックアップノードを読み取り専用ノードとして使用することで、データ読み取り操作のスループットを向上させます。Ignite は、データとインデックスの保存に Java オフヒープメモリも活用することで、JVM ガベージコレクションの回数と時間を削減し、より効率的な操作を実現します。
  • APIインターフェース層: Igniteは、分散データベース、データグリッド、コンピューティンググリッドなどの機能を提供する、豊富で多様なインターフェースを提供します。キー/バリュー+トランザクションにより、RedisやMemcachedと同様に、Igniteをキャッシュとして使用できます。SQL ANSI-99との互換性により、分散データベースとしても使用できます。データ機能に加えて、Igniteではコンピューティンググリッドインターフェースを介して計算タスクを送信し、クラスターコンピューティングリソースを最大限に活用できます。また、Igniteはデータと同じノードに計算タスクを展開することもサポートしているため、ネットワーク転送とデータシリアル化のオーバーヘッドを削減し、計算効率を向上させます。ストリーム処理、機械学習グリッド、サービスグリッド、メッセージキューなどもIgniteによってサポートされています。

結論は

Apache Ignite は、分散インメモリコンピューティングに特化したオープンソース プロジェクトです。Ignite はデータをメモリ内に保存し、複数のノードに分散することで高速なデータ アクセスを実現します。また、データを非同期に永続層に伝播するオプションも備えているため、開発者にとってデータベース キャッシュに使用する際の選択肢として最適です。Apache Ignite は、分散ストレージ、分散コンピューティング、分散サービス、ストリーム コンピューティングなど、多くの最新の分散概念を統合しています。さらに、Java 言語をサポートし、JDK との優れた統合性も備えているため、既存の JDK API との互換性も確保されています。スレッド プールを開始する際、ローカル スレッド プールか分散スレッド プールかを気にする必要はなく、タスクを送信するだけで済みます。Apache Ignite は、RDBMS、Hadoop、Spark、Kafka などの従来のリレーショナル データベースや、主流のビッグ データ スイートとの統合に、柔軟性が高くユーザー フレンドリなコンポーネント API を提供しています。