CentoOS6のサーバにMongoDB入れようとしてmakeでエラー出た時の話

CentOS6.5にMongoDBをインストールする – Qiita
http://qiita.com/nownabe/items/123a8fd04ff5252b3036

を元にリポジトリを追加してインスコ。
個人的にはenabledは0にする主義で。

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

んで、yumでmongodbを入れて、peclでドライバを入れようとしたら

「ERROR: `make’ failed」と。

ググってみたら、こういう記事発見。

mongodb – make fails trying to install mongo php driver on Centos 6 – Stack Overflow
http://stackoverflow.com/questions/29082370/make-fails-trying-to-install-mongo-php-driver-on-centos-6

どうやら、opensslが足らんかったようで。
言われてから気づきましたが、ログをちゃんと読んでみれば確かにopensslフォルダが見つかりませんというログがありました。

これもyumで入れて、再度 “pecl install mongo” を実行すると無事にインスコ終わり。
php-fpmをリロードしてphpでmongodb使えるの確認できました。

関係あるのかどうか分からんですが、php-fpmとかnginxとかリスタートしたちopnesslを入れたりなどで、phpのsessionフォルダの所有者が書き換わってて、セッション使えなくなったりしました。
どうしてですねん。

またデータファイルの所有者がrootに・・・

この1周間、ブログ投稿時のTwitterへの自動投稿が動いてないなぁと思い、投稿時にログを吐き出すようにして調べてみたら、ログ自体が出力されない。

ということは、自動Tweet以前の部分でエラー起きてるなぁと見てみたら、以前に起こった

MongoDB起動しない(´;ω;`) « Demence/Cup
http://blog.rutti.net/category_mongodb/item_1330.html

と同様の現象がまた再発してました。

自動Tweet前に短縮URLを生成するようにしてたんですが、短縮URL生成時にエラーが起こっていたわけで。
で、MongoDBのデータファイルの所有者がまたrootになってたわけで。
で、所有者をmongodbに戻して再起動したら直ったわけで。

うーん、これそもそもの原因はなんでっしゃろか。

MongoDBで”too much data for sort() with no index”て出た

3月くらいから少しずーつ作っている自作のアクセス解析サイトですが、最近あんまり手を加えていないので延々とアクセスログだけ溜まっていく日々だったのですが、ひさしぶりにログを確認してみたら

Fatal error: Uncaught exception ‘MongoCursorException’ with message ‘localhost:*****: too much data for sort() with no index. add an index or specify a smaller limit’

っていうエラーが出てました。
このエラーは「アクセス数が多めのサイト」の「1ヶ月分」の「リファラ」を見る時だけ出たのですが、どげんかせんといかんなぁとは思ってるところ。

一応、対象カラムにはインデックスをつけてるハズなんですが・・・なんで「with no index.」とか出るんでしょ?

かと言ってlimitで数を制限してしまうとアクセス解析の意味が無いし・・・。

というわけでちょっと考え中。


[追記]
find()の後にチェーンメソッドでsort()を入れてたんですが、それを外したらエラー出なくなりました。

※PHP
$result = $collection->find($conf,$field)->sort(array("date"=>-1));

$result = $collection->find($conf,$field);

・・・なんで?(´・ω・`)

MongoDB起動しない(´;ω;`)

こないだ対処したMongoDBがエラーを起こした時の対処法。
また発生した場合の為にメモメモ。

んで、事の発端はこないだMongoDB使ってるサイトにアクセスしてみたら、

Fatal error: Uncaught exception 'MongoConnectionException'
with message 'Transport endpoint is not connected'

って出たことによります。

mongodbが動いてないようだったので
とりま、mongod start しようとしたら今度は

Starting mongod: all output going to: /var/log/mongo/mongod.log
forked process: 12741

っていうエラー。

仕方ないので、リペアーしてみました。

/usr/bin/mongod --dbpath /var/lib/mongo --repair
だが、それでもダメ。

で、ログを見てみたら、mongodbのデータファイルの所有者がrootになっていた為にパーミッションの都合で開けなかった模様。

どうして所有者が変わったのかは不明ですが、とりあえず所有者をmongodに戻してやると無事に再起動しました。

そういう山なし落ちなし意味なしなお話。

MongoDBのインデックスメモ

こないだMongoDBで作った短縮URLサービス「Ce2Be」でDBにインデックスを張り忘れてたので、PHPからインデックスを貼る方法のメモ。

詳細についてはここ参照。
インデックス – Docs-Japanese – 10gen Confluence
http://www.mongodb.org/pages/viewpage.action?pageId=5800049

やり方は簡単にまとめるとこんな感じ。
<?php
define('DB_NAME','hoge');
define('DB_TABLE_NAME','hoge_table');

$mongo = new Mongo(); // DB接続
$db = $mongo->selectDB(DB_NAME); // DB名選択
$cl = $db->selectCollection(DB_TABLE_NAME); // コレクション選択

// インデックスの追加
$cl->ensureIndex(array('url' => 1));
$cl->ensureIndex(array('date' => 1));
$cl->ensureIndex(array('code' => 1));

// インデックスの確認
var_dump($cl->getIndexInfo());

// インデックスを削除する場合
$cl->deleteIndex("url");
$cl->deleteIndex("date");
$cl->deleteIndex("code");
?>

短縮URLサービスなんで、URLと日付と短縮コードにそれぞれインデックスを貼ってます。

CentOSでMongoDBをインストール

NoSQLとして知名度の上がってきているMongoDBを今更ながらインストール。
と言っても、やり方は公式ページに載ってる方法をそのままやってるだけですが。

Install MongoDB on RedHat Enterprise, CentOS, or Fedora Linux ― MongoDB Manual
http://docs.mongodb.org/manual/tutorial/install-mongodb-on-redhat-centos-or-fedora-linux/

のページを参考に作業。

システムが64bitか32bitかによってリポジトリがちょっと変わります。
うちのサーバは64bitなので64bit版をチョイス・・・と思ったらなぜか64bit版のリポジトリではインストールができなかったので32bitでインストール。

vi /etc/yum.repos.d/10gen.repo
------------------------------
[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/i686
gpgcheck=0
enabled=0
------------------------------

yumでインストール。
yum --enablerepo=10gen install mongo-10gen mongo-10gen-server

そして起動
service mongod start

ついでにPHPで使えるようにする設定。
ここ参照。
PHP: インストール手順 – Manual
http://www.php.net/manual/ja/mongo.installation.php

PECLモジュールをインストール
pecl install mongo

php.iniに下記を追加。
vi /etc/php.ini
------------------------------------
extension=mongo.so
------------------------------------

Apacheを再起動。
service httpd restart

とりあえず時間を見つけて何かMongoDBをいじってみよーかなーと。