MySQL Cluster の設定

先日、インストールを行ったMySQL Cluster(d:id:rx7:20070521:p1)を実際に設定して動かしてみたいと思います。

MySQL Clusterについては、前エントリで紹介した参考リンクをご参照ください。


今回は、Linuxマシン2台(共にLinuxマシンで、先日紹介したインストール作業を2台とも実施済みとします)を準備し、それぞれのホスト名とIPアドレスを"etch01 (192.168.0.51)"、"etch02 (192.168.0.52)"として、進めたいと思います。
# 別にホスト名やIPアドレスは何でも良いです。任意ですので。
# 普通に2台のマシンを準備するのはお金がかかりますので、VMWareやXenなどの仮想環境でお試しいただくことをオススメします。


さて、今回の環境を簡単にまとめると、、、

Host Name IP Address Management Node SQL Node Data Node
etch01 192.168.0.51
etch02 192.168.0.52

こんな感じの前提で進めていきます。

使ったMySQLのバージョンや、インストール方法については先日のエントリ(d:id:rx7:20070521:p1)をご参照ください。

ちなみに、以降このエントリでは、基本的にIPアドレスで各ホストを表現していますが、/etc/hostsを設定した上で、ホスト名を指定しておいた方が良いと思います。


さて、早速設定したいと思います。
まずは、面倒くさいのでrootになって作業します。ダメ?(笑)

$ su -


とりあえず、MySQLの設定ファイルを作ります(テンプレートをコピーしてきます)。
# 以降、MySQLを"/usr/local/mysql5"にインストールした場合を前提とします。

# cp /usr/local/mysql5/share/mysql/my-large.cnf /etc/my.cnf

設定ファイルを編集。

# vi /etc/my.cnf

こんな感じで。変更・追記点だけ以下に書いています。
ちなみに、これはSQL Nodeになるホストには全て必要です。つまり、今回の場合はetch01、etch02の両方に必要です。

[mysqld]
ndbcluster
ndb-connectstring=192.168.0.51


さて、次は、MySQL ClusterのManagement Nodeの設定ファイル。今回の場合は、etch01の方だけ作ればOK。
とりあえずディレクトリを作って、そこに設定ファイルのテンプレートをコピー。

# mkdir /var/lib/mysql-cluster
# cp /usr/local/mysql5/share/mysql/ndb-config-2-node.ini /var/lib/mysql-cluster/ndb-config.ini

で、編集。

# vi /var/lib/mysql-cluster/ndb-config.ini

中身は、こんな感じで編集。
[ndb_mgmd]はManagement Node、[ndbd]はData Node、[mysqld]はSQL Nodeの設定となります。

# Example Ndbcluster storage engine config file.
#
[ndbd default]
NoOfReplicas= 2
MaxNoOfConcurrentOperations= 10000
DataMemory= 80M
IndexMemory= 24M
TimeBetweenWatchDogCheck= 30000
DataDir= /var/lib/mysql-cluster
MaxNoOfOrderedIndexes= 512

[ndb_mgmd default]
DataDir= /var/lib/mysql-cluster

[ndb_mgmd]
Id=1
HostName=192.168.0.51

[ndbd]
Id= 2
HostName=192.168.0.51

[ndbd]
Id= 3
HostName=192.168.0.52

[mysqld]
Id= 4
HostName=192.168.0.51

[mysqld]
Id= 5
HostName=192.168.0.52

# choose an unused port number
# in this configuration 63132, 63133, and 63134
# will be used
[tcp default]
PortNumber= 63132

じゃあ、早速Management Node(サーバ)を起動してみます。

ちなみに、ファイヤーウォール等の設定をされている場合、使用するポートを明けておく必要があります。Management Nodeはデフォルトで1186、Data Nodeはデフォルトで63132(63133, 63134)、SQLノードはデフォルトで3306。

# /usr/local/mysql5/libexec/ndb_mgmd -d -f /var/lib/mysql-cluster/ndb-config.ini

すると、以下のようなWarningが・・・。

Cluster configuration warning:
  arbitrator with id 1 and db node with id 2 on same host 192.168.0.51
  Running arbitrator on the same host as a database node may
  cause complete cluster shutdown in case of host failure.

・・・というわけで、MySQL ClusterのManagement Nodeの設定ファイルをもう一度開き、、、

# vi /var/lib/mysql-cluster/ndb-config.ini

以下の箇所を、こんな感じで修正。

[ndbd default]
NoOfReplicas= 1

で、再度起動すると、、、

# /usr/local/mysql5/libexec/ndb_mgmd -d -f /var/lib/mysql-cluster/ndb-config.ini

Warningが出なくなりました!


さて、次にData Nodeの起動。
etch01は、以下のような感じで起動。

# /usr/local/mysql5/libexec/ndbd --initial

etch02(非Management Node)は以下のような感じで起動しましょう。

# /usr/local/mysql5/libexec/ndbd --initial --ndb-connectstring=192.168.0.51

さて、最後にSQL Nodeの起動です。普通にmysqldを起動するのと変わりません。
mysqlプロセスのオーナーにスイッチして、、、(無ければuseraddして作りましょう。デフォルトでは確かmysql。)

# su mysql

DBを作成して、、、

# mkdir /usr/local/mysql5/var
# /usr/local/mysql5/bin/mysql_install_db --datadir=/usr/local/mysql5/var

で、SQL Node(mysqld)を起動。

# /usr/local/mysql5/bin/mysqld_safe &

これで、MySQL Clusterの稼動する環境構築は一応完了。
ちょっと動作確認してみましょう。まずはManagement Nodeに接続して確認してみます。
以下、コマンドを実行してみます。

# /usr/local/mysql5/bin/ndb_mgm

以下のような結果が返ってきたら成功!

-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]    2 node(s)
id=2    @127.0.0.1  (Version: 5.1.18, starting, Nodegroup: 0, Master)
id=3    @192.168.0.52  (Version: 5.1.18, starting, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1   (Version: 5.1.18)

[mysqld(API)]  2 node(s)
id=4 (not connected, accepting connect from 192.168.0.51)
id=5 (not connected, accepting connect from 192.168.0.52)

では、DB接続してみます。まずはetch01に接続。

# /usr/local/mysql5/bin/mysql -u root

スキーマを作成し、テーブルを作ってみます。名前とテーブル構造はかなり適当(^^;
テーブルを作るとき、NDBエンジンを使いますので、最後に「engine=ndbcluster」の指定が必要となります。

mysql> create database cluster_test;
mysql> use cluster_test;
mysql> create table test01(id int(10) not null auto_increment, name varchar(100), primary key (id)) engine=ndbcluster;

1行分データを登録。

mysql> insert into test01 values('1', 'test-user');
Query OK, 1 row affected (0.02 sec)

で、SELECT文を流してみると、、、

mysql> select * from test01;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | test-user |
+----+-----------+
1 row in set (0.01 sec)

データが作成できたようです。うむ、今のところ普通に動いています。


では、次は、etch02に接続してみます。

# /usr/local/mysql5/bin/mysql -u root

で、さっきetch01で作ったスキーマに接続して、、、

mysql> use cluster_test;
Database changed

さっき作ったテーブルにSELECT文を投げてみると、、、

mysql> select * from test01;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | test-user |
+----+-----------+
1 row in set (0.07 sec)

おおっ!さっき、etch01で挿入したデータが既に反映されています。
じゃあ、ついでにetch02から1レコード登録。ついでにテーブルを参照するSQLも実行。

mysql> insert into test01 values('2', 'rx7');
Query OK, 1 row affected (0.03 sec)

mysql> select * from test01;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | test-user |
|  2 | rx7       |
+----+-----------+
2 rows in set (0.00 sec)

素早く、etch01に接続し(さっき使っていたコンソールで)、SELECT文でテーブルを参照してみると、、、

mysql> select * from test01;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | test-user |
|  2 | rx7       |
+----+-----------+
2 rows in set (0.01 sec)

おおっ!きっちり反映されています。これで、etch01とetch02のデータは完全に同期されているといえます。

ここまでで、動作確認は終了です。想像していたよりも普通に動きました(笑)