本連載では、実際に「MySQL Cluster」を利用するためのチュートリアルとなるように、その特徴と基本的なアーキテクチャからインストール方法、基本的な操作などをコマンド付きで解説していきます。第2回の今回は、MySQL Clusterのインストール方法と基本的な設定および操作について紹介します。
MySQL Clusterのインストール
MySQL Clusterのインストール方法には、以下の方法があります。
- GUI付きインストーラを利用する方法
- 圧縮されたファイルを展開する方法
- Unix環境のパッケージファイルを利用する方法
上記以外にもソースコードからビルドする方法もありますが、公開されているバイナリはすでにコンパイルオプションの最適化などが行われているため、ソースコードを変更して機能の追加/削除を行う場合を除いておすすめできません。
対応プラットフォーム
MySQL Clusterは各Linuxディストリビューション、Solaris、WindowsおよびMac OS Xなど、主要なOS上での動作がサポートされています。MySQL Clusterの各バージョンとサポート対象OSについては下記のサイトを参照してください。
Supported Platforms : MySQL Cluster
http://www-jp.mysql.com/support/supportedplatforms/cluster.html
MySQL Clusterには特別なハードウェア要件はありません。簡単な動作検証であれば最近のノートPC程度のスペックでも十分にインストール可能です。考慮すべき点は、データやインデックスをメモリ上に格納するためデータ量に応じて必要となるメモリサイズが大きくなることですが、ある程度のメモリサイズはディスクテーブル機能により削減できます。
またノード間で頻繁にTCP/IP通信が行われるため、ギガビットイーサネット以上のネットワーク環境が推奨されます。同時アクセス数が大きなシステムではインフィニバンドを利用している例が多数あります。
実際のシステムへの導入に当たっては、通常プロトタイプとなるアプリケーションを用いたテストを行ってハードウェアのスペックを決定していきます。
インストールパッケージ
MySQL Clusterのインストールパッケージは下記のサイトからダウンロード可能です。「Select Platform:」のプルダウンから対象のOSを選択し、必要なファイルをダウンロードしましょう。
Download MySQL Cluster
http://dev.mysql.com/downloads/cluster/
Windows環境向けにはGUIインストーラ(MSI Installer)と必要なファイルをまとめたzipファイルが用意されています。インストールされたファイルを管理したり、サービスとして起動したりする場合などはGUIインストーラが便利です。zipファイルは展開するだけで利用でき、レジストリも汚さないため検証などの用途に使いやすいほか、手動でOSサービスに登録するなどで起動/停止方法を用意すれば本番環境での利用も問題ありません。
Linux環境には各ディストリビューション向けのパッケージ(rpmやdeb)と、ディストリビューション共通のtar.gzファイルが用意されています。
Linux環境でのインストール手順
ここでは、Linux環境でディストリビューション共通のtar.gzファイルを利用したインストール方法を説明します。このファイルは、ダウンロードサイトのSelect Platformで「Linux - Generic」を選択することでダウンロード可能です。以降の説明では、下記のシステム構成を想定して説明していきます(図1)。
- 全ノードは同一OS上で動作させる
- SQLノード2台、データノード2台、管理ノード1台の構成
- /home/mysqlをホームディレクトリとするmysqlユーザで作業
図1:本連載でのMySQL Cluster構成図とディレクトリ配置
ファイルの展開と基本的な設定
バイナリのインストールはtar.gzファイルを展開するだけでおおむね終わってしまいます。以降の作業を行いやすく、また本番環境などではバージョンを切り替えやすくするために、展開先のディレクトリにシンボリックリンクを張っておきます(リスト1)。
リスト1:バイナリの展開とシンボリックリンク作成、SQLノードの初期化
$ pwd
/home/mysql
$ tar zxvf mysql-cluster-gpl-7.4.6-linux-glibc2.5-x86_64.tar.gz
$ ln -s mysql-cluster-gpl-7.4.6-linux-glibc2.5-x86_64 mysqlc
$ cd mysqlc
$ #下記コマンド実行前に設定ファイルmy1.cnfおよびmy2.cnfを作成しておく
$ #ファイルの内容は本文に後述
$ scripts/mysql_install_db --defaults-file=/home/mysql/mysqlc/my1.cnf
$ scripts/mysql_install_db --defaults-file=/home/mysql/mysqlc/my2.cnf
$ #データノードと管理ノードのデータディレクトリ作成
$ mkdir data/data1 data/data2 data/mgmd
SQLノードは通常のMySQLサーバと同様にmysql_install_dbコマンドで権限テーブルなどを作成する初期化処理も行います。リスト1の例では後述の設定ファイルを指定しています。必要となる設定はSQLノードのmysqldが起動時に読み込む設定ファイル「my.cnf」と管理ノードが保持するクラスタ全体の設定ファイル「config.ini」です。
SQLノードの設定項目
SQLノードの設定ファイルは通常のMySQLサーバと同様にmy.cnfを使います。MySQL Cluster固有で最低限求められる設定項目は表1の通りです。
表1:SQLノードで最低限求められる設定項目
パラメータ名 | 意味 |
ndbcluster | NDBCLUSTERストレージエンジンを利用 |
ndb-connectstring | 管理ノードのIPアドレス(またはホスト名)およびTCP/IPポートを指定 |
ndbclusterは設定ファイルに記載または起動オプションに設定するだけでNDBCLUSTERストレージエンジンが有効になります。明示的に値を設定する必要はありません。ndb-connectstringで管理ノードの情報を指定すると、SQLノードは起動時に管理ノードからクラスタ全体の構成情報を取得します。
MySQL Cluster固有のMySQLサーバの設定項目の詳細は下記のサイトを参照してください。
18.3.4.2. MySQL Cluster用のMySQL Serverオプション
http://dev.mysql.com/doc/refman/5.6/ja/mysql-cluster-program-options-mysqld.html
なお、1つのOS上で複数のSQLノードを起動する場合、表2の項目についてノード毎に重複しない値を設定しておく必要があります。これは通常のMySQLサーバを複数起動する場合でも同様です。
表2:1つのOS上で複数のSQLノードを起動する際に変更する設定項目
パラメータ名 | 意味 |
server_id | mysqldを一意に識別するID |
datadir | データディレクトリ |
port | TCP/IPポート番号 |
socket | UNIXソケットファイル |
以上を踏まえて作成した設定ファイル(my1.cnf)の例がリスト2です。
リスト2:SQLノードの設定(my1.cnf)
#SQLノードの設定項目
[mysqld]
ndbcluster
ndb-connectstring = localhost:1186
#1つのOS上で複数のSQLノードを起動するための設定項目
#別のSQLノードではそれぞれの値を変更する
server_id = 1
datadir = /home/mysql/mysqlc/data/sql1/
port = 3306
socket = /tmp/mysql1.sock
#/usr/local/mysql以外にプログラムを展開した際に必要な設定
#通常のMySQLサーバでも同様
basedir = /home/mysql/mysqlc
管理ノードの設定項目
管理ノードでは下記の3点を設定ファイル(config.ini)に記述しています。
- クラスタを構成するノードのリスト
- ノードの種類別の設定
- ノード固有の設定
特にデータノードは固有の設定ファイルを持たないため、データノードへの設定はすべて管理ノードの設定ファイルに記載しておきます。リスト3は管理ノードの設定ファイルの例です。クラスタ内の各ノードの台数は大括弧([ ])で記載されたノードの数だけ起動可能です。DataDirで指定される管理ノードとデータノードのデータディレクトリはあらかじめ作成しておきます。
リスト3:管理ノードの設定(config.ini)
#管理ノードの設定項目
[ndb_mgmd]
DataDir = /home/mysql/mysqlc/data/mgmd/
HostName = localhost
#データノード共通の設定項目
[ndbd default]
#データの多重化の数 2-4が指定可能
NoOfReplicas = 2
#各データノードの個別設定項目
[ndbd]
DataDir = /home/mysql/mysqlc/data/data1/
[ndbd]
DataDir = /home/mysql/mysqlc/data/data2/
#各SQLノードの個別設定項目
[mysqld]
[mysqld]
データノードの設定項目
前述した通り、データノードは設定ファイルを持たず、個別設定項目は管理ノードの設定ファイルに記載します。データノードは起動時には、コマンドラインオプション-ndb-connectstringで管理ノードを指定しておき、設定情報を管理ノードから取得します。
基本的な操作
MySQL Clusterの初回起動時には、管理ノードの起動時に--initialオプションを付けて設定ファイルを読み込みます。その後、各データノード→各SQLノードの順に起動していきます。クラスタ全体を停止する際は、まずSQLノードを停止してアプリケーションからクラスタへアクセスできないようにし、その後管理ノードにクラスタの停止命令を出して各データノードを停止し、最後に管理ノードを停止します。
クラスタの起動と簡単な稼働確認
リスト4の例では、まず--initialオプションを付けて新しい設定ファイルを読み込んで管理ノードを起動しています。続いて2つのデータノードを起動し、管理ノードクライアントのndb_mgmコマンドから管理ノードに接続し、SHOWコマンドでクラスタの状態を確認しています。
リスト4:管理ノード・データノードの起動とクラスタの状態を確認
$ cd /home/mysql/mysqlc/bin
$ ./ndb_mgmd --initial --configdir=/home/mysql/mysqlc -f /home/mysql/mysqlc/config.ini
MySQL Cluster Management Server mysql-5.6.24 ndb-7.4.6
$ ./ndbmtd --ndb-connectstring=localhost:1186
2015-07-07 12:34:12 [ndbd] INFO -- Angel connected to 'localhost:1186'
2015-07-07 12:34:12 [ndbd] INFO -- Angel allocated nodeid: 2
$ ./ndbmtd --ndb-connectstring=localhost:1186
2015-07-07 12:34:13 [ndbd] INFO -- Angel connected to 'localhost:1186'
2015-07-07 12:34:13 [ndbd] INFO -- Angel allocated nodeid: 3
$ ./ndb_mgm --ndb-connectstring=localhost:1186
-- 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 (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0, *)
id=3 @127.0.0.1 (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @127.0.0.1 (mysql-5.6.24 ndb-7.4.6)
[mysqld(API)] 2 node(s)
id=4 (not connected, accepting connect from any host)
id=5 (not connected, accepting connect from any host)
ndb_mgm> QUIT
この段階ではまだSQLノードは起動していないため、[mysqld(API)]に「not connected」と表示されています。ここで、さらに2つのSQLノードを起動し、管理ノードからクラスタの状態を確認します(リスト5)。設定ファイルはSQLノード毎に「my1.cnf」と「my2.cnf」という名称にしています。クラスタの状態確認には、管理ノードクライアントの-eオプションを使用して管理ノードに直接コマンドを実行しています。
リスト5:SQLノードを起動し管理ノードからクラスタの状態を確認
$ ./mysqld --defaults-file=/home/mysql/mysqlc/my1.cnf &
$ ./mysqld --defaults-file=/home/mysql/mysqlc/my2.cnf &
$ ./ndb_mgm -e SHOW
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @127.0.0.1 (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0, *)
id=3 @127.0.0.1 (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @127.0.0.1 (mysql-5.6.24 ndb-7.4.6)
[mysqld(API)] 2 node(s)
id=4 @127.0.0.1 (mysql-5.6.24 ndb-7.4.6)
id=5 @127.0.0.1 (mysql-5.6.24 ndb-7.4.6)
ここではSQLノード起動時の出力を割愛していますが、通常のMySQLサーバの起動時とは異なりNDBCLUSTERストレージエンジンの各種メッセージも併せて表示されます。
クラスタの簡単な動作確認
第1回で、NDBCLUSTERストレージエンジンを使ったテーブルがSQLノード上に作成されるわけではないと解説しましたが、このことを確認してみます。また、InnoDBストレージエンジンを使ったテーブルがSQLノード上に作成されることも併せて確認してみます。
リスト6:クラスタの動作を確認
$ # TCP/IPポート3306で起動しているSQLノード1に接続し、NDBCLUSTERストレージエンジンを使用したテーブルをtestデータベースに作成
$ ./mysql -h127.0.0.1 -P3306 -uroot -e"CREATE TABLE t1(id INT(8), col1 VARCHAR(32)) ENGINE = NDBCLUSTER" test
$ # TCP/IPポート3306で起動しているSQLノード1に接続し、InnoDBストレージエンジンを使用したテーブルをtestデータベースに作成
$ ./mysql -h127.0.0.1 -P3306 -uroot -e"CREATE TABLE t1_innodb(id INT(8), col1 VARCHAR(32)) ENGINE = InnoDB" test
$ # TCP/IPポート3306で起動しているSQLノード1に接続し、testデータベース内のt1テーブルの定義を取得
$ ./mysql -h127.0.0.1 -P3306 -uroot -e"DESC t1" test
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(8) | YES | | NULL | |
| col1 | varchar(32) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
$ # TCP/IPポート3306で起動しているSQLノード1に接続し、testデータベース内のt1_innodbテーブルの定義を取得
$ ./mysql -h127.0.0.1 -P3306 -uroot -e"DESC t1_innodb" test
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(8) | YES | | NULL | |
| col1 | varchar(32) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
$ # TCP/IPポート3307で起動しているSQLノード2に接続し、testデータベース内のt1テーブルの定義を取得
$ ./mysql -h127.0.0.1 -P3307 -uroot -e"DESC t1" test
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(8) | YES | | NULL | |
| col1 | varchar(32) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
$ # TCP/IPポート3307で起動しているSQLノード2に接続し、testデータベース内のt1_innodbテーブルの定義を取得 (t1_innodbテーブルはデータノードでは無くSQLノード1上にあるため、SQLノード2からはアクセスできずにエラーになる)
$ ./mysql -h127.0.0.1 -P3307 -uroot -e"DESC t1_innodb" test
ERROR 1146 (42S02) at line 1: Table 'test.t1_innodb' doesn't exist
クラスタの停止
SQLノードの停止は通常のMySQLサーバと同様にmysqladminのshutdownコマンドを利用します(リスト7)。
リスト7:SQLノードの停止
$ ./mysqladmin -uroot -h 127.0.0.1 -P3306 shutdown
$ ./mysqladmin -uroot -h 127.0.0.1 -P3307 shutdown
この時点で、アプリケーションからデータにアクセスできなくなっています。SQLノードを停止する前にデータノードを停止してしまうと、アプリケーションからのSQL文は受け付けるものの、データにたどり着けないというエラーとなります。
続けて、管理ノードで停止命令を実行すると、すべてのデータノード停止後に管理ノードも停止します(リスト8)。
リスト8:データノード・管理ノードの停止
$ ./ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> SHUTDOWN
Connected to Management Server at: localhost:1186
Node 3: Cluster shutdown initiated
Node 2: Cluster shutdown initiated
Node 3: Node shutdown completed.
Node 2: Node shutdown completed.
3 NDB Cluster node(s) have shutdown.
Disconnecting to allow management server to shutdown.
ndb_mgm>
ndb_mgm> QUIT
管理ノードクライアントの-eオプションにshutdownコマンドを付けても、同様に各ノードを停止できます(リスト9)。
リスト9:管理ノードクライアントからのデータノード・管理ノードの停止
$ ./ndb_mgm -e SHUTDOWN
Connected to Management Server at: localhost:1186
3 NDB Cluster node(s) have shutdown.
Disconnecting to allow management server to shutdown.
おわりに
今回は、MySQL Clusterのインストール方法と基本操作について解説しました。第3回では、MySQL Clusterの主な設定について解説する予定です。
※本稿において示されている見解は、私自身の見解であって、私の所属するオラクルの見解を必ずしも反映したものではありません。