2012年10月22日月曜日

mongoのレプリカセットをperlとnginx-gridfsから使う


このエントリーをはてなブックマークに追加


レプリカセットを作る記事はあるけど、利用する記事って意外にないねーってことで書く。


構成


mongod2つと、arbiter1つでレプリカセットを組む。gridfsも同居。
今回は全部localhostでテスト。

gridfsはnginx-gridfsを使用してフロントのサーバーからアクセス。
perlはMongoDBを使用。


レプリカセットを組む


まずデーモンを3つ立ち上げる。
configはこんな感じで。portとdbpathはそれぞれのデーモンで別のに設定に。
dbpathのディレクトリは勝手に作ってはくれないみたい。
(arbiterにjournalは要らない)



dbpath = /usr/local/mongodb/rs1/db1/
journal = true
bind_ip = 127.0.0.1
port = 27017
replSet = rs1



mongoシェルでレプリカセットの設定。
以下はjsで設定ファイルを作っておいて、流し込む方法。(設定しなおす場合はrs.reconfig())



// replica_set_config.js
db = db.getSisterDB("admin");
rs.initiate({
_id: 'rs1', // replSetのセット名。nginx-gridfsでも使う。
members: [
{_id: 0, host: 'localhost:27017'},
{_id: 1, host: 'localhost:27018'},
{_id: 2, host: 'localhost:27019',arbiterOnly : true}
]
});



3つとも起動しておいて、



/usr/local/mongodb/bin/mongo localhost:27017/project < replica_set_config.js



で完了。


perlからレプリカセットにアクセス


複数指定するとMongoDBが勝手に探してくれる。
どのmongodにも、どのmongodがマスターなのかという情報があるので、最大2回でマスターに接続できる仕組み。



use MongoDB;
my $db = MongoDB::Connection->new(host => 'mongodb://localhost:27017,localhost:27018', find_master => 1);



nginxからgridfs(のレプリカセット)にアクセス



location /gridfs/ {
gridfs tracenote field=filename type=string;
mongo "rs1" localhost:27017 localhost:27018;
}



で、うまくいかない。
ipアドレスなら上手くいくが、hostnameだとダメ。
これは運用上よろしくない。

issuesにあった。
mongo-c-driverが対応してないらしい。(追記あり。本家mongo-c-driverで大丈夫でした)
@kiwanami さんのパッチが本家に反映されてない気がする(上手くいかなかった)ので、
kiwanamiさんのブランチをclone.



git clone git://github.com/kiwanami/nginx-gridfs.git && \
cd nginx-gridfs && \
git submodule init && \
git submodule update
cd mongo-c-driver && \
git checkout master


nginxをmake



./configure --prefix=/usr/local/nginx/ --add-module=/path/to/nginx-gridfs --with-cc-opt=-Wno-error
make && make install



追記


nginx-gridfsが最新のmongo-c-driverに対応してないので、修正が必要。
nginx-gridfsのsubmoduleに指定しているmong-c-driverは古いので、git checkout masterして最新にする。
これで、kiwanamiさんのパッチが取り込まれてる状態になる。

次にnginx-gridfsのconfigがsrc以下全部を対象にしていて、windows用のをコンパイルしようとするので、
issues に書いてあるように
mongo-c-driver を単体でmake して、
nginx-gridfs/configを編集する。



ngx_addon_name=ngx_http_gridfs_module
HTTP_MODULES="$HTTP_MODULES ngx_http_gridfs_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_gridfs_module.c"
NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ngx_addon_dir/mongo-c-driver/src/*.h"
CFLAGS="$CFLAGS --std=c99 -I src -I /usr/local/include -L /usr/local/lib -lmongoc"


libmongoc.aと、libmongoc.soは -L で指定した/usr/local/libに置いておく。
(/sbin/ldconfig忘れない. redhat系なら/usr/local/libを /etc/ld.so.confに追加)
これで、ngninxをconfigureすると、libmongoc.so.0.6が見つからないと言われたのでリネーム。
正常に動作した。





0 件のコメント:

コメントを投稿