Nifty Cloud環境でMySQL5.5 + Spider2.22をインストールする
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
MySQL5.5 + Spider 2.22をNifty Cloud環境にインストールしたレポートです。
使用環境はインストールテストということで、miniタイプを選択。miniタイプの構成要素は以下の通り。
- CPU: 1vCPU(1GHz相当)
メモリ: 512M
ディスク: 30GB
ちょっとテストしたいときに手軽なサーバー種別です。
OSは以下のものから選択できます。
- CentOS 5.3 (32bit/64bit)
Red Had Enterprise Linux 5.3
Microsoft Windows Server 2008 R2
ここではCentOS ?64bit plainタイプを選択。
Spiderは、今回はソースコードからビルドしましたが、バイナリモジュールも提供されています。ダウンロードサイトはこちら。
Spiderエンジンを含んだMySQLソースコードmysql-5.5.8-spider-2.24-vp-0.13-hs-1.0.tgzをダウンロードして使用します。
Nifty Cloud環境でのCentOSは基本的なアプリケーションはインストール済み。とはいっても、MySQLにビルドなものが完備されているわけでないので、まずは、CentOS 5.3のepelレポジトリを追加。
# rpm -ivh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
MySQLのコンパイルに必要なツールやライブラリをインストール。
# yum -y install gcc gcc-c++ ncurses-devel?cmake
ダウンロードしてきたMySQL+Spiderを解凍。
# tar zvfx ./mysql-5.5.8-spider-2.24-vp-0.13-hs-1.0.tgz
mysql-5.5.8-spider-2.24-vp-0.13-hs-1.0ディレクトリにソースコードが展開されるので、該当ディレクトリに移動して、普通にmakeを実行します。
# cd ./mysql-5.5.8-spider-2.24-vp-0.13-hs-1.0
# cmake .
# make
# make install
MySQLの初期設定を実施します。
# adduser mysql
# chown -R mysql:mysql /usr/local/mysql
# cd /usr/local/mysql
# /usr/local/mysql/scripts/mysql_install_db --user=mysql
# chown -R root /usr/local/mysql
# chown -R mysql /usr/local/mysql/data
# cp /usr/local/mysql/support-files/my-medium.cnf /usr/local/mysql/data/my.cnf
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql.server
ここではmy.cnfにmediumモデルを使用し、 該当ファイルをデータベースファイルディレクトリに置きました。
/etc/init.d/mysql.serverの内容を確認して必要な箇所を修正します。最低でもbasedirとdataを設定すれば動きます。
/etc/init.d/mysql.serverの動作確認が終了したら実行可能ファイルに変更。
# chmod 755 /etc/init.d/mysql.server
必須ではないですが、今後の作業軽減のために、OS起動時に自動起動するようにmysqlをサービスを登録。
# chkconfig --add mysql.server
# chkconfig --list mysql.server
MySQLの実行PATHも.bashrcに追加しておきます。
export PATH=/usr/local/mysql/bin:$PATH
MySQLの管理ユーザを設定をします。
# /etc/init.d/mysql.server start
# /usr/local/mysql/bin/mysqladmin -u root password 'root'
そのままrootユーザーを使ってテストしてもいいのですが、MySQL用テストユーザ、spiderを作成しました。
mysql> grant all privileges on *.* to spider@localhost identified by 'spider';
mysql> grant all privileges on *.* to spider@'%' identified by 'spider';
mysql> flush privileges;
テストに使用するデータベースを作成しました。
mysql> create database spider_test;
mysql> grant all privileges on *.* to spider@localhost identified by 'spider';
mysql> grant all privileges on *.* to spider@'%' identified by 'spider';
mysql> flush privileges;
mysql> create database spider_test;
サーバーのMySQL用ポートを開けておくために/etc/sysconfig/iptablesファイルを変更します。
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
の前に以下の行を追加。
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 3306 -j ACCEPT
iptablesの修正を有効します。
# /etc/init.d/iptables restart
MySQLインストールはこれで終了です。
では、spiderの動作確認してみます。
ここではspiderノード x 1、dataノード x 2の構成を試してみます。
Nifty Cloud Control Panelから、インストール作業したサーバーを一旦停止。
該当サーバーを「サーバーコピー」機能をつかって、dataノードを作成します。miniタイプでもサーバー作成に30分弱程かかります。
spiderノードをspider01、dataノードをdata01、data02とします。
【spiderノード】
spiderのプラグインをインストールします。sqlスクリプトが提供されているので、以下のコマンドを実行するだけで終了です。
# mysql -u root -p < ./mysql-5.5.8-spider-2.24-vp-0.13-hs-1.0/scripts/install_spider.sql
spiderのドキュメント、08_sharding.txtを参考にして、my.cnfの[mysqld]セクションに以下の行を追加。
spider_internal_xa=1
spider_semi_trx_isolation=2
my.cnfを変更したのでMySQLを再起動しておきます。
# /etc/init.d/mysql.server restart
spiderでパーティショニングするサーバーを作っておきます。
mysql> create server n1 foreign data wrapper mysql options(user 'spider', password 'spider', host '10.100.xx.xx', port 3306);
mysql> create server n2 foreign data wrapper mysql options(user 'spider', password 'spider', host '10.100.xx.xxx', port 3306);
spiderノードでテスト用tableを作成します。
# echo < mysql -u spider -pspider -h spider01
> drop table if exists tbl_a;
> create table tbl_a (
> col_a int not null,
> col_b varchar(20),
> col_c int not null,
> primary key(col_a) )
> engine=spider connection='wrapper "mysql", user "spider", password "spider", database "spider_test", table "tbl_a", port "3306"'
> partition by key(col_a)
> (partition p1 comment='server "n1"',
> partition p2 comment='server "n2"');
> EOF
【dataノード】
同様にdataノード(data01とdata02 )でテスト用tableを作成します。
# echo < mysql -u spider -pspider -h data01
> drop table if exists tbl_a;
> create table tbl_a (
> col_a int not null,
> col_b varchar(20),
> col_c int not null,
> primary key(col_a) );
> EOF
#
# echo < mysql -u spider -pspider -h data02
> drop table if exists tbl_a;
> create table tbl_a (
> col_a int not null,
> col_b varchar(20),
> col_c int not null,
> primary key(col_a) );
> EOF
データをINSERTしてみます。data01とdata02にレコードがINSERTされるはず。
mysql> xa start
mysql> insert into tabl_a(1,"aaa",1);
mysql> insert into tabl_a(2,"aaa",2);
mysql> insert into tabl_a(3,"aaa",3);
mysql> insert into tabl_a(4,"aaa",4);
mysql> xa end
mysql> xa prepare
mysql> xa commit
spiderノードから見るとtbl_aに4行追加されています。
# echo "select * from tbl_a" | mysql -u spider -pspider -h spider01 spider_test
col_a col_b col_c
1 aaa 1
3 aaa 3
2 aaa 2
4 aaa 4
データノードから見るとテーブルには2行づつ追加されていて、レコードが分散されています。
# echo "select * from tbl_a" | mysql -u spider -pspider -h data01 spider_test
col_a col_b col_c
1 aaa 1
3 aaa 3
#
# echo "select * from tbl_a" | mysql -u spider -pspider -h data02 spider_test
col_a col_b col_c
2 aaa 2
4 aaa 4
ここで、実験心でdata01でdrop tbl_aを実行してみました。spiderノードからselect * from tbl_aを実行すると、data01にtbl_aがないので、怒られます。
ERROR 1146 (42S02) at line 1: Table 'spider_test.tbl_a' doesn't exist
もう一度data01のtbl_aを作成してみます。
# echo < mysql -u spider -pspider -h data01
> drop table if exists tbl_a;
> create table tbl_a (
> col_a int not null,
> col_b varchar(20),
> col_c int not null,
> primary key(col_a) );
> EOF
#
# echo "select * from tbl_a" | mysql -u spider -pspider -h spider01 spider_test
col_a col_b col_c
4 aaa 2
2 aaa 4
data01のレコードはdrop tableで消滅してますが、data02のレコードがspiderノードから参照可となりました。
spiderはレコード分散管理は実施してくれますが、実データを持っている訳ではないなので、drop table tbl_aをspider01を実施してもデータノードのテーブルにはデータが残っています。つまり、dataノードを追加したり、削除したりは気軽に行えます。デーこれはクラウド環境と親和性が高いと思います。
さて、テストデータを本格的にロードしてみようと思ったら・・・、つまづきました。
mysql> insert into tbl_a values (x,x,x)
mysql> commit;
動かない。以下のエラーがでます。
(ERROR 12605 (HY000): This xid is already exist)
spiderの管理テーブルらしき、mysql.spider_xaやmysql.spider_xa_memberを参照するとPREPAREDステータスのXAトランザクションがスタックしています。
spider作者の斯波さんにメールして聞いてみました。MySQLのXAトランザクション管理に問題があってspider側でも苦慮しているらしいです。
斯波さんのご指摘に従って、spiderノードのmy.cnfに
spider_suppper_xa = 0
を追加して再トライです。デフォルトでは上記のパラメータは1のようです。
mysql> insert into tbl_a values (x,x,x)
mysql> commit;
できた! 無事INSERT処理が実行されました。
つまり、XAトランザクションを使用しないときは明示的に
spider_suppoer_xa = 0
を設定しておかないとダメみたいです。
spider自身はインストールも設定も難しくはありません。dataノードを気軽に多重化する手段として有効に活用できると思います。ただ 扱うデータ量が少ないときに、spiderノード自身がボトルネックになるようなので、上記の構成より、以下の構成にしたようがいいというアドバイスも斯波さんにいただきました。(斯波さん、ありがとうございます。)
確認してみると、確かにspiderノードを多重化したほうが性能がでます。spiderノードを追加するのに、新規マシンを手配したりするのは大変ですが、仮想環境やクラウド環境では、マシンを増加するのも簡単ですね。