Category:MySQL Cluster

出典: MySQL Practice Wiki



MySQL Clusterは分散並列型のデータベースであり、複数のノードから構成される。各ノードは別々のホストで動作させるのが一般的であるが、場合によっては単一のホストに同居させることも可能である。(サーバ台数が少ない場合やテスト目的など。)ここでは、MySQL Clusterにどのようなノードがあり、それぞれどのような働きをするのかを説明する。

MySQL Clusterを構成するノードは以下の3つである。

  • 管理ノード
  • データノード
  • SQLノード(APIノード)

3つのノードが協調動作する様子を以下の図で示す。

Image:Cluster_nodes.png‎

管理ノード

管理ノードはMySQL Clusterの構成情報を管理したり、各種管理タスクを実行するノードのことである。プロセス名はndb_mgmdである。管理ノードは以下のタスクを行う。

MySQL Clusterの構成情報管理|config.iniと呼ばれるファイルから構成情報を読み込み、各ノードへ伝達する。従って、MySQL Clusterを開始するためには、まず最初に管理ノードを起動しなければならない。
ノードの起動・停止|データノードを起動・停止するのも管理ノードの役割である。また、管理ノード自身を終了させることもできる。
ステータスの表示|SHOWコマンドやSTATUSコマンド、REPORTコマンドを用いてMySQL Clusterに含まれるノードの状態を調べることができる。
バックアップの開始・中断|バックアップの実行は各データノード上で行われるが、バックアップ開始の指令を送るのは管理ノードである。
ログ管理|データノードは何らかのイベントが発生すると、管理ノードへその情報を送信する。管理ノードは予め設定されたポリシーに基づいて、イベントの情報をログへ記録する。

管理ノードを起動するには、ndb_mgmdコマンドを実行すれば良い。

shell> ndb_mgmd -f config.ini

管理ノードに接続するには、ndb_mgmコマンドラインプログラムを利用する。ndb_mgmは、ndb_mgmdが同じホストで稼働している場合にはオプションなしで起動出来る。他のホストでndb_mgmdが稼働している場合には、以下のようにすることで接続が可能である。

shell> ndb_mgm -c 管理ノードホスト名

データノード

データノードは読んで字のごとくデータを格納するためのノードである。データを格納するだけでなく、インデックス情報を管理したり、データの冗長化をしたり、お互いのノードを監視したりなど、まさにMySQL Clusterの核となるノードである。

MySQL Clusterでは、シェアードナッシングという手法を用いてデータを各データノードに分割して保存する。シェアードナッシングとは、何も共有しないということであり、より具体的に言うと共有ディスクを利用しないということである。各テーブルは行単位で各ノードに割り振られる水平パーティショニングを用いて分割される。分散には主キーが用いられる。明示的に主キーを指定しない場合には、MySQL Clusterが内部的に主キーを作成することになる。各パーティションのデータを全て寄せ集めることでテーブルを再現することができる。逆に言うと、パーティションが一つでも欠けるとテーブルを復元することが出来ないのである。

データをパーティションで分割しただけでは、そのパーティションを格納しているノードに何らかの障害が発生した場合に、テーブルを復元することが出来なくなってしまう。そのような事態を避けるために、MySQL Clusterでは複製(レプリカ)を利用する。各パーティションのデータを、複数のノードに複製することにより、単一のノードがダウンした場合でも処理を継続させることができるのである。

データノードのプロセスはndbdである。ndbdは以下のように起動することが出来る。

shell> ndbd -c 管理ノードホスト名

クラスタを開始させる場合には、--no-startオプション(短縮形は-n)を利用するのが一般的である。何故ならば、データノードは同時に起動出来なかった場合、遅れたノードがあるとタイムアウトして起動に失敗してしまう。--no-startオプションを利用して、管理ノードから以下のようにクラスタを開始するといいだろう。

ndb_mgm> ALL START

SQLノード

SQLノードは別名APIノードと呼ばれる。データノードへアクセスするクライアントノードである。SQLノードの代表格はmysqldである。--ndbclusterオプションと、--ndb-connectstringオプションをつけてmysqldを起動すると、NDBCLUSTERストレージエンジンが有効になる。mysqldのストレージエンジンとしてアクセスすることで、他のストレージエンジンと同様にMySQL Clusterを利用することが出来るため非常に便利である。SQLノードは多数利用するのが一般的である。SQLノードが単一障害になってはいけないし、SQL文の解析の負荷を分散する必要もあるからである。

mysqldがデータノードへアクセスする際には、NDB APIプロトコルを利用する。NDB APIを使うアプリケーションであれば、mysqld以外のプログラムであってもデータノードへアクセスすることが出来る。mysqld以外にNDB APIに対応しているプログラムはOpenLDAPがある。OpenLDAP 2.4.12以降で、MySQL Clusterをバックエンドデータベースとして利用することが可能である。

NDB APIは使い方が特殊であるためやや難しいが、アプリケーションをNDB APIを用いて実装することにより、mysqldをスキップしてデータノードへアクセスすることができる。mysqldをスキップすることで、mysqldにおけるオーバーヘッドがなくなるので非常に高速である。真にリアルタイム性を必要とするアプリケーションでは、NDB APIを利用するといいだろう。

個人用ツール