最近MySQL界隈のセミナーなどで耳にするMySQL Clusterに興味を持ってしまい、書籍などで調べてみたものの良く分からず、
どうしても実際にイジって見ないと気が済まないのでSolaris版を作ってやってみました。
MySQL Clusterの詳細は非常に奥深いので、私が適当な事を書くと叱られると思いますので、書籍やMySQLの先生方にお願いするとして(適当ですみません)、とりあえずSolarisゾーンで試してみる。
今回はSolarisゾーンへのインストールから初期動作までということで...
パッケージサーバーの準備
まずはインストールとか言われても、やる気が起きるわけがないので、こちらに用意しました。IPSサーバーを準備すればソースからのビルドは免れます。
gentoo install battleの猛者には叱られるかもしれません...
まずはゾーンを準備
構築環境
- Gentoo Linux Linux 3.14.2-gentoo #7 SMP
- Solaris11.1 x86 on vmware player
で仮想環境のSolaris上へ、準備するゾーンは全部で5つ、
- iichiko2-spec(IPSパッケージ用)
- mgm(マネージメントノード)
- sql1(SQLノード1)
- sql2(SQLノード2)
- data1(データノード1)
- data2(データノード2)
以上のゾーンで構成します、実際はvmware player for gentoo上の仮想環境上のSolaris11なのでその辺の環境の差は各自で調整してください。
iichiko2-specゾーン
create -b
set brand=solaris
set zonepath=/rpool/zones/iichiko2-spec
set autoboot=false
set ip-type=shared
add net
set address=192.168.254.103/24
set configure-allowed-address=true
set physical=net0
end
mgmゾーン
create -b
set brand=solaris
set zonepath=/rpool/zones/mgm
set autoboot=false
set ip-type=shared
add net
set address=192.168.254.80/24
set configure-allowed-address=true
set physical=net0
end
sql1ゾーン
create -b
set brand=solaris
set zonepath=/rpool/zones/sql1
set autoboot=false
set ip-type=shared
add net
set address=192.168.254.81/24
set configure-allowed-address=true
set physical=net0
end
sql2ゾーン
create -b
set brand=solaris
set zonepath=/rpool/zones/sql2
set autoboot=false
set ip-type=shared
add net
set address=192.168.254.82/24
set configure-allowed-address=true
set physical=net0
end
data1ゾーン
create -b
set brand=solaris
set zonepath=/rpool/zones/data1
set autoboot=false
set ip-type=shared
add net
set address=192.168.254.83/24
set configure-allowed-address=true
set physical=net0
end
data2ゾーン
create -b
set brand=solaris
set zonepath=/rpool/zones/data2
set autoboot=false
set ip-type=shared
add net
set address=192.168.254.84/24
set configure-allowed-address=true
set physical=net0
end
ゾーン作成とパッケージインストール
iichiko2-specを作成しIPSを利用できるようにする
global-zone ~ # zoneadm -z iichiko2-spec install
global-zone ~ # zlogin -C iichiko2-spec
IPS設定
root@iichiko2-spec:~# wget http://www.karky7.com/files/ips-mysql-cluster-7.4.6_2015.05.06.zfs.img.gz
root@iichiko2-spec:~# zfs create -p -o mountpoint=/var/pkglocal rpool/pkglocal
root@iichiko2-spec:~# gunzip < ips-mysql-cluster-7.4.6_2015.05.06.zfs.img.gz | zfs recv -F rpool/pkglocal
root@iichiko2-spec:~# svccfg -s application/pkg/server setprop pkg/inst_root=/var/pkglocal
root@iichiko2-spec:~# svccfg -s pkg/server setprop pkg/port=80
root@iichiko2-spec:~# svccfg -s svc:/application/pkg/server setprop pkg/readonly=true
root@iichiko2-spec:~# svcadm refresh pkg/server
root@iichiko2-spec:~# svcadm enable pkg/server
こんな画面が出ればOK、これでpkg installが可能になる
global-zone ~ # pkg set-publisher -g http://192.168.254.103 iichiko2-spec
global-zone ~ # pkg publisher
発行元 タイプ ステータス P 場所
solaris 起点 オンライン F http://192.168.254.100/
iichiko2-spec 起点 オンライン F http://192.168.254.103/
global-zone ~ #
続いて各サーバーを作成
global-zone ~ # zoneadm -z mgm install
global-zone ~ # zlogin -C mgm
とりあえずmgmゾーンでパッケージを入れて、後はゾーンのクローンで済ませる(面倒)
global-zone ~ # zlogin mgm
[Connected to zone 'mgm' pts/3]
Oracle Corporation SunOS 5.11 11.1 September 2012
root@mgm:~# pkg install pkg://iichiko2-spec/database/mysql-cluster-gpl-74 \
pkg://iichiko2-spec/database/mysql-cluster-gpl-74/devel \
pkg://iichiko2-spec/database/mysql-cluster-gpl-74/doc \
pkg://iichiko2-spec/database/mysql-cluster-gpl-74/library \
pkg://iichiko2-spec/database/mysql-cluster-gpl-74/server \
pkg://iichiko2-spec/database/mysql-cluster-gpl-74/tests
Packages to install: 6
Create boot environment: No
Create backup boot environment: No
Services to change: 1
DOWNLOAD PKGS FILES XFER (MB) SPEED
Completed 6/6 15897/15897 329.3/329.3 3.0M/s
PHASE ITEMS
Installing new actions 16957/16957
Updating package state database Done
Updating image state Done
Creating fast lookup database Done
root@mgm:~#
後はcloneで増産
global-zone ~ # zoneadm -z mgm shutdown
global-zone ~ # zoneadm -z sql1 clone mgm
global-zone ~ # zoneadm -z sql2 clone mgm
global-zone ~ # zoneadm -z data1 clone mgm
global-zone ~ # zoneadm -z data2 clone mgm
global-zone ~ # zoneadm -z sql1 boot
global-zone ~ # zoneadm -z sql2 boot
global-zone ~ # zoneadm -z data1 boot
global-zone ~ # zoneadm -z data2 boot
global-zone ~ # zlogin -C sql1
global-zone ~ # zlogin -C sql2
global-zone ~ # zlogin -C data1
global-zone ~ # zlogin -C data2
global-zone ~ # zoneadm -z mgm boot
全部揃うとこんな感じでゾーンが稼働中
ID NAME STATUS PATH BRAND IP
0 global running / solaris shared
3 iichiko2-spec running /rpool/zones/iichiko2-spec solaris shared
10 sql1 running /rpool/zones/sql1 solaris shared
11 sql2 running /rpool/zones/sql2 solaris shared
12 data1 running /rpool/zones/data1 solaris shared
13 data2 running /rpool/zones/data2 solaris shared
14 mgm running /rpool/zones/mgm solaris shared
ここからMySQL Clusterの設定
マネージメントサーバーの設定
global-zone ~ # zlogin mgm
root@mgm:~# cp /etc/mysql/7.4/ndb-mgmd_74.config.sample /etc/mysql/config.ini
root@mgm:~# svcadm enable svc:/application/database/ndb-mgmd_74:default
root@mgm:~# ls -l /var/mysql/7.4/mgm/
total 7
-rw-r--r-- 1 mysql mysql 5 2015-05-07 08:03 ndb_1.pid
-rw-r--r-- 1 mysql mysql 687 2015-05-07 08:03 ndb_1_cluster.log
-rw-r--r-- 1 mysql mysql 4380 2015-05-07 08:03 ndb_1_config.bin.1
-rw-r--r-- 1 mysql mysql 81 2015-05-07 08:03 ndb_1_out.log
root@mgm:~#
とりあえずこんな感じで動く、他のゾーンはまだ動いてないよ
root@mgm:~# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=4 (not connected, accepting connect from 192.168.254.83)
id=5 (not connected, accepting connect from 192.168.254.84)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.254.80 (mysql-5.6.24 ndb-7.4.6)
[mysqld(API)] 2 node(s)
id=2 (not connected, accepting connect from 192.168.254.81)
id=3 (not connected, accepting connect from 192.168.254.82)
ndb_mgm>
各ゾーンのIPとIDが重要なので、変更する場合は各自で調整してください
data1の設定
IDがプロセスIDのpidファイル名に含まれてしまうので、ここは調整しておく
global-zone ~ # zlogin data1
root@data1:~# cp /etc/mysql/7.4/ndb-ndbmtd_74.my.cnf.ndb /etc/mysql/my.cnf
root@data1:~# svcprop svc:/application/database/ndb-ndbmtd_74:default | grep pid
ndb-ndbmtd_74/pid astring /var/mysql/7.4/data/ndb_5.pid
root@data1:~# svccfg -s svc:/application/database/ndb-ndbmtd_74:default setprop ndb-ndbmtd_74/pid="/var/mysql/7.4/data/ndb_4.pid"
root@data1:~# svcadm refresh svc:/application/database/ndb-ndbmtd_74:default
root@data1:~# svcadm enable svc:/application/database/ndb-ndbmtd_74:default
root@data1:~# ls -l /var/mysql/7.4/data/
total 4
-rw-r--r-- 1 mysql mysql 5 2015-05-07 08:08 ndb_4.pid
-rw-r--r-- 1 mysql mysql 2227 2015-05-07 08:08 ndb_4_out.log
root@data1:~#
data2の設定
global-zone ~ # zlogin data2
root@data2:~# cp /etc/mysql/7.4/ndb-ndbmtd_74.my.cnf.ndb /etc/mysql/my.cnf
root@data2:~# svcprop svc:/application/database/ndb-ndbmtd_74:default | grep pid
ndb-ndbmtd_74/pid astring /var/mysql/7.4/data/ndb_5.pid
root@data2:~# svcadm enable svc:/application/database/ndb-ndbmtd_74:default
root@data2:~# svcs -xv
root@data2:~# ls -l /var/mysql/7.4/data/
total 4
-rw-r--r-- 1 mysql mysql 5 2015-05-07 08:10 ndb_5.pid
-rw-r--r-- 1 mysql mysql 2227 2015-05-07 08:10 ndb_5_out.log
root@data2:~#
sql1の設定
global-zone ~ # zlogin sql1
[Connected to zone 'sql1' pts/3]
Oracle Corporation SunOS 5.11 11.1 September 2012
root@sql1:~# cp /etc/mysql/7.4/ndb-sql_74.my.cnf.sql /etc/mysql/my.cnf
root@sql1:~# svcadm enable svc:/application/database/ndb-sql_74:default
...ちょっと時間がかかります svcs -xvでエラーがでなければOKです
root@sql1:~# svcs -xv
root@sql1:~#
root@sql1:~# ls -l /var/mysql/7.4/data/
total 110641
-rw-rw---- 1 mysql mysql 56 2015-05-07 08:13 auto.cnf
-rw-rw---- 1 mysql mysql 50331648 2015-05-07 08:13 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 2015-05-07 08:12 ib_logfile1
-rw-rw---- 1 mysql mysql 12582912 2015-05-07 08:13 ibdata1
drwx------ 2 mysql mysql 81 2015-05-07 08:12 mysql
drwx------ 2 mysql mysql 63 2015-05-07 08:12 ndbinfo
drwx------ 2 mysql mysql 55 2015-05-07 08:12 performance_schema
-rw-r----- 1 mysql mysql 3536 2015-05-07 08:14 sql1.err
-rw-rw---- 1 mysql mysql 3 2015-05-07 08:13 sql1.pid
drwx------ 2 mysql mysql 2 2015-05-07 08:12 test
root@sql1:~#
sql2の設定
global-zone ~ # zlogin sql2
[Connected to zone 'sql2' pts/3]
Oracle Corporation SunOS 5.11 11.1 September 2012
root@sql2:~# cp /etc/mysql/7.4/ndb-sql_74.my.cnf.sql /etc/mysql/my.cnf
root@sql2:~# svcadm enable svc:/application/database/ndb-sql_74:default
root@sql2:~# ls -l /var/mysql/7.4/data/
total 110641
-rw-rw---- 1 mysql mysql 56 2015-05-07 08:16 auto.cnf
-rw-rw---- 1 mysql mysql 50331648 2015-05-07 08:16 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 2015-05-07 08:15 ib_logfile1
-rw-rw---- 1 mysql mysql 12582912 2015-05-07 08:16 ibdata1
drwx------ 2 mysql mysql 81 2015-05-07 08:15 mysql
drwx------ 2 mysql mysql 63 2015-05-07 08:15 ndbinfo
drwx------ 2 mysql mysql 55 2015-05-07 08:15 performance_schema
-rw-r----- 1 mysql mysql 3575 2015-05-07 08:16 sql2.err
-rw-rw---- 1 mysql mysql 4 2015-05-07 08:16 sql2.pid
drwx------ 2 mysql mysql 2 2015-05-07 08:15 test
root@sql2:~#
SQLノードでクラスタ利用可能か確認
sql1、sql2のどちらのSQLノードでもいいのでzloginし、mysqlコマンドで利用可能なストレージエンジンを確認してみる。
sol11-1dev ~ # zlogin sql1
[Connected to zone 'sql1' pts/5]
Oracle Corporation SunOS 5.11 11.1 September 2012
root@sql1:~# mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.24-ndb-7.4.6 MySQL Community Server (GPL)
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ndbcluster | YES | Clustered, fault-tolerant tables | YES | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| ndbinfo | YES | MySQL Cluster system information storage engine | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
11 rows in set (0.00 sec)
mysql>
「ndbcluster」ストレージエンジンが「YES」なら利用可能、この時点で感動していいレベル
クラスターを起動させる
まだデータノードは「not started」、SQLノードも「not connected」です。
これを起動するには「ALL START」コマンドで起動する、データノードのサービス開始をマネージメントノードから実行するように、データノードのmy.cnfに書いてあるので、データノードのサービススタートと同時にデーターノードが走り出さないような設定にしてあります。
ndb_mgm> ALL START
Node 4: Started (version 7.4.6)
Node 5: Started (version 7.4.6)
ndb_mgm>
ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=4 @192.168.254.83 (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0, *)
id=5 @192.168.254.84 (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.254.80 (mysql-5.6.24 ndb-7.4.6)
[mysqld(API)] 2 node(s)
id=2 @192.168.254.81 (mysql-5.6.24 ndb-7.4.6)
id=3 @192.168.254.82 (mysql-5.6.24 ndb-7.4.6)
ndb_mgm>
データノードへ*マークついて無事起動確認、データノード2台で1グループの設定で動作を確認できます(nodegroup 0)、SQLノードも接続できてます。
使ってみる
まずは簡単なことから始める、sql1ゾーンでクラスタ用テーブルをつくってみる、テーブルを作るときに「NDB」を指定して作成する。
root@sql1:~# mysql -u root
...
...
mysql> CREATE DATABASE IICHIKODB;
Query OK, 1 row affected (0.06 sec)
mysql> use IICHIKODB
Database changed
mysql> create table cava_club_user(id BIGINT PRIMARY KEY, name VARCHAR(256)) ENGINE NDB;
Query OK, 0 rows affected (0.42 sec)
mysql> INSERT INTO cava_club_user(id, name) VALUES('1', 'Kazuto');
Query OK, 1 row affected (0.01 sec)
mysql>
sql2ゾーンで先ほど入れたデータを確認してみる
root@sql2:~# mysql -u root
...
...
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| IICHIKODB |
| mysql |
| ndbinfo |
| performance_schema |
| test |
+--------------------+
6 rows in set (0.00 sec)
mysql>
mysql> use IICHIKODB
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> SELECT * FROM cava_club_user;
+----+--------+
| id | name |
+----+--------+
| 1 | Kazuto |
+----+--------+
1 row in set (0.00 sec)
mysql>
すばらしい、細かいことは抜きにしてとりあえずデータのクラスタ化が確認できる。
こういったシステムは運用がしっかりしていないと大変な感じがしましたね、でもその辺がノウハウであるとも思いますが、PHP書きながら片手間で触るようなシステムではないようです(笑)...