そろそろ必要になったので。
今までやってきた案件は単一サーバor別稼働DBサーバ+Webサーバで十分な事が多くて、手を付けなかった所だったのですが、今回ちょっと大きめな案件をやることになり、「やべぇ!」と思って勉強を始めました。 わりと素人目線なのでツッコミがあれば是非。あと備忘録も含めててちょっとエントリ長くなります。
あ、MySQL Cluserについては公式サイトなどを見てくださいね。
サーバ構成
社内の勉強用のサーバーを特別にお借りすることができて、さくらのCentOS 6.3 x86_64 2GBを2台準備しました。 色々サンプルを見てたんですが、1台のサーバでクラスタを導入するサンプルばかりで、実際に別ホストのサーバに対して設定をしてるものがなかったので(テストだし費用かさむし仕方ないですね)、せっかく準備できたので私はちゃんと別サーバでクラスタを組んでみることに。クラスタってどういうものかは省いて、今回は以下の構成です。
- Server1 : IP xxx.xxx.xxx.xx - 管理ノード+Dataノード+SQLノード
- Server2: IP yyy.yyy.yyy.yy - Dataノード+SQLノード
Server1をプライマリとして管理ノードを持たせる感じで、それぞれはDataノードとSQLノードを持たせます。本当はDataノードだけを切り分けるほうがスマートなのかな?ともあれ、以下の設定については操作対象のものを@Server1とか書きますので覚えておいて下さい。
インストールまでやってみる
インストールとかは大体以下のサイトを参考にさせて頂きました:
基本的なところはふむふむと見てたんですが、みなさん何かyumでインストールされてるんですよね。 で、自分のサーバでコマンド発行すると…
# yum install mysql-cluster --enablerepo=remi
<span style="color:red">No package myql-cluster available.
Error: Nothing to do</span>
そんなものはないと怒られてしまいます…(´;ω;`) どうやらCentOS 6系のリポジトリにはmysql-clusterは存在しないようです。で、CentOS 6系で参考にさせて頂いたいのはいかのサイトです。ほぼそのままですが…
ソースからインストール
仕方がないのでソースコードからインストールすることにします。公式サイトからLinux Genericをダウンロードしてサーバーにアップ。
アーカイブをDLしたら、それぞれのサーバーにアップして展開。それぞれのサーバーにです。 基本的には各サーバに対して同じ設定をする感じですね。また、共通ユーザとしてmysqlユーザを作成します。
# mysqlグループ、ユーザを作成
groupadd mysql
useradd -g mysql mysql
# アーカイブを/usr/local/に展開
tar -zxvf /path/to/mysql-cluster-gpl-7.2.5-linux2.6-x86_64.tar.gz -C /usr/local
mv /usr/local/mysql-cluster-gpl-7.2.5-linux2.6-x86_64 /usr/local/mysql-cluster
# 使いやすいようにシンボリックリンク作る
cd /usr/local/mysql
ln -s mysql-cluster mysql
#MySQLインストール
scripts/mysql_install_db –user=mysql
# SQLノード用にmysqlサーバをセットアップ
chown -R root .
chown -R mysql data
chgrp -R mysql .
cp support-files/mysql.server /etc/rc.d/init.d/
chmod +x /etc/init.d/mysql.server
chkconfig –add mysql.server
/etc/init.d/mysql.server start
/etc/init.d/mysql.server stop
DataノードとSQLノードのみのServer2はここまででOKです。続いて、管理ノードのセットアップ。
@Server1
# 管理コマンド系のセットアップ
cd /usr/local/mysql-cluster
# ndb_mgmは管理ノードコマンドツール
mv bin/ndb_mgm .
# ndb_mgmdは管理ノードのデーモン
mv bin/ndb_mgmd .
# 実行権限付与
chmod +x ndb_mg*
# PATHの通ってる所に移す(/usr/local/bin/でもいいかも)
mv ndb_mg* /usr/bin/
続いて、管理ノードの設定ファイルをconfig.iniとして作成します。設置位置は/var/lib/mysql-clusterがいいみたいです。
@Server1
mkdir -p /var/lib/mysql-cluster
# 設定ファイルを新規作成
vi /var/lib/mysql-cluster/config.ini
[NDBD DEFAULT]
NoOfReplicas=2 # レプリケートしているサーバ数(多分Dataノードの数?)
[MYSQLD DEFAULT]
[NDB_MGMD DEFAULT]
[TCP DEFAULT]
# 管理ノード設定
[NDB_MGMD]
HostName=xxx.xxx.xxx.xx # 管理ノードを置いているサーバ(つまり自分)のIP。localhostでもいいかも
# DataノードのIP設定
[NDBD]
HostName=xxx.xxx.xxx.xx # このサーバにもDataノードがあるので指定
DataDir= /var/lib/mysql-cluster
[NDBD]
HostName=yyy.yyy.yyy.yy # もう一個のDataノード設置先サーバのIP
DataDir=/var/lib/mysql-cluster
[MYSQLD]
:wq
これで管理ノードの準備ができたので、設定ファイルを指定して起動。
ndb_mgmd -f /var/lib/mysql-cluster/config.ini
MySQL Cluster Management Server mysql-5.5.28 ndb-7.2.9
メッセージが返ればOK、設定ミスならエラーメッセージが出ます。あとは、Dataノードとして使うDB(今回は両方ですね)に管理ノードのIPを指定しておきます。
@Server1undefinedServer2両方
vi /etc/my.cnf
[mysqld]
ndbcluster # この記述でクラスタを利用できるようになる
ndb-connectstring=xxx.xxx.xxx.xx # 管理ノードのあるIP
[mysql_cluster]
ndb-connectstring=xxx.xxx.xxx.xx # こっちも管理ノードへのコネクトIPを指定
あとはDataノード側でndbコマンドでDataノードを起動します。
@Server1undefinedServer2
mkdir -p /var/lib/mysql-cluster
# Dataノードのデーモンを初期化して起動
/usr/local/mysql/bin/ndbd --initial
# MySQLデーモン(つまりSQLノードのこと)も起動
/etc/init.d/myser.server start
どちらも問題なく起動できれば、管理ノードから起動情報を確認します。
@Server1
# 管理ツール起動
ndb_mgm
-- NDB Cluster -- Management Client --
# プロンプトに変わるので、showコマンドで確認できる
ndb_mgm> show
Connected to Management Server at: xxx.xxx.xxx.xx:1186
Cluster Configuration
---------------------
# Dataノード2つ
[ndbd(NDB)] 2 node(s)
id=2 @xxx.xxx.xxx.xx (mysql-5.5.28 ndb-7.2.9undefined Nodegroup: 0undefined Master)
id=3 @yyy.yyy.yyy.yy (mysql-5.5.28 ndb-7.2.9undefined Nodegroup: 0)
# 管理ノード1つ
[ndb_mgmd(MGM)] 1 node(s)
id=1 @xxx.xxx.xxx.xx (mysql-5.5.28 ndb-7.2.9)
# SQLノード2つ
[mysqld(API)] 2 node(s)
id=4 @yyy.yyy.yyy.yy (mysql-5.5.28 ndb-7.2.9)
id=5 @xxx.xxx.xxx.xx (mysql-5.5.28 ndb-7.2.9)
うんうん、ちゃんと起動してますね(∩´∀`)∩ ちなみに、管理ノードはデフォルトで1186番ポートを使うようなので、ファイアーウォールの設定に気をつけたほうがいいですね。あと、試してないですが、それぞれ起動するclusterのバージョンは揃えたほうがいいと思います、多分。
Clusterの起動と停止
起動と停止には順番があるようで、停止から。
@Server1
# 先に管理ノードをシャットダウン
ndb_mgm
> shutdown
# 続いて、SQLノードを停止
@Server1undefinedServer2
/etc/init.d/mysql.server stop
先に管理ノード停止→SQLノード停止の流れですかね。起動の場合は今回の手順をまとめて、
@Server1
# 管理ノードのデーモン起動
ndb_mgmd -f /var/lib/mysql-cluster/config.ini
# 各Dataノード、SQLノードを起動
/usr/local/mysql/bin/ndb
/etc/init.d/mysql.server start
これでOK。ndb_mgmで起動しているかチェックするのを忘れず。
試しにやってみないとね
MySQL Clusterは「ndbcluster」というエンジンを使ってるテーブルに対して有効になるそうです。なので、ndbclusterエンジンが有効になっているかどうかを確認してみます。
@Sever1 OR Server2
mysql -uroot -p
mysql> show engines;
ndbclusterというエンジンが含まれていればOK! 続いて、Server1のSQLノードでテーブルを作ったらServer2のDataノード側でも生成されているかを確認してみます。
@Server1
# Server1からテーブル作成
use test;
mysql> create table hoge (id INT) ENGINE=NDBCLUSTER;
@Server2
# Server2でテーブル確認
mysql -uroot -p test
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| hoge |
+----------------+
テーブルが同期されてますね!本当はもっとmy.cnfで設定周りをちゃんとした方がいいのですが、今回は動かすまでの第一歩としてここまでー。
まとめ
NDBはメモリを比較的沢山使うようなので、ちょっとスペックの良いDBサーバを用意するといいらしいですね。あとは片方をフェイルオーバーさせてみたりして動作を検証してみたいと思います。まだまだ勉強しなければ。