STAFF BLOG タグ: Rails3.1 — Comments (0)
普通にやったら動かなかったのでハマりました。
結論はGemfileに以下4行追加でOK
group :production do
gem ‘therubyracer-heroku’, ’0.8.1.pre3′
gem ‘pg’
end
have fun
押忍、おおたです。
大量のデータの生成や取り込みで、別プロセスに処理を任せたい時、結構ありませんか?_?
DelayedjobやBackgrounDRbを使うのが常套手段ではありますが、
リッチすぎて使いたく無い病になってしまったので
「rubyのnativeな感じでforkしてみました。(長嶋風)」
class HogeCsvController < ApplocationController
.
.
.
#POST /create
#CSVファイルをいっぱいつくる
def create
#このdoブロックの中にプロセスをforkする処理を書きます。
fork do
exec "RAILS_ENV=#{Rails.env} #{Rails.root}/script/rails runner 'HogeCsv.generatel' > /dev/null"
end
end
end
たったこれだけで、別プロセスにて「CSVをいっぱいつくる処理」が起動します。
素直にDelayedJobつかえばいいやんって突っ込みは一先ず置いておいてw
個人的にはこのくらいがミニマルな感じが楽でいいなーと思ってます。
*どうにも/dev/nullにredirectしないとゾンビが大量生産されてしまうようです。もっとsmartな方法は無いものか。。
けど、これならナチュラルにphpとかCで書いたプログラムも呼べるし、
Workerとかいちいち作らなくていいし、結構いけてるんじゃないかなー。
そんな感じで、ぼつぼつ技術的なことも書いていこうとおもいました。
押忍
おはようございます。ローハイドのリゲインことおおたです。
このブログに書くのは4年ぶりぐらいです。
今宵もrawhide.は絶賛営業中です
師走っていそがしいですよね!!!!!
無駄にテンションがあがってこまってます。はい。
そんなかんじで。。
mysqlclusterの導入手順 PART2
FAQ編 2
Q.わーいわーい、ndbクラスタが動いたよ!!!
でも・・・server1のmysqlで
create database hoge;を実行して
hogeスキーマを作ったんだ。
で、
hogesテーブルをNDB型でつくったんだけど、
server2から見るにはどうしたらいいんだろう?
そもそもserver2にhogeスキーマがないしさぁ。
A.ここはmysqlクラスタの力の見せ所だね。どれ・・・
カタッカタッ
(server2のmysqlを起動した音)
カタカタカタッ
(server2でcreate database hoge;を実行した音)
>show tables;
+—————-+
| Tables_in_hoge |
+—————-+
| hoges |
+—————-+
Q.すっげー!!!hogesテーブルが勝手に出来たよ!!
A.クラスタリングではもともと同じデータストアを利用するわけ
だから、当然スキーマがあればテーブルは既に存在してるわけさ。
Q.じゃあさ、mysql clientをserver1で立ち上げて
insert into hoges values(“こんにちわー”);
ってやってね、server2でselectすれば当然
+—-+——————–+
| id | name |
+—-+——————–+
| 1 | こんにちわー |
+—-+——————–+
ってでるんだよね。
これならinsertとselectでチャットが出来るね!!!!!
mysqlマニア感激のチャットクライアントさ!
A.・・・・
o.t.a
mysqlclusterの導入手順 PART3
便利な設定へん
ndb_mgmdを起動するときに
ndb_mgmd –config-file=/hoge/hoge/config.ini &
みたいにいちいち書くのはだるい!
そんなときはmy.cnfに書いちゃおう!
my.cnfに以下の項目を追加
[ndb_mgmd]
config-file=/var/lib/ndb/config.ini
(configファイルのフルパス)
これでndb_mgmd &だけでconfigを
自動的にロードして動きます。
サーバ2からndbd(データノード)を接続するときに
ndbd –ndb-connctstring=server1
みたいに書くのもだるいんだけど・・・
[ndbd]
connect-string=server1
(ndb_mgmdが動いてるサーバのホスト名)
これでserver2からndbdって打つだけで
起動します。
おまけ
[ndb_mgm]
connect-string=server1
(ndb_mgmdが動いてるサーバのホスト名)
これを設定しておけば、ndb_mgmdが動いてる
サーバ以外からもndb_mgm(管理コンソール)
が実行できるよ。
(そんなのやらないよね・・・)
!!起動手順はこんなかんじ!!
想定構成
server1= ndb_mgmd、ndbd、mysqldが動いている場合
***server1で実行***
# ndb_mgmd
# ndbd
# mysqld_safe &
***server2で実行***
# ndbd
# mysqld_safe &
これだけで動きます。
o.t.a
mysqlclusterの導入手順 PART2
FAQ編 1
Q.mysqld(APIノード)が立ち上がらないんだけど・・・?
A.ここはハマリどころなんだ!なぜかというと・・
ndb_mgmd(マネージメントノード)は、色んなところから
見られる目立ちたがり屋さんなんだ。
Q.それだけじゃわからないよ・・・
A.目立ちたがり屋さんだから、/etc/hostsをいじって
サーバ名とIPアドレスを対応付けなきゃダメなんだ。
Q.ふーん
A.つまりね・・127.0.0.1みたいなlocalipアドレスが
ndb_mgmdのホスト名に対応付けられてると動かないんだよ。
Q.うーん、ピンとこないなあ
A.ローカルアドレスでndb_mgmdが起動しても、他の
サーバから見たら当然見えないよね。
だから、他のサーバは当然どこにつないでいいか
わからなくなる。
Q.ndb_mgmdくんって、人に見られてないと仕事を
出来ないかわいそうな人だなあ・・・
A.そう。悲しい人なんだ。だから他人からわかる
アドレスとhost名を設定して、connectstringに
設定して繋いであげてね。
そうするとバリバリ働くよ!
Q.わかったよ、ありがとう!
(でもそれってハマリどころというか、設定
ミスっただけじゃん・・・)
A.それは言わないお約束です。
o.t.a
※.便宜上、クラスタリングに使用する2台のサーバを
「test1、test2」と記載しています。
これらのサーバ内で、既にmysql5.1系のインストールが
行われていることを前提とします。
1. データを入れておくディレクトリを作成します。(ここでは適当な場所につくってみます。)
***test1サーバ上にて***
shell# mkdir /home/hoge/ndb_mgmd-file
shell# mkdir /home/hoge/cluster-file
***test2サーバ上にて***
shell# mkdir /home/hoge2/cluster-file
2.mysqlルートに移動(test1,test2)
shell# cd /usr/local/mysql
3. my.cnfを設定します(test1,test2)
shell# cp support-files/my-large.cng /etc/my.cnf
shell# vi /etc/my.cnf
[mysqld]
ndbcluster
ndb-connectstring=hoge1
4. config.iniを設定します(test1)
shell# cp /support-files/ndb-config2-node.ini /support-files/config.ini
shell# vi /support-files/config.ini
[ndbd default]※変更箇所
NoOfReplicas= 2 → NoOfReplicas= 1
→レプリカ数です。1にすると冗長性を失いますが、
複数のサーバを1つのDBとして使えます。
DataDir → コメントアウト
→特に必要ないので・・
[ndb_mgmd_default]
DataDir → コメントアウト
HostName= hoge1
→マネージメントノードを起動するサーバのhost名
[ndb_mgmd]
id=1
DataDir= /home/hoge/ndb_mgmd-file
→マネージメントノードファイル置き場
HostName= hoge1
→マネージメントノードを動かすサーバのホスト名
[ndbd]
id=2
DataDir= /home/hoge/cluster-file
→データの置き場所のパス
HostName= hoge1
→データノードを動かすサーバのホスト名
[ndbd]※データノードの数分だけ[ndbd]を書きます。
id=3
DataDir= /home/hoge2/cluster-file
HostName= hoge2
[mysqld]※sqlノードの設定。デフォルトのままでOKです。
こいつもノードの数だけ書きます。
5. host名とIPアドレスを対応付けます。(test1,test2)
shell# vi /etc/hosts
192.168.0.x test1
192.168.0.y test2
6. マネージメントサーバ[ndb_mgmd]を起動します(test1)
shell# ./bin/ndb_mgmd –daemon –config-file ./support-files/config.ini
※引数でconfig.iniを指定しています。
7. 環境に応じてファイアウォールのポートを空けます。(test1,test2)
1)マネージメントノードを動かすサーバのポートを空けます。(1186.※test1のみ)
2)クラスタリングで使用するtcpのポートを空けます。(defaultだと63132、test1とtest2で設定)
→config.iniの[tcp_default]で変更可能
3)mysqlノードのポートを空けます。(defaultだと3306、test1とtest2で設定)
8.ndbdを起動します(test1,test2)
***test1で実行***
shell# ./bin/ndbd –initial(初回のみ–initialをつけます。)
***test2で実行***
shell# ./bin/ndbd –ndb-connectstring=test1 –initial
9.mysqldをSQLノードとして起動します(test1, test2)
shell# ./bin/mysqld_safe &
(my.cnfの設定が行われていれば
自動的にsqlノードとして認識されます。)
10.ndb_mgmを起動して状態を確認します(test1)
shell# ./bin/ndb_mgm
ndb_mgm> show
※クラスタリングの停止はshutdownコマンドで。すべてのノードが停止します。
成功例)
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
———————
[ndbd(NDB)] 2 node(s)
id=2 @192.168.0.x (Version: 5.1.17, Nodegroup: 0, Master)
id=3 @192.168.0.x (Version: 5.1.16, Nodegroup: 1)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.0.x (Version: 5.1.17)
[mysqld(API)] 4 node(s)
id=4 @192.168.0.x (Version: 5.1.17)
id=5 (not connected, accepting connect from any host)
id=6 (not connected, accepting connect from any host)
id=7 (not connected, accepting connect from any host)
このように、5.1系であればバージョンが異なっても
動作自体はします。
(実運用上はバグフィックス等々ある為
バージョンをあわせたほうが良さそう)
11.早速クラスタリングしてみましょう!!
shell# ./bin/mysql -uxx -p
mysql> CREATE DATABASE hoge_development default char set=utf8
mysql> CREATE TABLE hoges (
id INT(10) NOT NULL AUTO_INCREMENT
, name VARCHAR(255)
, PRIMARY KEY (id)
)ENGINE=NDB;
※クラスタリングを行っているとcreate table,
create database等のddlは遅くなります。
mysql> show table status where Name = “hoges” and Engine=”NDBCLUSTER”;
※レコードが取得されればNDBClusterの設定は完了です。
それでは良いクラスタリングライフを。
o.t.a


