大容量データの分析に向いているデータベース「infiniDB」

 「infiniDB」は、大容量データベースの分析に向いているMySQLのストレージエンジンです。特徴を調べてみた。

I/Oをできるだけ減らすように特化したアーキテクチャ

列指向型データベースのアーキテクチャ
 一般的なリレーショナルデータベースでは、データを行単位で扱います。あるデータを参照したい場合には、目的のデータがある行を探して、その行を読み込むことで参照します。一方、列指向型データベースは列方向にデータをまとめて扱っています。行の場合は、すべてのカラムを読み込まなくてはいけませんが、列指向データベースの場合は、「必要な列にだけアクセスする」という考え方。カラムが20列あったとしても、アクセス対象が3列しかない場合、3列分しかアクセスしない。必然的にI/Oが減る。

  • 行指向型と列指向型データベースの違い

エクステントの単位が8MB
 MySQLの代表的なストレージエンジンのInnoDBと同じで、データをエクステントという単位で持ってる。InnoDBの場合は、エクステントのサイズが16KBなのに対して、InfiniDBは列ごとに8MBの領域を用意。エクステント毎にI/Oが発生するため、BIシステムのように一回にアクセスするデータが多い場合は、必然的にI/Oが減る。そのかわり一回のI/O単位が大きいため、主キー検索を大量に発行するような用途には向かない。以下は、データ概念。


低メンテナンス

自動垂直および水平パーティショニング
 自動パーティション化されます。DBAが前もってパーティションに名前を付けたり、定義する必要はない。エクステントという単位で縦だけでなく横方向にもパーティショニングを行っている。

インデックス作成の必要はない
 infiniDBはデータを列ごとにエクステントという単位で持っている。エクステント・マップと呼ばれる機能で、エクステント同士が論理的に結びついている。どのエクステントにどのデータが記録されているかは、Mapとして記録される。列ごとに「エクステント」を数MBごとに領域を持ち、各エクステントの最小値と最大値をMapで管理している。このMapがインデックスの機能を果たしている。

圧縮
 列ごとの圧縮が可能。列内のデータは似た値が多いので圧縮効率が良い。

分散型のシェアード・ナッシング・データ・キャッシュ
 infiniDBV3から対応。共有ディスクが不要となるため、拡張の際にもコストを抑えやすい。大量データ処理の際に最大のボトルネックとなるディスクへの物理I/Oを分散、抑制できるので、データ処理性能の大幅な向上が期待できる。

クラッシュ・リカバリ
 システムクラッシュが発生した場合は、自動的にデータの整合性を維持し、システムの再起動時の操作フォワードとロールバックをサポートしている。oracleインスタンスリカバリのようなものかな?

「infiniDB」のそのほかのサポート機能

基本的にはMySQL
 基本的には、MySQLのストレージエンジンがInfiniDBになっている。データベースの操作性は、ほぼMySQLと同じで、クライアントアダプタもMySQLのものが使用できる。

DMLサポート
 INSERT、UPDATE、DELETE 操作対応

MVCCデザイン
ページ単位でロック。

マルチスレッド処理

トランザクション・サポート

並列処理を自動的にスケールアウト
 並行処理は自動的に1-nのマシン間でスケーリングすることができる。

今回は概要レベルです。次回はもうちょい深堀してみる。