All Articles

CentOS 6.x(x86_64)にmysql-clusterを入れて動かすメモ

そろそろ必要になったので。

今までやってきた案件は単一サーバ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系で参考にさせて頂いたいのはいかのサイトです。ほぼそのままですが…

Mysql Cluster 7.2.5 On Cent OS 6 (From Scratch)

ソースからインストール

仕方がないのでソースコードからインストールすることにします。公式サイトからLinux Genericをダウンロードしてサーバーにアップ。

Download MySQL Cluster

mysql-cluster

アーカイブを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サーバを用意するといいらしいですね。あとは片方をフェイルオーバーさせてみたりして動作を検証してみたいと思います。まだまだ勉強しなければ。