VoltDB
開発元 | VoltDB Inc. |
---|---|
最新版 |
9.2
/ 2019年10月28日[1] |
リポジトリ | |
対応OS | Linux, macOS |
種別 | インメモリ型RDBMS |
ライセンス | GNU General Public License v3 |
公式サイト | voltdb.com |
VoltDBはIngresやPostgreSQLに携わったマイケル・ストーンブレーカーにより設計されたインメモリデータベースである。ACIDに準拠した関係データベースシステムであり、シェアード・ナッシング・アーキテクチャによるものである。GPL バージョン3のもとでリリースされているフリーソフトウェアである。VoltDBは学術的なH-Storeプロジェクトを基礎としている。[2]
VoltDBは関係データベースであり、プリコンパイルされたJavaストアドプロシージャからのSQLアクセスをサポートする。トランザクションの単位はストアードプロシージャであり、これはSQLとJavaが混合されたものである。VoltDBはスケーラビリティのために個々のハードウェアにおけるスレッドでの水平パーティショニングを利用し、堅牢性のためにk-safety(同期的レプリケーション)を利用している。
ストアドプロシージャをトランザクションの単位とし、必要なデータを含むパーティションにおいて実行することにより、SQL命令間のメッセージ往復を除くことができる。ストアドプロシージャは順次に実行され、ロックやラッチなどを行わず、シングルスレッドの機構で処理される。データがメモリ上に格納され、パーティションごとに局在しているため、ストアドプロシージャはマイクロ秒単位で実行が可能である。ストアドプロシージャの初期化スキームでは、すべてのノードがストアドプロシージャを初期化し、同時に単一のシリアライズ可能なグローバル順序があることを保証する。[3]
VoltDBはスケーラビリティ、信頼性、高可用性、高スループットを必要とするアプリケーションに重点を置いている。これはOLTPアプリケーションと呼ばれるものを指している。これらのアプリケーションはボトルネックを回避するため、スループットに対し、厳しい要求がある。また、許されるデータアクセスのパスや重要な通信を事前に定義する明確に設計されたワークフローがある。 [4]
技術概要
[編集]複雑なログ採取、ロック、ラッチ、バッファ管理などの処理を除くことでVoltDBは従来のシステムと比較し、50倍の高速化を図っている。VoltDBはトランザクション内においてディスクの待ち時間や、ユーザ処理による待ち時間がないため、OLTP SQL処理はシリアルに、ミリ秒単位で実行される。シェアードナッシング機構をコア単位にまで拡張することにより、VoltDBは現代のコモディティサーバにおけるCPU当たりのコア数増加を活用し、スケールすることができる。[5]
各データベースはスキーマ、ストアドプロシージャ、パーティショニング情報をコンパイルすることにより、特定のアプリケーションに最適化される。これはVoltDBランタイムカタログと呼ばれる。このカタログは単一あるいは複数のホストマシンにロードされ、分散データベースが作成される。[4]
パーティショニング
[編集]データアクセスロジックを解析し、ストアドプロシージャにプリコンパイルすることにより、VoltDBはデータとそれに関連する処理の両方をクラスタ内の個々のノードに分散することができる。これにより、クラスタの各ノードがデータおよびデータ処理の固有の「スライス」を保有することになる。[4]
シリアライズ(シングルスレッド)処理
[編集]実行時にストアドプロシージャへの呼び出しはクラスタの該当のノードへ送られる。プロシージャが「単一サイト処理」のものである場合、つまり、単一パーティションのデータにおいて実行される場合、個々のノードはプロシージャを独立して処理し、クラスタの残りのノードは他の処理を並行して処理することができる。
シリアライズ処理を利用することにより、VoltDBはロック、ラッチ、トランザクションログのオーバヘッド無く、トランザクションの整合性を保証できる。また、パーティショニングにより、データベースは複数のリクエストを同時に処理することができる。[4]
テーブルのパーティショニングとレプリケーション
[編集]VoltDBのテーブルは指定された主キーをもとにパーティショニングされる。ストアドパーティションによりデータがアクセスされる方法にマッチするパーティションキーを選んだ場合、実行時に最適化がなされる。
さらなる性能の最適化のため、VoltDBの特定のテーブルをクラスタ全体のパーティションにレプリケーションすることができる。これにより、主にリードオンリーの小さなテーブルにおいて、ストアドプロシージャが当該テーブルとほかの大きなテーブルとのジョインを単一サイトのトランザクションとして扱うことができる。[4]
VoltDBの運用
[編集]VoltDBはデータアクセスをストアードプロシージャを経由して提供し、それによりクライアント・サーバ間の相互通信時間を短縮する。ストアドプロシージャはJavaにより記述され、各プロシージャは単一のJavaクラスである。ストアードプロシージャの定義において、ユーザはVoltDBデータベースに対し、標準的なSQLのうちOLTPに特化したサブセットにより処理を行う。その例として、many-way join、group-by、序列化、集約、標準的な数学処理、limitなどがある。
ユーザはアプリケーションに必要とされるスキーマやストアドプロシージャを管理し、VoltDBアプリケーションコンパイラを使用し、VoltDBアプリケーションアーカイブを作成する。コンパイラは自動的にパーティションを行い、必要に応じてデータのレプリケーションを行い、パフォーマンスの最適化を行い、高可用性を保証している。このアーカイブは単一のあるいは複数のVoltDBクラスタへ適用可能である。
VoltDBはクラスタ内およびクラスタ間のレプリケーションにより、堅牢性を確保している。データはクラスタ内の複数の実行サイトに同期的にコミットされ、ノード障害に対する対障害性を実現している。トランザクションはクラスタ間において非同期的にコミットされ、データセンター災害などに対する全クラスタ単位での障害に対し対障害性を提供している。