page_adsence

2014年10月29日水曜日

MongoDBをCentOS6.4にインストールから起動、PHPで利用するまで

1.リポジトリの追加(64bitの場合)
$ sudo vi /etc/yum.repos.d/mongodb.repo

[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1

32bit版の場合はURLの「x86_64」を「i686」に書き換えれば出来る。
2.yumコマンドでインストール
$ sudo yum install mongodb-org


3.起動
$ sudo /etc/init.d/mongod start
Starting mongod:                                           [FAILED]


4.起動失敗した原因を調べる
sudo view /var/log/mongodb/mongod.log

2014-10-29T11:58:37.248+0900 [initandlisten] ERROR: Insufficient free space for journal files
2014-10-29T11:58:37.248+0900 [initandlisten] Please make at least 3379MB available in /var/lib/mongo/journal or use --smallfiles

どうやら原因はディスクの空きが足りないことらしい。
調べてみると、MongoDBのデフォルト設定ではジャーナルファイルというものを作るようになっており、 そのファイルを作成するにあたって3.5GB近い空き容量が必要になるみたいです。
なので、自分のサーバの空き容量を確認してみます。

5.自分のサーバの空き容量を調べる。
$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             7.9G  5.2G  2.4G  69% /
tmpfs                 499M     0  499M   0% /dev/shm

確かに容量が足りていなかった。
容量追加しないといけないのかとも思ったが、ジャーナルファイルなるものは開発環境では特に必要ないんじゃないかということで、このファイルを作成しないように設定を変えました。

6.ジャーナルファイルを生成しないように設定を変える
$ vi /etc/mongod.conf

# Disables write-ahead journaling
# nojournal=true
       ↓
# Disables write-ahead journaling
nojournal=true

7.再度起動させてみる
$ sudo /etc/init.d/mongod stop
Stopping mongod:                                           [  OK  ]

無事起動しました。

続いてPHPで使用出来るようにします。
まずインストールに必要なものをあらかじめインストールしておきます。
$ sudo yum -y install gcc php-pear php-devel

続いてpecl経由でmongoのExtentionをインストール
途中で質問があるが、そのままEnterでOK。
$ sudo pecl install mongo
WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update
downloading mongo-1.5.6.tgz ...
Starting to download mongo-1.5.6.tgz (193,219 bytes)
.........................................done: 193,219 bytes
116 source files, building
running: phpize
Configuring for:
PHP Api Version:         20100412
Zend Module Api No:      20100525
Zend Extension Api No:   220100525
Build with Cyrus SASL (MongoDB Enterprise Authentication) support? [no] :Enter
building in /var/tmp/pear-build-roottRXj7r/mongo-1.5.6

mongo用にiniファイルを新規作成
$ sudo vi /etc/php.d/mongo.ini
extension=mongo.so ← これを書く

apacheを再起動させます。
$ sudo /etc/init.d/httpd restart

mongoが使用出来る状態になっているか確認します。
下記のように「mongo」と出てきたら成功です。
$ php -m | grep -i mongo
mongo


おまけ
ジャーナルファイルに関して調べてみました。
ここでは簡単にしか記載しませんが、ざっくりとまとめると、

・Mongoは書き込み処理の結果を気にしないので、高速に書き込める。
・Mongoは、まずメモリ上に スタックされ、60秒に1回の間隔でディスクに書き込む。
・ディスクに書き込まれていないデータは、サーバダウンによって消えるため、最大60秒間のデータを失う可能性がある。
・ver1.7までの対応策として用意されている機能は2つあるが、いずれもパフォーマンスを著しく低下させるものである。
・ver1.8にジャーナリング機能が実装され、100ミリ秒に1回ジャーナルファイルに書き込むことで、データ損失のリスクが低減された。しかしパフォーマンスはある程度低下する(30%程度)

ジャーナルファイルに関しては以下の記事に詳しく書いてある。
http://doryokujin.hatenablog.jp/entry/20110614/1308010072