Red Hat のソリューションアーキテクトの伊藤ちひろ (@chiroito)です。
よくいろいろな役割の開発者の方々から「Red Hat はデータストアを持ってないよね」と言われることがあります。 でも、実は、Red Hat はほとんどの人に知られることなくひっそりと昔から開発してきたデータストアがあるのです。
本記事では、Red Hat が開発している OSS データストアである Infinispan の概要を紹介します。 Infinispan は Red Hat Data Grid (RHDG)という名前で提供しています。
Infinispan は「インメモリー・データ・グリッド」と呼ばれる分類のデータストアです。 KVSを使用されている開発者の方からは、「インメモリー・データ・グリッドは、キー・バリュー・ストア(KVS)の事でしょ?」と言われる事が良くあります。インメモリー・データ・グリッドは、データへのアクセス方法はKVSと同じですが、さらにたくさんの機能を持っています。今回は全ての機能を紹介しきれませんが、残りの機能については次回以降紹介していきます。
本記事では、Infinispan と RHDG のことを「データグリッド」と記載します。
データグリッドとは
みなさんは「そもそも、何ができるの?」と思われるかもしれません。
データグリッドは、アプリケーションとインフラストラクチャの両方に対して、様々なメリットを提供します。以下のようなメリットがあります。
アプリケーションの観点では、
- KVSとしてデータグリッドへ様々なデータ形式のデータを格納できます。
- 各データの寿命を設定したり、データに変更があった場合に変更を検知できます。
- データをアプリケーション側へロードするのではなく、アプリケーションからデータグリッドへ処理を依頼することで低遅延高スループットな処理を実現できます。
- アプリケーションが欲しいデータがデータグリッド上にない場合、他のデータストアから自動的に取得することや、アプリケーションが頻繁に使うデータをアプリケーション側に自動的にキャッシュできます。
- KVSとは異なり、キーを使用しないデータアクセスも可能です。
- この様な機能をJavaのみならず様々な言語でサポートしています。
インフラストラクチャの観点では、
- 全てのノードがデータを読み書き可能で、必要に応じてスケールイン/アウトできます。
- ざまざまな要件に対応可能なデプロイ方法、データの複製・分散方法があり、リージョンを跨いだ構成も実現できます。
- 全ての通信経路は暗号化でき、クラウドだけではなくオンプレでも稼働できます。
- さまざまなデファクトスタンダードと統合されており、十分な運用ツール群も提供しています。
よく使われる用途
次にデータグリッドの使用用途ですが、
データグリッドは、世界中のさまざまな業界の、多くの企業で使用されています。
よく使われる業界は、
- 通信
- 金融機関
- 小売業
などが挙げられ、
- IoT
- 広告
- ゲーム
- ECサイト
などのシステムで導入されています。
使われ方も様々で
- ユーザ情報のような頻繁にアクセスされる情報
- セッション情報のような一時的に使用されて変更の多いデータ
- ECサイトのカート
- 同時に複数のユーザから変更される在庫数の管理
- 負荷の高い処理のキャッシュ
などがあります。
日本では、公開できる事例は少ないものの、多くの使用実績があります。
データの格納方法
アプリケーションが、データグリッド上のデータへアクセスする方法は基本的にはKVSと同様です。 KVSをご存じないJavaエンジニアの方は、JavaでいうMapインターフェースをイメージしてください。 「キー」と「バリュー」の組み合わせでアクセスし、この組み合わせはエントリと呼ばれます。
データは、データグリッド上にキャッシュと呼ばれる単位で管理されています。これはRDBMSでいうテーブルです。 複数のキャッシュを定義することで複数種類のデータを格納できます。
アプリケーションはAPIを使用してキャッシュのインターフェースを取得します。 データを格納するときは、put メソッドに、キーとバリューを指定します。 データを読み込むときは、getメソッドにキーを指定するとバリューを得られます。
扱えるデータ型
データグリッドは文字列から複雑なオブジェクトまで様々なデータ型を扱えます。 これらのデータは、実際にはデータグリッドによって、データグリッドが扱いやすい形式に変換されてデータグリッドのメモリ中に格納されます。
テキストや数値などのデータはもちろん、XMLやJSONといったドキュメント型のデータも格納できます。 ドキュメント型のデータは文字列として格納されます。 Java の場合はドキュメント型の文字列を JsonObjectやXMLObjectとして読み込んで使用します。
また、複雑なオブジェクトはprotobuf形式に変換して格納されます。 もちろん、オブジェクトの中にコレクションクラスのオブジェクトも含められるため、1つのキーに対して複数のオブジェクトを格納できます。
他にも、Javaの場合はJakarta EE のアプリケーションサーバの設定を変えるだけで、HTTPのセッションオブジェクトを格納できます。
今回は、データグリッドの概要を紹介しました。次回以降、性能面や可用性面を中心にどの様な事ができるのかを紹介します。