ラベル MongoDB の投稿を表示しています。 すべての投稿を表示
ラベル MongoDB の投稿を表示しています。 すべての投稿を表示

2015年4月1日水曜日

CentOS 6.6 に yum コマンドで MongoDB をインストール

概要

過去にアーカイブ版をダウンロードしてインストール方法を紹介しました
MongoDBの最新版がyumでインストールできるみたいなのでインストールしてみました

環境

  • CentOS release 6.6 (Final)
  • MongoDB 3.0.1

インストール方法

まずmongodbが提供するリポジトリを追加します

touch /etc/yum.repos.d/mongodb-org-3.0.repo

作成した/etc/yum.repos.d/mongodb-org-3.0.repoに以下を記載します

[mongodb-org-3.0]
name=MongoDB Repository
baseurl=http://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.0/x86_64/
gpgcheck=0
enabled=1

これでyumインストールできるようになったのでインストールします
一旦yum clean allしておくといいかもしれません

yum clean all
yum install -y mongodb-org

正常に終了すればインストール完了です

動作確認

起動してみましょう
yumインストールしているのでserviceコマンドから起動できます

service mongod start

接続してみます
デフォルトのポート27017で接続します

mongo

接続が完了するとmongo用のプロンプトになります
DBを確認

> show databases
local  0.078GB

あとは普通にクエリを発行していけばOKです

Tips

  • 過去バージョンの2.6をインストールする場合はrepositoryを追加する際に以下のように記載します
[mongodb-org-2.6]
name=MongoDB 2.6 Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
  • 今回のyumコマンドでインストールされた主なパッケージは以下の通り
    • mongodb-org-server-3.0.1-1.el6.x86_64
    • mongodb-org-3.0.1-1.el6.x86_64
    • mongodb-org-tools-3.0.1-1.el6.x86_64
    • mongodb-org-shell-3.0.1-1.el6.x86_64
    • mongodb-org-mongos-3.0.1-1.el6.x86_64

2014年9月16日火曜日

MongoDBで実行クエリを必ずログに出力する方法

概要

Mongoクライアントから実行されたクエリを毎回ログファイルに出力するようにします
例えばサードパーティのライブラリから実行されているクエリがどんなクエリか知りたい場合に使えると思います

環境準備

  • Mac OS X 10.8.5
  • MongoDB 2.6.4

設定

MongoDBを起動するときにprofileslowmsオプションを付与します

mongod --logpath=/var/log/mongodb/mongo.log --profile=1 --slowms=-1

profileを1に指定し、slowmsを-1にして起動します
--logpathは各自の環境に合わせて設定してください

ちょっとしたTips

slowmsの部分を「1にして起動してください」という記事を何個か見ましたが、そうすると1ms以下で処理されたクエリはロギング対象にならないため、データが少ない場合にロギングすることができません

ただ、slowmsを-1にするとすべてのクエリがスロークエリと判断されるため管理系のクエリも大量にロギングされてしまいます
例えば以下のようなログが大量にロギングされると思います

2014-09-16T19:45:42.585+0900 [conn56] command admin.$cmd command: buildInfo { buildinfo: 1 } keyUpdates:0 numYields:0  reslen:854 0ms

なので上記の設定で必要なクエリ情報だけ確認したい場合はgrepコマンドと合わせて使用するのがいいと思います

tail -f mongo.log | grep -v "command admin.\$cmd command:"

あとprofileオプションに関してですが、いくつか設定があり
「1」はスロークエリのみ表示することができる設定ですが、今回に限ってはすべてがスロークエリになるので関係ありません
また「2」という設定もあり、これはすべてのオペレーションを表示する設定となります
今回はオペレーション系の操作も1ms以下で処理されるので1でも2でも管理系のクエリがロギングされてしまいます

とりあえず開発環境でデバッグしたいときには使えると思いますが、本番でslowms=-1にするのは出力されるログの量も考えて、あまりおすすめはしません
あとは管理系クエリを除いたクエリがすべて1ms以上かかるのであれば--profile=1 --slowms=1で問題ないと思います

うーん、とは言え何かもうちょっといい方法はないのだろうか

参考サイト

2014年3月4日火曜日

mongodbのsharding機能を使ってみた

■環境
CentOS 5.10 64bit
MongoDB 2.9.4

■MongoDBインストール
vim /etc/yum.repos.d/10gen.repo
[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
enabled=1
priority=1
yum clean all
yum -y install mongo-10gen mongo-10gen-server --disablerepo=\* --enablerepo=10gen

service mongod start
mongo
  でmongoコンソールが利用できることを確認する

service mongod stop
  確認ができたらshardingノードを立ち上げるため一旦停止しておく

■shardサーバの起動
mkdir /data/db/shard1/
mkdir /data/db/shard2/
mongod --shardsvr --port 27017 --dbpath /data/db/shard1/
mongod --shardsvr --port 27018 --dbpath /data/db/shard2/

「--shardsvr」オプションをつけてmongodプロセスを起動します
2つのshardサーバを異なるポートで立ち上げます
初回はデータを作成するので起動まで時間がかかります
「--logpath」と「--fork」オプションを付与することでバックグランドで実行することが可能です

■configサーバの起動
mkdir /data/db/config
mongod --configsvr --port 37017 --dbpath /data/db/config

shardingのメタ情報を保存しておくmogodプロセスです
shardsvr同様「--logpath」と「--fork」オプションを付与することでバックグランドで実行することが可能です

■mongosサーバの起動
mongos --configdb localhost:37017 --port 47017

「--configdb」オプションで先ほど起動したconfigサーバを指定します
shardsvr同様「--logpath」と「--fork」オプションを付与することでバックグランドで実行することが可能です

■起動プロセス確認
ここまでで起動したプロセスが以下のようになってれば問題ないです
root      6202  0.0  1.9 423840 39312 pts/6    Sl+  18:23   0:00 mongod --shardsvr --port 27017 --dbpath /data/db/shard1/
root      6227  0.0  1.8 421756 38720 pts/9    Sl+  18:23   0:00 mongod --shardsvr --port 27018 --dbpath /data/db/shard2/
root      6462  0.4  1.9 403340 40196 pts/8    Sl+  18:29   0:00 mongod --configsvr --dbpath /data/db/config --port 37017
root      6477  0.0  0.4 115524  9120 pts/5    Sl+  18:29   0:00 mongos --configdb localhost:37017 --port 47017

■sharding設定
mongosプロセス上に「admin」というコレクションが作成されていますので
adminコレクションに対して設定を追加していきます

mongo admin --port 47017
mongos> sh.addShard("localhost:27017");
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> sh.addShard("localhost:27018");
{ "shardAdded" : "shard0001", "ok" : 1 }
mongos> sh.status()
--- Sharding Status ---
  sharding version: {
        "_id" : 1,
        "version" : 3,
        "minCompatibleVersion" : 3,
        "currentVersion" : 4,
        "clusterId" : ObjectId("53144b7514a80c8a98d45417")
}
  shards:
        {  "_id" : "shard0000",  "host" : "localhost:27017" }
        {  "_id" : "shard0001",  "host" : "localhost:27018" }
  databases:
        {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
        {  "_id" : "test",  "partitioned" : false,  "primary" : "shard0000" }
        {  "_id" : "sharding_test",  "partitioned" : false,  "primary" : "shard0001" }

27017と27018をシャードとして追加しました

次にshard対象とするDBとコレクションとコレクションのキーを指定します
DBおよびコレクションは作成されていなくても問題ございません
mongos> sh.enableSharding("sharding_test");
{ "ok" : 1 }
mongos> sh.shardCollection("sharding_test.test_collection",{name:1});
{ "collectionsharded" : "sharding_test.test_collection", "ok" : 1 }
{ "ok" : 1 }
これでtest_collectionはshardingできるようになったので実際にデータを投入して確認してみます

■データ登録確認
mongo --port 47017
mongos> show dbs
admin   (empty)
config  0.046875GB
sharding_test   0.203125GB
作成したsharding_testデータベースがあることがわかります

データを登録してみます
mongos> use sharding_test
switched to db sharding_test
mongos> i = 0; while ( i < 100000 ) { db.test_collection.save({name:i}); i = i + 1}
100000
mongos> db.test_collection.find();
{ "_id" : ObjectId("531450466026cecc3ea4b71b"), "name" : 0 }
{ "_id" : ObjectId("531450466026cecc3ea4b71c"), "name" : 1 }
{ "_id" : ObjectId("531450466026cecc3ea4b71d"), "name" : 2 }
{ "_id" : ObjectId("531450466026cecc3ea4b71e"), "name" : 3 }
{ "_id" : ObjectId("531450466026cecc3ea4b71f"), "name" : 4 }
{ "_id" : ObjectId("531450466026cecc3ea4b720"), "name" : 5 }
{ "_id" : ObjectId("531450466026cecc3ea4b721"), "name" : 6 }
{ "_id" : ObjectId("531450466026cecc3ea4b722"), "name" : 7 }
{ "_id" : ObjectId("531450466026cecc3ea4b723"), "name" : 8 }
{ "_id" : ObjectId("531450466026cecc3ea4b724"), "name" : 9 }
{ "_id" : ObjectId("531450466026cecc3ea4b725"), "name" : 10 }
{ "_id" : ObjectId("531450466026cecc3ea4b726"), "name" : 11 }
{ "_id" : ObjectId("531450466026cecc3ea4b727"), "name" : 12 }
{ "_id" : ObjectId("531450466026cecc3ea4b728"), "name" : 13 }
{ "_id" : ObjectId("531450466026cecc3ea4b729"), "name" : 14 }
{ "_id" : ObjectId("531450466026cecc3ea4b72a"), "name" : 15 }
{ "_id" : ObjectId("531450466026cecc3ea4b72b"), "name" : 16 }
{ "_id" : ObjectId("531450466026cecc3ea4b72c"), "name" : 17 }
{ "_id" : ObjectId("531450466026cecc3ea4b72d"), "name" : 18 }
{ "_id" : ObjectId("531450466026cecc3ea4b72e"), "name" : 19 }
Type "it" for more

mongosやshardサーバのログを眺めているとそれらしきログが流れていることがわかるかと思います

27017と27018にログインして確認したところ今回は27018にすべてのデータが入っていました
27017にはDBとコレクションのみ作成されていました
10万件ほどではデータは分散されないようで続けてデータを登録し続けたら100万件あたりでデータの分散が発生しました
データ27017と27018にありますがmongosから見るとその合計の値を確認することができます

■Tips
shardサーバ、configサーバ、mongosサーバの停止はバックグラウンドで起動している場合はkillしてください
フォアグランドで実行している場合はCtrl+cで停止できます

とりあえず特定のコレクションに対してshardingさせるまではできました
まだ未調査な部分(チャンクやreplecaSetとの複合など)が多いので何かあれば追記していきます

■参考サイト

2014年2月27日木曜日

Windowsにmongodbをインストール

■環境
Windows7 64bit
MongoDB 2.4.9

■インストール
ダウンロードページから最新のバージョンのzipファイルをダウンロードします
http://www.mongodb.org/downloads
(2014/02/24の段階では2.4.9がダウンロードされました)

zipファイルを展開してできたファイルを名前変更します
mongodb-win32-x86_64-2008plus-2.4.9

mongodb
名前変更したファイルをCドライブ直下のディレクトリに移動します「C:\mongodb」
mongo用のデータディレクトリを作成します
これもCドライブ直下に作成します「C:\data\db」を作成してください

起動はコマンドプロンプトから実施します
cd c:\
C:\mongodb\bin\mongod.exe
上記のコマンドを実行してフォアグランドでmongodbがで起動できると思います

■接続確認
もう1つのコマンドプロンプトを立ちあげて接続テストをしてみます
C:\mongodb\bin\mongo.exe
と実行してください、先ほど立ちあげたmongodbサーバに接続できるかと思います

サーバ側のログにも
[initandlisten] connection accepted from 127.0.0.1:55924 #1 (1 connection now open)
という接続を確認するログが出ています

あとはmongoコマンドを実行していけばOKです(以下は例となります)
show dbs
use test
db.db.test_collection1.save({"_id":null});
db.db.test_collection1.pretty();

■参考

2013年12月20日金曜日

【Java,mongo】java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Integer

mongo側のデータが明示的にintで宣言されていないために発生しています
updateする際にNumberIntを使って明示的にintで値を登録します
db.hogeCollection.update({"_id":"abcdefg"},{$set:{"number":NumberInt(1000000000)}}, false, true);

2013年11月12日火曜日

mongodumpとmongorestoreのメモ

■環境
mongo 2.4.6
CentOS 5.9 64bit

■ダンプ
  • mongodump
  • すべてのDB情報をダンプする、ポートは27017、ダンプ元ホストはlocalhost、ユーザ認証なし
  • mongodump --db test1
  • test1のDB情報をダンプする、ポートは27017、ダンプ元ホストはlocalhost、ユーザ認証なし
  • mongodump --db test1 --port 30717
  • test1のDB情報をダンプする、ポートは37017、ダンプ元ホストはlocalhost、ユーザ認証なし
  • mongodump --db test1 --port 30717 --host localhost -u guest -p hogehoge
  • test1のDB情報をダンプする、ポートは37017、ダンプ元ホストはlocalhost、ユーザguestでhogehogeパスワードで認証

■リストア
  • mongorestore
  • ./dump配下のすべてのDBをリストアする
  • mongorestart --db test1 ./dump/test1
  • test1 DBに対して./dump配下のtest1 DBをリストアする
  • mongorestore -d [db_name] -c [collection_name] [bson_file_name].bson
  • 特定のコレクションだけを指定してリストアする「--port」を指定することも可能

■Tips
mongoは起動中でもダンプ、リストアをすることが可能

2013年11月9日土曜日

【mongo】DBアクセス時に認証を追加する方法

■環境
mongo 2.4.6
CentOS 5.9 64bit

■認証設定
とりあえず通常通りmongoを起動します
mongod

今回はtest1というDBに対して権限を追加します
use test1
db.addUser({user:"guest",pwd:"hogehoge",roles:["dbAdminAnyDatabase","readWrite"]})
test1というDBに対してのみ認証設定を実施するので他のDBに対しては操作することはできません
なので他のDBに対しても操作したい場合はtest1にした処理を同様に他のDBにも実施する必要があります

「dbAdminAnyDatabase」はroles名です、指定できるrole名の一覧は以下を参照してください
http://docs.mongodb.org/manual/reference/user-privileges/

adminコレクションに対しても認証させたい場合は「use admin」を実施したあとで同様のaddUserを実施してください
よくわからないのですが、ユーザ追加のクエリは若干時間がかかります(と言っても数秒です)

■認証ありでのmongod起動
一旦、mongodを停止します( kill or db.shutdownServer() )
認証モードでmongodを起動します
mongod --auth
これで認証が必要な状態でmongodが起動しました

再度、mongoでログインして「show dbs」等を実行しようとすると以下のエラーになるかと思います
Tue Nov  5 12:48:22.596 listDatabases failed:{ "ok" : 0, "errmsg" : "unauthorized" } at src/mongo/shell/mongo.js:46

先ほど追加したユーザでmongoにログインしてみます
mongo test1 -u guest -p hogehoge
show collections を実行するとコレクションの一覧を確認することができると思います
show dbs は他のDBに触ることになるのでエラーとなります
test1 配下のコレクションに関してはfindやsaveができます
ログインの方法はdb.auth("guest", "hogehoge")でも可能です

■参考サイト

2013年9月15日日曜日

mongoでlogrotateする方法

crontab -e
0 0 * * * /usr/bin/killall -SIGUSR1 mongod


公式にも書いてあるのでたぶんこれでいいのかなと
cronに登録しているのは独自仕様

http://docs.mongodb.org/manual/tutorial/rotate-log-files/

2013年9月6日金曜日

mongoのデータをWebUIで確認できる「mongo-vision」をインストールしてみた

■概要
過去に「mViewer」をインストールする記事を記載しましたがmongoのコレクションが2万あたりを超えた段階で
mViewerのレスポンスが著しく低下しWebUIで見れないレベルになってしまいました

今回は別のWebUIがないかと思い探したところ「mongo-vision」というWebUIがありましたので
そのインストール方法を紹介したいと思います
またJavaの5以上を使いますので事前にインストールが必要です

■インストール
1. モジュールのダウンロード
http://code.google.com/p/mongo-vision/downloads/list
今回ダウンロードしたバージョンは「1.1-dev3」という執筆時の最新版をダウンロードしました
ダウンロードできたファイル名はmongovision-1.1-dev3.zipとなります
今回はCentOSにインストールするので必要であればwget等でzipをダウンロードしてください
cd /var/tmp
wget http://mongo-vision.googlecode.com/files/mongovision-1.1-dev3.zip

2. デプロイ
ダウンロードしたzipファイルを展開します
mkdir mongovision
mv mongovision-1.1-dev3.zip mongovision
cd mongovision
unzip mongovision-1.1-dev3.zip

3. 起動
cd mongovision
./sincerity start restlet
以下のようなログが出力されれば起動完了
バックグランドではないのでプロセス確認は他のターミナルを立ちあげて確認する

Prudence 2.0-dev3 (Restlet 2.1.2 JSE)
Setting up application: "MongoVision"
Setting up application: "Prudence Administration"
Executing 58 startup tasks...
Finished all startup tasks in 0.789 seconds.

起動時に
Could not read source code for execution: /programs/restlet
というエラーが表示されて起動できない場合には再度unzipで再展開してみてください

4. 確認
http://hostname:8080/mongovision
にアクセスして画面が表示されることを確認する

5. DBコネクト
左下の「Connect」を押下してAddressの欄に「ホスト名:ポート番号」の形式でConnectを押下する
ユーザ名、パスワードが合わせて必要な場合はそちらも入力する
接続に成功したら左ペインにコレクションのあとはコレクションを選択すればオブジェクトの中が確認できます

■所感・Tips
mViewerよりかは快適に使えそうです
3万コレクションくらいでもブラウザ上で閲覧できました(若干クライアントがタイムアウトする場合がありますが。。)
コレクションをタブで開けるので複数のコレクションをタブで切替られます
JSONバリデートも自動で行ってくれます
コレクション名も省略せずすべて表示してくれます
検索するときは「{}(中括弧)」は不要で Query の欄に "Id":null な感じで入力するだけで検索できます
あとはテーマとかも変えられるので結構楽しいです
が、非常に残念なことに更新、削除、追加等ができず本当に閲覧するだけです
(すいません、こちらできました。選択したオブジェクトを編集して下の方に「Save」と「Delete」がありました。これで更新、削除ができます)
うまくリクエストが届かない場合はブラウザ自体をリロードしてください
リクエストの送信がうまくいくと右上に更新情報がポップアップのように表示されます
あとはmongoのstatus情報は閲覧できないので現在のコレクション数やデータサイズを見ることはできません
実装がJSメインなので基本的には快適に使えます、mViewerよりかはいいような気がしています。。。

■参考サイト

2013年7月11日木曜日

mongoDBで現在どのサーバがPRIMARYかをshellで調べる方法

mongo --quiet --port 30003 --eval 'printjson(rs.status());' | grep -B 3 PRIMARY | grep name | awk -F ":" '{print $2, $3}'

かなり力技です
30003で指定しているポートはmongoを実行するホスト上で起動しているReplicaSet用のどっかポートを指定すればOKです
mViewerを使うときにPRIMARYのポートを指定しないとダメなので調べました

これをJenkinsで定期的に回すようにすればビルド結果を見ることでPRIMARYの情報をすぐに見つけることができるようになると思ってます

2013年7月8日月曜日

mongoDBの中身をWebUIで確認できる「mViewer」を試してみた

■環境
CentOS release 5.9 (Final)
mongodb 2.4.4
Tomcat 7.0.27
Java 1.7.0_05

mongoは事前にインストールしておいてください
インストール方法は以下
http://kakakikikeke.blogspot.jp/2012/07/mongodbperl.html

■mViewerダウンロード
wget https://github.com/downloads/Imaginea/mViewer/mViewer-v0.9.1.tar.gz
tar xvzf mViewer-v0.9.1.tar.gz

■Tomcat上で動作させてみる
cp mViewer.war /usr/local/tomcat/webapps/
service tomcat restart

オートデプロイをONにしている場合は待っていれば展開されます
http://hostname:8080/mViewer/
にアクセスするとmViewerのログイン画面が表示されるかと思います

■Javaコマンドから動作させてみる
service tomcat stop
デフォルトでは8080で動作することになるのでポートが被っているtomcatを停止します

sh start_mViewer.sh
mViewerを展開したフォルダに移動してスタート用のシェルを実行
Using Http Port : 8080
[Winstone 2013/07/05 18:49:03] - Beginning extraction from war file
[Winstone 2013/07/05 18:49:03] - HTTP Listener started: port=8080
[Winstone 2013/07/05 18:49:03] - Winstone Servlet Engine v0.9.10 running: controlPort=disabled
と表示されてエラーがでなければ起動完了です

バックグランド実行ではないのでもう一つターミナルを立ちあげて
netstat -an | grep 8080
でポートがLISTENしているか確認してください

http://hostname:8080/
にアクセスするとmViewerのログイン画面が表示されるかと思います
Tomcatをインストールしていない場合は直接Javaコマンドから起動することもできます
Javaで直接アクセスした場合は「/」にアクセスしてください

■アクセスして使ってみる
ログイン画面のデフォルトは
IP:127.0.0.1
Port:27017
になっています
シャーディング等で色々とポートを分けているPRIMARYを指定してログインしてください
ユーザとパスワードも設定して入れば設定してください


左メニューにDBやコレクションの一覧があるようです
DBを選択するとその中にあるコレクションの一覧がCOLLECTIONS配下に表示されます


適当にコレクションとオブジェクトの追加を行なってみました
追加はコレクションの隣の歯車マークからできます
すごい簡単過ぎます
オブジェクトを追加するとコレクションを選択したときに右側のメインペインに検索フィールドが出てきます
JSONを入れれば検索ができます
何もいれないと10件ずつ表示してくれます

あとはクエリー数のグラフ描画とかコンソール画面とか見れたりします
グラフはほっておくとどんどんタイムスタンプが増えていきます
が、横軸の数字が何を表しているかは不明(現在時間からの経過秒かな)

ということで以上です
ユーザ系の設定とかもできるのかなーこのUI上でリードオンリーユーザとか作れると結構熱いんだけどなー


P.S mViewerのいけてないところ(20130820)
  • 実行したmongo queryを表示することができない(CRUD系すべて)
  • コレクション一覧でコレクション名が全文字表示されていないのでCtrl+F等でコレクション検索できない
  • find以外の検索クエリが投げられない

2013年5月31日金曜日

mongoDBでレプリカセットをやってみた

■概要
今回は1台のサーバで3ノード(プロセス)立ててレプリカセットを作成しました
mongoのバージョンは2.4.3
未インストールの場合は以下を参考にインストールしてください
http://kakakikikeke.blogspot.jp/2012/07/mongodbperl.html

■レプリケーション設定
□master
mkdir -p /data/node1
mkdir -p /data/node2
mkdir -p /data/node3
3ノード分のフォルダを作成

mongod --dbpath=/data/node1 --replSet=myrep --port=27017 --fork --logpath /var/log/mongodb27017.log --logappend
mongod --dbpath=/data/node2 --replSet=myrep --port=27018 --fork --logpath /var/log/mongodb27018.log --logappend
mongod --dbpath=/data/node3 --replSet=myrep --port=27019 --fork --logpath /var/log/mongodb27019.log --logappend
3ノード分のプロセスを起動します replSet は同じ名前にします
--fork を入れることでバックグラウンド実行することができます

mongo --port 27017
今回は 27017 ポートで動作しているプロセスをマスターノードとして設定します

config = {
"_id" : "myrep",
"members" : [
{ "_id" : 0, "host" : "127.0.0.1:27017" },
{ "_id" : 1, "host" : "127.0.0.1:27018" },
{ "_id" : 2, "host" : "127.0.0.1:27019", "arbiterOnly" : true } ] }
mongoのインタラクティブモードになったら上記を実行して config オブジェクトを実行します

rs.initiate(config)
rs.status()
config を引数にしてレプリカセットを初期化します
エラーにならなければ設定完了です
status で確認したときに3ノードが登録されていることも確認します

exit
mongo --port 27017
use mydb
db.test.insert({"key001": "values001"})
db.test.find()
一旦抜けたあとに再度インタラクティブモードになりテストデータをインサートしてデータが入ったことを確認します

□slave
mongo --port 27018
27018 ポートで動作しているプロセスをスレーブとしてます

db.getMongo().setSlaveOk()
スレーブとして動作させるためのおまじないです

show dbs
use mydb
db.test.find()
マスタからインサートしたデータがスレーブ側でも反映されていることを確認します

一番失敗しやすいのは config オブジェクトを作成してレプリカセットを初期化するところだと思います
ここでエラーになった場合はエラーメッセージでググればいろいろと解決策は出てくると思います

2012年7月25日水曜日

【MongoDB】fluentで飛ばしたログをMongoDBに格納する方法

MongoDBとfluentがインストールされていることを前提にしています
上記を未インストールの場合は以下を参考にしインストールしてみてください
---
MongoDB
http://kakakikikeke.blogspot.com/2012/07/mongodbperl.html
fluent
http://kakakikikeke.blogspot.com/2012/07/fluentd.html
---

でここまでインストールが完了しているとして以下インストールと設定方法です

fluent-gem install fluent-plugin-mongo
fluentのmongoプラグインをインストールします
emacs /usr/local/fluent/fluent.conf
以下のように設定する

<source>
  type tail
  format apache
  path /var/log/httpd/access_log
  tag mongo.apache
</source>

<match mongo.**>
  type copy
  <store>
    type file
    path /var/log/fluent/access_log
  </store>
  <store>
    type mongo
    database apache
    collection access
    host localhost
    port 27017
    flush_interval 10s
  </store>
</match>

fluentd --config /usr/local/fluent/fluent.conf -vv

これでmongodb側とログファイルにログが記載されるようになります
MongoDBは当たり前ですが、起動している状態で行なってください
storeタグのどちらかを削除すればMongoDBのみやファイル吐き出しのみを操作できます

お試しあれ

2012年7月16日月曜日

MongoDBのインストールとPerlからの簡単な操作まで

■mongoインストール
http://www.mongodb.org/dr/fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.6.tgz/download
tar xvzf mongodb-linux-x86_64-2.0.6.tgz
mv mongodb-linux-x86_64-2.0.6 mongodb
mv mongodb /usr/local/
mkdir -p /data/db
cd /usr/bin/
ln -s /usr/local/mongodb/bin/mongod mongod
ln -s /usr/local/mongodb/bin/mongo mongo
mongod
(mongoDBのデーモンプロセスの起動、1Gのサイズのバイナリファイルを3つほど作成すれば起動完了)
(デーモンを起動したターミナルはそのままにしておく)
mongo
(実際にmongoDBにアクセスしてみる)
(アクセスや操作を行うとデーモンを起動したターミナルにログが出力される)
> db.test.save( { a: 1 } )
> db.test.find()
{ "_id" : ObjectId("4ffd62476fa58b6422ae9873"), "a" : 1 }
(タグを押すと実行できる命令の候補を順送りすることができる)
exit

・基本コマンド参考サイト
http://d.hatena.ne.jp/matsukaz/20110418/1303144042
(基本コマンドはこちらが参考になる)


■perlドライバから操作
(perlを事前にインストールしておくこと)
yum install -y ncftp
(cpanの初期設定で必要になり未インストールだったのでインストール)
perl -v
This is perl, v5.8.8 built for x86_64-linux-thread-multi
cpan
cpan > install Bundle::CPAN
(初期設定がある場合は基本的には全部enter)
(入力しなければいけにあのはftpサーバ、Asia Japan にしてすべてのftpサーバを選択する)
cpan > o conf prerequisites_policy follow
cpan > o conf commit
(この設定をするとyesと求められるところを全て無視することができます)
cpan > force install MongoDB
cpan > force install BSON
cpan > force install Entities::Backend::MongoDB
cpan > force install MojoX::Session::Store::MongoDB
cpan > force install MongoDB::Admin
cpan > force install Mongoose
cpan > force install MongoDBI
cpan > force install MongoX
cd
find `perl -e 'print "@INC"'` -name 'MongoDB.pm' -print
(以下が表示されることを確認する)
./.cpan/build/MongoDB-0.45/blib/lib/MongoDB.pm
./.cpan/build/MongoDB-0.45/lib/MongoDB.pm
emacs perl_to_mongo.pl
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use MongoDB;

my $connection = MongoDB::Connection->new( host => 'yoshi3', port => 27017 );
my $database   = $connection->mydb;
my $collection = $database->things;

my $id   = $collection->insert({ hoge => 'tokyo tyrant'});
my $data = $collection->find_one({ _id => $id });

print "$id\t$data->{hoge}\n";

exit 0;
perl perl_to_mongo.pl
(Can't locate object method "run_command" via package "MongoDB::Database"が出た場合はこちらを参照)
(mongoコマンドからデータがインサートされていることを確認する)

2012年7月15日日曜日

Can't locate object method "run_command" via package "MongoDB::Database"

というエラーが出た

PerlからMongoDBに接続するところでrun_commandなんて無いですよー
と言われてエラーになっている

結構ハマったのでメモしておきます。。。

■環境
perl・・・5.8.8
MongoDB・・・2.0.6
PerlMongoDriver・・・ 0.45

■原因
MongoDB::Connection.pmでrun_commandを呼び出しているが
useしているモジュールの中でrun_commandを定義しているモジュールがない

■解決方法
MongoDB::Connection.pmに呼び出すモジュールを追加する
追加するモジュールはMongoDB::Database.pm
以下、自分で解決したときのコマンドを記載しておく

cd /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/MongoDB
emacs Connection.pm
package MongoDB::Connection;
our $VERSION='0.45';

# ABSTRACT: A connection to a Mongo server

use MongoDB;
use MongoDB::Database;←これを追加する
use MongoDB::Cursor;

use Any::Moose;
use Any::Moose'Util::TypeConstraints';
use Digest::MD5;
use Tie::IxHash;
use boolean;

PerlのMongoDBドライバは実はGitHubで公開されているので、forkして修正してpull requestしようかと思ってます
まぁ自分がそんなにPerlに詳しくないのがいけないんだと思うんですが、これはちょっとひどいと感じてしまいました

・mongodb / mongo-perl-driver
https://github.com/mongodb/mongo-perl-driver/