この三連休でMongoの良さとは?みたいな感じでSkypeしてて「Mongo」について書くかぁってなったので、
今日はMongoDBについて。
MongoDBの良さっていろいろあると思うねんけど、
例えば、設計ちょっとは楽になる。レプリケーション、分散が簡単、集計処理が簡単とか、ゾロゾロ出ると思います。
個人的に、バイト等でMongo使う機会あって、「お、ここめっちゃ楽や」ってすごく実感してます。
で、その中の一つのレプリケーションをローカルで体験できる記事を書こうかと。
レプリケーション
レプリケーションとは、masterの内容を別のコンピューター上で、内容を常に同期する機能のこと。
mongoの環境等は今回のブログでは書きません。
レプリケーションの構成をこのような感じにします。
1 2 3 4 5 |
port:50000 // Primary(Master) port:50001 // Secondary port:50002 // Arbiter |
mongoの標準ポートは、27017なんですが、そこを今回汚さない感じで体験してもらえればと思います。
Arbiterってのは、DBの死活監視をしてくれるもの。
pingコマンドを定期的に送ってて、Primaryが死んだとか全部判定してくれるやーつ。
では、この環境をローカルで作ります。
port:50000用にデータを保存するdbpathの設定をしましょう。
1 2 3 |
mkdir Documents/Dev/mongo/mongo_50000 |
こんな感じでフォルダ作るだけでおk
あ、ついでにログを保存するフォルダも作りましょう。
1 2 3 |
mkdir Documents/Dev/mongo/logs |
これで、port:50000の下準備はできたので、
1 2 3 |
mongod --port=50000 --dbpath=Documents/Dev/mongo/mongo_50000 --logpath=Documents/Dev/mongo/logs/mongo50000.log --replSet=LocalRep --fork |
で、mongoサーバーを立ち上げてください。
ちょっとだけ、補足。
–forkでバックグランドで立ちあがるようになります。
–replSetで、レプリケーションのグループ名を決めます。今回はLocalRepにしましょう。
これで、同様にSecondaryのport:50001用とArbiterのport:50001も作りましょう
1 2 3 4 5 |
mkdir Documents/Dev/mongo/mongo_50001 mkdir Documents/Dev/mongo/mongo_50002 |
1 2 3 4 5 |
mongod --port=50001 --dbpath=Documents/Dev/mongo/mongo_50001 --logpath=Documents/Dev/mongo/logs/mongo50001.log --replSet=LocalRep --fork mongod --port=50002 --dbpath=Documents/Dev/mongo/mongo_50002 --logpath=Documents/Dev/mongo/logs/mongo50002.log --replSet=LocalRep --fork |
これで、三台のmongoサーバーが立ち上がりました。
それぞれのターミナルを複数立ち上げて、サーバーに入ってみましょう。
Arbiterには別に入らなくてよいです。
1 2 3 4 5 |
mongo --port=50000 mongo --port=50001 |
それでは、Primaryにデータを突っ込んでみましょう。
(port:50000での作業)
1 2 3 4 |
rs.initiate() rs.status() |
これで、LocalRepというグループにport:50000のデータベースは入ったと思います。
それでは、port:50001とport:50002をレプリケーションのグループに入れましょう
1 2 3 4 5 |
rs.add("ipを入れてね:50001") rs.add("ipを入れてね:50002",{arbiterOnly: true}) rs.status() |
三つ入ったことが確認できます。
1 2 3 4 5 |
use camphor db.member.insert({"name":"Kohey"}) db.member.find({"name":"Kohey"}) |
では、Secondaryはどうなっているか見てみましょう
1 2 3 4 5 |
use camphor db.getMongo().setSlaveOk() db.member.find({"name":"Kohey"}) |
セカンダリーで、読み込みの許可が必要なので
db.getMongo().setSlaveOk()
ってのを最初にかましてください
おぉぉーー!
Seondaryに入っているぞーー!
では、Primaryに一気に1000件ほど突っ込んでみましょう
(port:50000での作業)
1 2 3 4 5 6 7 |
for(i=0;i<1000;i++) { db.member.insert({"name":"Kohey_"+i});</p> } db.member.count() |
何気にmongoコマンドライン上でこういうこと簡単にできるの嬉しい。楽しい。
おぉぉぉーー!同期されているぜー!!
Primaryを落としてみましょう。
(port:50000での作業)
1 2 3 4 |
use admin db.shutdownServer() |
すると、port:50001がプライマリーになって,port:50000が落ちていることがわかります。
もう一度、port:50000を起動して、rs.status()を見ると
で、port:50001がPrimaryで、port:50000がSecondaryになっていることがわかります。
「port:50000の方がサーバーの性能がいいので、Primaryになって欲しいな。。」って時は、prioiryの設定が必要です。
まずは、現在のconfigの設定を見てみましょう。
1 2 3 |
rs.conf() |
priorityの設定の定義を書いて
rs.reconfig(定義した値)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
new_conf = { "_id" : LocalRep", "version" : 9, "members" : [ { "_id" : 0, "host" : "KOHEY-PC.local:50000", "priority":2 }, { "_id" : 1, "host" : "KOHEY-PC.local:50001", "priority":1 }, { "_id" : 2, "host" : "KOHEY-PC.local:50002", "arbiterOnly" : true } ] } rs.reconfig(new_conf) |
50000がPrimaryに戻っていることがわかります。
新しくmongoサーバーを購入して、レプリケーションに含ませるときは
1 2 3 |
rs.add("mongo ip:port") |
PrimaryとSecondaryの切り替えをしたいときは
1 2 3 |
rs.conf() |
で現在の定義を確認して、priorityの設定をして
1 2 3 |
rs.reconfig("新定義") |
で完成。
こんな感じで、コマンドひとつでレプリケーションが簡単にできるのがMongoの良い所かと。
こーへい