3種類のノードをセットアップ!
SQLノード
SQLノードの実体はmysqldです。つまり、通常のMySQLサーバーに対してNDBストレージエンジンが使用できるような設定を行います。設定は通常のMySQLサーバーと同様、my.cnf/my.iniにおいて行います。[mysqld]セクションに必要な設定を記述しましょう。
必要最低限の設定は、ndbclusterとconnect-stringです。前者はMySQL Clusterのストレージエンジン(NDB)を有効化するためであり、後者はデータノードと同様に管理ノードへの接続を確立するためのオプションです。my.cnfは次のようになります。
[mysqld]
ndbcluster
connect-string=192.168.1.40
すべてのデータをMySQL Clusterへ格納するのであれば、skip-innodbオプションを使用して、InnoDBを無効化するといいでしょう。そうすることでMySQLサーバーの起動が早くなりますし、メモリやCPUの使用を抑えることが可能です。
また、MySQL Clusterを使用する場合にはクエリキャッシュを無効にしておきましょう。MySQL Clusterのデータは複数のMySQLサーバーで共有されるのですが、クエリキャッシュは個別のMySQLサーバーだけで有効なのでデータの同期が取れない場合が生じるからです。
MySQL Clusterにおいて使用するMySQLサーバーではあまり多くのメモリは必要ありません。ただしソートや結合を処理する必要があるので、接続ごとに必要なバッファ(ソートバッファなど)を適切に割り振りましょう。
MySQLサーバーを実行するユーザーは、root以外のものを使用しましょう。前述と同じ手順でmysqlというユーザーを、sql1ゾーンとsql2ゾーンにおいて作成してください。
準備が整ったらMySQLサーバーを起動しましょう。まずはグローバルゾーンからsql1ゾーンへ接続します。
shell# zlogin sql1
今回は/var/lib/mysqlというディレクトリを、データディレクトリとして使用します。ここにはMySQL Clusterのデータは格納されませんが、各テーブルに対応した.frmファイルや、権限テーブルが格納されます。mysql_install_dbスクリプトを用いてデータディレクトリを初期化しましょう。
shell@sql1# su - mysql
shell@sql1> /user/local/mysql-cluster/scripts/mysql_install_db --datadir=/var/lib/mysql
MySQLサーバーを起動するにはmysqld_safeスクリプトを使用します。通常の場合と全く同じ手順ですね。
shell@sql1> mysqld_safe &
MySQLサーバーが起動したら、mysqlコマンドを使って接続しましょう。
shell@sql1> mysql -root
SHOW ENGINESでndbclusterのサポートがYESになっていれば設定は成功です。また、SHOW ENGINE NDB STATUSコマンドを使用すると接続状態を確認することが可能です。
mysql> SHOW ENGINES;
mysql> SHOW ENGINE NDB STATUS\G
管理クライアントでSHOWコマンド実行すると、SQLノードが接続している様子を見ることができます。
同様に、sql2ゾーン上でもMySQLサーバーを起動しましょう。
テーブル操作
MySQL Clusterを用いてテーブルを定義するのは非常に簡単です。ENGINE=NDBをテーブル定義の際に用いるだけです。例えば非常にシンプルなただ1つのカラムだけを持つテーブルを定義するには以下のように行います。
mysql> CREATE TABLE testdb.testtbl
-> (a BIGINT UNSIGNED NOT NULL PRIMARY KEY)
-> ENGINE=NDB;
既存のテーブルをMySQL Clusterに変換するにはALTER TABLEを使用します。
mysql> ALTER TABLE existing.table ENGINE=NDB;
MySQL Clusterのテーブルに対するデータ操作は、ほかのストレージエンジンと全く同じ方法で行います。
mysql> INSERT INTO testdb.teesttbl VALUES(1),(2),(3);
mysql> SELECT * FROM testdb.testttbl;
MySQL ClusterではテーブルをSQLノード間で共有します。そのため、sql1で実行しているMySQLサーバーで行った変更は、sql2で実行しているMySQLサーバーからも確認できます。CREATE TABLEやINSERT文を実行した後、別のSQLノードでも変更が反映されていることを確認してください。