先日、インストールを行った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のデータは完全に同期されているといえます。
ここまでで、動作確認は終了です。想像していたよりも普通に動きました(笑)