MySQLをActive-Active構成で使う
3.MySQL Enterprise Serverとの違い
オープンソースデータベースを扱ったことがある経験者にMySQLといえば、大抵はMySQL Enterprise Serverを想像し、MyISAMやInnoDBといったストレージエンジンを利用した単一ホスト上に構築するデータベースを思い浮かべるでしょう。しかしながら、MySQL ClusterはMySQL Enterprise Serverの製品ラインとは異なり、NDB Clusterという特殊なストレージエンジンを利用し複数のノード間でデータをやり取りするまったく異なるアーキテクチャーを持つクラスタデータベースです。ここからは、おなじみの世界でもっとも普及している、オープンソースデータベースMySQL Enterprise Serverと比較しながらMySQL Clusterの特徴を紹介していきます。
MySQL Enterprise Serverに含まれるMyISAMや、InnoDBといったストレージエンジンを利用する際には、ディスク上に作成するファイルや表領域、またはログファイルの物理的なサイズや配置、またはインデックスや表データをどのようにメモリに乗せるかといった設計を行うことが大切です。しかし、MySQL Clusterを利用する場合は、さらにノード間を結ぶネットワークや、MySQL Clusterが持つデータの格納、検索の仕組みを含めた可用性や性能を考慮しなくてはなりません。
4.可用性や性能の留意点
例えば、MySQL Enterprise Serverでは単一のホストが管理するディスク上にファイルを配置しますが、MySQL Clusterでは水平パーティショニング技術を用いデータを複数のノードに分散配置します。上記の図2では、4つのデータノードを2ノードずつのノードグループ1、2に分け、さらに各データノード内のデータの複製数を2として構築したMySQL Clusterに、あるテーブルを作成した場合のデータ格納イメージを4つの色を利用し示しています。
図左のテーブルに含まれる行のおよそ半分、つまりオレンジで示すパーティション1とグリーンで示すパーティション2に相当する行は、図右のノードグループ1に配置された1つ目のホストにオレンジで示すパーティション1(P1)のプライマリデータとして、グリーンで示すパーティション2(P2)がセカンダリデータとして、またノードグループ1内の2つ目のホストには反対にオレンジのP1がセカンダリデータ、グリーンのP2がプライマリデータとして格納されます。
MySQL Clusterでは、このように各ノードグループ内のデータを冗長化して維持することで、1つのデータノードのプロセス、ホスト、通信経路に障害が発生した場合でも、サービスを継続できるように設計されています。
また、MySQL ClusterはプライマリキーにHash関数を用いてデータを格納するノードを決定します。このため、プライマリキーを利用しHashインデックスをうまく活用できる問い合わせであれば、非常に早くデータを特定し応答を返すことができます。しかしながら、プライマリキーをうまく利用できない問い合わせや、テーブルの一定範囲をスキャンするような問い合わせはHash関数を用いた特定行のルックアップと比較してネットワーク上の通信が多く発生し、思うような性能が発揮できないことがあります。
これはインデックスや表データをメモリまたは、ファイルシステムキャッシュに乗せ高速処理するMyISAMやInnoDBストレージエンジンと異なり、MySQL Clusterはネットワークを介した通信を行いながらデータを格納、検索しクラスタ構成を維持していることも要因の1つとなっています。このネットワークを介した通信処理には、MySQL Clusterが利用するネットワークの帯域幅を広げる、またはレイテンシの低いアーキテクチャーを持つ通信インターフェースを用いて通信速度を速めることも性能向上の有効な手段となります。
このほか、MySQLの各ストレージエンジンはSQL文の処理においても固有の特徴を持ちますが、MySQL Clusterも例外ではありません。NDB Clusterはトランザクションをサポートしますが、すべてのトランザクションレベルをサポートするInnoDBと異なりサポートするトランザクション分離レベルはRead Committedのみです。また、外部キーをサポートするInnoDBと異なり、NDB Clusterは外部キーをサポートしないため、必要な場合は、別途、トリガーを用いて実装するなどの対応が必要となります。