2015年5月8日金曜日

Solaris11でMySQL Cluster 7.4.6をやってみた

最近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書きながら片手間で触るようなシステムではないようです(笑)...


0 件のコメント:

コメントを投稿