MongoDB勉強会
○MongoDBとMySQLの同時接続時のパフォーマンスを評価しました。
MongoDB速度評価(PDF形式)
○社内向けにMongoDB勉強会をしました。
社内向けにMongoDB勉強会をしました。
社内フレームワークDeco上での実装について。
Ruby1.9 の rpm インストールと、Rails 3のインストール
Posted by 岩本@サーバー事業部 in Ruby on 2010年12月2日
こんにちは。最近なにかと、コキ使われてるのでネタには困りません。
岩本@サーバー事業部です。
きょうは、ソリューションぶのY内氏(後輩)から、
「ちょっと~、Rails 3 いつになったらインストールできるんですかぁ」
「いいかげん、はやくしてくださいよぉ~」といびられたので、
Ruby 1.9 のRPM化とRails 3.0 のインストール
Rubyはソースで入れちゃっても良かったんですが、後の管理が大変なので
パッケージ化してみました。
なので、まずはRubyのRPM化
RPM化には事前に[checkinstall]と[rpm-build]が必要です。
# yum install checkinstall rpm-build
※1 YUMにDAGのリポジトリを追加する必要があるので、お忘れなく
※2 zlibがないとgem で怒られることがあるらしいので、[zlib-devel]と[zlib]もついでにいれときましょう。
で、RubyのRPM化
# cd /usr/local/src
# wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p0.tar.gz
ダウンロードしてきて# tar zxvf ruby-1.9.2-p0.tar.gz
解凍して# cd ruby-1.9.2-p0
# ./configure –prefix=/usr
configure / make して# make checkinstall –fstrans=no
で、パッケージ化# rpm -ivh /usr/src/redhat/RPMS/i386/ruby-1.9.2-p0-1.i386.rpm
RPMでインストール
・・・・・あ、サクッと入った。とりあえず、バージョンの確認
# ruby -v
ruby 1.9.2p0 (2010-08-18 revision 29036) [i686-linux]# gem -v
1.3.7
おお、gemまでちゃんと動いてる。
とゆうわけで、Rails3のインストール
# gem install rails –version=3.0.3
# rails -v
Rails 3.0.3
完了。
ああ、意外とサクッとできました。
以前にRuby1.8 でRPM化したときは半泣きなったのに。
便利な世の中になったもんですわ。
Mongodb のバックアップスクリプト
Posted by 岩本@サーバー事業部 in MongoDB, サーバー on 2010年11月29日
先日から社内がMongoDB一色です。どうもこんにちは、岩本@サーバー事業部です。
とゆうわけで、MongoDBのバックアップスクリプト書きました。
弊社はサーバー監視にNagiosを使っているので、通知部分にはNagios絡みのコマンドを書いてますが
適当に変更してお使いください。
#!/bin/bash
OUTPUT=”/backup”
MONGOBIN=”/usr/local/mongodb/bin”
MONGOUSER=”ユーザー”
MONGOPASS=”パスワード”
PHASE=”DB Dump”
FILEDATE=`date +”%Y-%m-%d” –date “1 day ago”`
HOSTNAME=`hostname | cut -d “.” -f 1`$MONGOBIN/mongodump -u $MONGOUSER -password=$MONGOPASS -o $OUTPUT/mongo_dump
STATUS=$?
if [ “$STATUS” = “0” ] ; thenPHASE=”Archive to Dump”
cd $OUTPUT
/bin/tar czvf $OUTPUT/mongodb_$FILEDATE.dump.tar.gz ./mongo_dump
STATUS=$?
rm -rf $OUTPUT/mongo_dumpif [ “$STATUS” = “0” ] ; then
PHASE=”Backup is OK”
# 成功時の通知
/root/bin/check_result_via_nsca.sh $HOSTNAME MONGODB_BACKUP 0 “$PHASE”
fielse
# 失敗時の通知
/root/bin/check_result_via_nsca.sh $HOSTNAME MONGODB_BACKUP 2 “$PHASE”
fi
変なところがあれば、随時突っ込みください。
CentOS5.5 に MongoDBのインストール
Posted by 岩本@サーバー事業部 in MongoDB, サーバー on 2010年11月25日
今年もあと1ヶ月と少しになりました。年をとる毎に1年てほんと早いよねぇーと、すっかり社内でももちきりです。
どうもこんにちは、岩本@サーバー事業部です。
ソリューションぶのo2先輩より、とある案件で使うためサーバーに
「MongoDBをインストールしろ」とのご命令を受けましたので、その時のログです。
MongoDBはコンパイルが必要なく、
# cd /usr/local/src
# wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.6.4.tgz
# tar zxvf mongodb-linux-i686-1.6.4.tgz
# mv mongodb-linux-i686-1.6.4 mongodb
# mv mongodb /usr/local
# /usr/local/mongodb/bin/mongod
以上!
って言ったら怒られたので、ここから起動スクリプトの作成。
http://ringio-blog.appspot.com/2010/10/mongodb-startup-script
こちらのサイトを参考にさせていただきました。
lockファイルがあると、うまく起動しない時があるらしく、lockファイルを消す処理を入れました。
# vi /etc/init.d/mongod
#!/bin/sh
#
# chkconfig: – 85 15
# description: MongoDB daemon
# #
# pidfile: /var/run/mongod.pid
# config: /etc/.conf# Source function library.
. /etc/rc.d/init.d/functions# parameter
mongoHome=/usr/local/mongodb
mongod=${mongoHome}/bin/mongod
mongodbpath=/var/mongodb
logfile=/var/log/mongod.log
pidfile=/var/run/mongod.pid
mongoconf=/etc/mongodb.confRETVAL=0
start() {
KIND=”MongoDB”if test -e ${pidfile} ; then
echo “already running”else
if test -e ${mongodbpath}/mongod.lock ; then
rm -f ${mongodbpath}/mongod.lock
fiecho -n $”Starting $KIND services: ”
${mongod} –pidfilepath=${pidfile} –dbpath=${mongodbpath} –logappend –logpath=${logfile} –config=${mongoconf} –fork
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch ${mongodbpath}/mongod.lock || RETVAL=1
return $RETVAL
fi
}stop() {
echo
KIND=”MongoDB”
echo -n $”Shutting down $KIND services: ”
killproc $mongod
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f ${mongodbpath}/mongod.lock ${pidfile}
echo “”
return $RETVAL
}restart() {
stop
start
}status() {
KIND=”MongoDB”if test -e ${pidfile} ; then
echo “mongod is running”
echo “if mongod could not run, please remove pidfile”
else
echo “mongod is not running”
fi
}case “$1″ in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
*)
echo $”Usage: $0 {start|stop|status|restart}”
exit 2
esacexit $?
さらに、認証の設定
# vi /etc/mongodb.conf
noauth = false
auth = true
DBユーザーの作成
# mongo
> use admin
> db.addUser(“username”, “password”)
ユーザー認証の確認
# mongo
> db.auth(“username”, “password”)
以上。これで、o2氏にもご納得いただけたかと。
変なところがあれば、ご指摘頂けると幸いです。
ぐるなび位置情報をMongoDBに保存
久しぶりに会社のブログを書きます。
1年ぶりになるでしょうか。。
最近はMongoDBに興味があって触っています。
MongoDBの紹介兼ねてインストールと、簡単なプログラムを書きました。
MongoDBはトランザクション、テーブルjoin、auto incrementを使えませんが、高速でスケーラビリティな点が注目されているDBです。
MongoDBはJSON形式でデータを扱い、JavaScriptの記述でデータを操作します。
では早速インストール。
ubuntu 10.10だと以下でインストール出来ます。
// 参考: http://www.mongodb.org/display/DOCS/Ubuntu+and+Debian+packages
$ sudo apt-add-repository 'deb http://downloads.mongodb.org/distros/ubuntu 10.10 10gen'
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
$ sudo aptitude install mongodb-stable
$ mongo --version
MongoDB shell version: 1.6.4
// 自動起動設定
$ runlevel
N 2
$ sudo sysv-rc-conf
早速位置情報からやってみます。
位置情報はMongoDBのv1.3.3から対応しています。
次の操作は、DBに位置情報を登録し、位置情報として扱うようにIndexを貼り、データの取得を実行します。
$ mongo
> db.map.insert( { loc: {lat:35.705969 , lng: 139.74884} } );
> db.map.ensureIndex( { loc : "2d" } )
> db.map.find( { loc : { $near : [35.705969,139.74884] } } ).limit(20)
次に、PHPでぐるなびの位置情報を収集して、MongoDBに格納する処理。
先にPHPにmongodbのライブラリを導入。
$ sudo pecl install mongo
$ sudo vi /etc/php5/conf.d/mongodb.ini
extention=mongo.so
Services_Gnaviのライブラリは http://lab.totoro.ws/gnavi/ のサイトからダウンロードしました。
– gnavi.php
<?php
require('Services/Gnavi.php');
// -- 設定 --
$access_key = 'ぐるなびアクセスキー';
$rows = 999;
$mongo = new Mongo("localhost:27017");
$db = $mongo->selectDB( "MyDB" );
$col = $db->selectCollection( "gnavi" );
// -- 設定 --
$gnavi = new Services_Gnavi($access_key);
$gnavi->searchSubcategory();
$cate = $gnavi->getResult();
$_cate = $cate['category_s'];
foreach(range(1,47) as $num){
$pref = sprintf("PREF%02d",$num);
$opt = array('pref'=> $pref, 'hit_per_page' => $rows,'offset_page' => 1, 'coordinates_mode' => 2);
print $pref . "n";
foreach($_cate as $r){
$opt['category_s'] = $r['category_s_code'];
$res = getGnavi($gnavi,$opt);
print " " . $opt['category_s'];
if ($res['total_hit_count'] == 1) $res['rest'] = array($res['rest']);
save($col,$res['rest']);
}
print "n";
}
print "Endn";
function save($col,$res){
if (!$res) return;
$fmt = 'name,name_kana,address,tel,pr,code,category';
$fmt = split(',',$fmt);
foreach($res as $row){
$doc = array();
foreach($fmt as $key){
$doc[$key] = $row[$key];
}
// 位置情報
$doc['loc'] = array('lat' => (double)$row['latitude'],'lng'=> (double)$row['longitude']);
$col->insert( $doc );
}
}
function getGnavi($gnavi,$opt){
$gnavi->searchRestaurant($opt);
return $gnavi->getResult();
}
以上でぐるなびの情報がMongoDBに格納できました。
次に、実際にPHPから取得します。
位置情報のパラメーターは以下になります。
$near 現在地から近い位置情報を検索
$box 長方形の範囲内の位置情報を検索
$center 中心から半径の距離に含まれる位置情報を検索
– maps.php
<?php
$mongo = new Mongo("localhost:27017");
$db = $mongo->selectDB( "MyDB" );
$col = $db->selectCollection( "gnavi" );
//$query['loc']['$near'] = array(35.705969,139.74884); // 東京
//$query['loc']['$near'] = array(43.068887774169625, 141.3720703125); // 北海道
$query['loc']['$near'] = array(35.47856499535729, 134.241943359375); // 鳥取
$cursor = $col->find($query)->limit(20);
while( $cursor->hasNext() ) {
var_dump( $cursor->getNext() );
}
とても簡単な記述で、位置情報の取得が出来ました。
コードが簡潔に書けると嬉しくなります。
以上です。
○後日談
ぐるなびの小業態は複数選択可能なパラメータだったので店舗情報が重複していた。
MongoDBには重複した情報をINDEX設定時に削除出来るので、以下の作法で解消。
> db.gnavi.count();
122726
> db.gnavi.dropIndexes();
> db.gnavi.ensureIndex( { name: 1 , address: 1 } , { unique: true, dropDups: true } );
> db.gnavi.count();
58448
> db.gnavi.dropIndexes();
> db.gnavi.ensureIndex( { loc: "2d" } );
xargs と exec
Posted by 岩本@サーバー事業部 in サーバー on 2010年9月22日
今日は中秋の名月だとか、どうりで朝から体毛がよく伸びるが図です。こんにちは。岩本@サーバー事業部です。
Linuxサーバーで差分バックアップを行う際、findを使って差分ファイルを抜き出し、
tarで圧縮をするのが一般的かと思います。
1日以内の更新ファイルを見つけて、tarで圧縮
find $BACKUPDIR -mtime -1 -type f | xargs tar czvf /misc/backup/backup_daily.tar.gz
しかし、上記だとファイル名にスペースや文字化けが入っていると、xargsがクォート処理されていないため
うまく動いてくれません。
そこでっ
find $BACKUPDIR -mtime -1 -type f -exec tar czvf /misc/backup/backup_daily.tar.gz “{}” ;
でも、これだと、検索アイテム毎に処理を行うのでリソースを食いますし、
元ファイル毎に圧縮ファイルが上書きされていきます。(tarのオプションで上書きは解消できるはず?)
で、色々と調べていくと、おしりの”{}” ;を”{}” +と変更することで、逐次ではなく、検索結果をまとめて処理してくれるとか。
find $BACKUPDIR -mtime -1 -type f -exec tar czvf /misc/backup/backup_daily.tar.gz “{}” +
とゆうわけで、xargsとexecの覚書です。
CentOSにDAG(rpmforge)のyumリポジトリの追加
Posted by 岩本@サーバー事業部 in サーバー on 2010年9月2日
もうすっかり9月ですね、岩本@サーバー事業部です。
CentOSを新規でインストールする時、標準のyumリポジトリでは足りず、DAGを利用する際、
yumリポジトリの追加方法の覚書です。なぜかいつもよく忘れます。
DAGのサイトより
左側メニュー
ページ中段
[Getting started Please read “Installation and Configuration” from the FAQ to get started quickl.]
にて、各OS毎のリポジトリ追加方法が載っています。
CentOS5はRedHatEL5のリポジトリを使います。
# rpm -Uhv http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
XenServerにてゲストが利用してるLVの確認方法
Posted by 岩本@サーバー事業部 in サーバー, 仮想化 on 2010年8月5日
貯めたネタがあるので、今日は連投します。(風邪薬のせいで若干ハイテンション気味です)
こんにちは、岩本@サーバー事業部です。
XenServerのストレージにローカルストレージ/iSCSIを使用している場合、ゲスト毎にストレージ上にLVが作成されます。
# lvscan
inactive ‘/dev/VG_XenStorage-1900116f-b4b4-fdea-e83b-08b642faab9f/MGT’ [4.00 MB] inherit
ACTIVE ‘/dev/VG_XenStorage-1900116f-b4b4-fdea-e83b-08b642faab9f/VHD-8aeae1da-f7f6-477a-884c-06abeacddc48’ [20.05 GB] inherit
ACTIVE ‘/dev/VG_XenStorage-1900116f-b4b4-fdea-e83b-08b642faab9f/VHD-981729b9-14ce-405c-a743-94dcb77bf93b’ [30.07 GB] inherit
ACTIVE ‘/dev/VG_XenStorage-1900116f-b4b4-fdea-e83b-08b642faab9f/VHD-855febe4-f8b1-4de9-90fa-50391a26583b’ [20.05 GB] inherit
各LVがどのゲストになるかの確認方法です。
XenServerのコンソールより
# xe vbd-list
uuid ( RO) : 328c4578-0a4b-93d8-325b-e9e3f967edac
vm-uuid ( RO): b4685f2a-9ebf-de2e-34b1-76e2c8103638
vm-name-label ( RO): Sanma
vdi-uuid ( RO): 855febe4-f8b1-4de9-90fa-50391a26583b
empty ( RO): false
device ( RO): xvda
uuid ( RO) : 8c9d52ba-1886-2be1-f076-f7562866beb8
vm-uuid ( RO): 0439c4c8-291e-6f81-c33b-8f0cd187ec88
vm-name-label ( RO): CentOS 5.3 (2)
vdi-uuid ( RO): <not in database>
empty ( RO): true
device ( RO): xvdd
uuid ( RO) : ee5bce08-2b16-74fb-9886-247a132755e9
vm-uuid ( RO): c36e9b1f-168d-fca0-5c41-7b43cd15baca
vm-name-label ( RO): work-station
vdi-uuid ( RO): 8aeae1da-f7f6-477a-884c-06abeacddc48
empty ( RO): false
device ( RO): xvda
uuid ( RO) : e65d09c7-ac24-f33d-1467-11367bc1d78d
vm-uuid ( RO): c36e9b1f-168d-fca0-5c41-7b43cd15baca
vm-name-label ( RO): work-station
vdi-uuid ( RO): <not in database>
empty ( RO): true
device ( RO): xvdd
uuid ( RO) : 67eb6f35-1316-6fad-d80b-a60ddf860195
vm-uuid ( RO): b4685f2a-9ebf-de2e-34b1-76e2c8103638
vm-name-label ( RO): Sanma
vdi-uuid ( RO): <not in database>
empty ( RO): true
device ( RO): xvdd
uuid ( RO) : 3ebe3b3e-9778-d153-2c23-20d7f5c15377
vm-uuid ( RO): 0439c4c8-291e-6f81-c33b-8f0cd187ec88
vm-name-label ( RO): CentOS 5.3 (2)
vdi-uuid ( RO): 981729b9-14ce-405c-a743-94dcb77bf93b
empty ( RO): false
device ( RO): xvda
[vdi-uuid]のUUIDがコマンド[LVSCAN] での一覧[‘/dev/VG_XenStorage-xxxxxxxx/VHD-]以下の値となります。
XenServer5.6でのLVMの結合
Posted by 岩本@サーバー事業部 in サーバー, 仮想化 on 2010年8月5日
前回の記事よりすっかりご無沙汰となってしまい、もうすぐ夏休みですね。
こんにちは、岩本@サーバー事業部です。
XenSever5.6になり、LVMの結合のコマンドも若干の変更があったので、その覚書です。
# xe host-call-plugin host-uuid=<host-UUID> plugin=coalesce-leaf fn=leaf-coalesce args:vm_uuid=<VM-UUID>
基本的な機能は同じですが、コマンドが長くなってるのと、ホストのUUIDを指定するようになっています。
XenSeverでは、スナップショットの作成は数秒ででき(ゲスト容量による)、スナップショットを外部に書き出すことで
なんちゃって無停止バックアップ+VMベースのバックアップを実装できそうでしたが
LVMの増加とLVMの結合時間をかんがえると、弊社での利用は難しいかなといった感じです。残念。
iPhoneでWebサイトの表示が小さい場合の対処法
先日のiPhone自動文字縮小について記述しましたが、今回iPhone向けサイトを構築していて、シミュレータなどと比較すると非常に画像サイズが小さく、縮小されて表示されてしまうという現象となりました。
どうも、iPhoneはデフォルト横幅960pixとしてレンダリングし、それをiPhoneの解像度にあわせて縮小表示するようです。
これを実際のpixelにあわせて表示させるためにはmetaタグにて viewportの指定を行う必要があります。
iPhone3 iPhone3GSの解像度ぴったりにあわせる場合には
<meta name=”viewport” content=”width=320″ />
と指定することによって、サイトを横幅320pixとしてレンダリングして表示されます。
これでも文字が小さいと感じる場合は前回のエントリの-webkit-text-size-adjust とあわせると良いでしょう。
最近のコメント