MongoDB のレプリカセット運用時の 2.2 から 2.4 へのアップグレード

Webサービス自体はを止めずにバックエンドの MongoDB のバージョンアップをしたのでメモ。 具体的なバージョンは、2.2.2 から 2.4.1 へのアップグレード。 サービスの構成 フロントエンドに Nginx + Node の Web サーバ 1 台 バックエンドに MongoDB のデータベースサーバ 2 台をレプリケーション 但し、片方のサーバだけしか Primary にはならないように優先度をセットしている。 MongoDB のインストールは /usr/local 以下にバージョン毎にディレクトリ展開して、使用バージョンへシンボリックリンクを張っている。 以上のカジュアルな運用状況。 アップグレードの実行 前準備 クライアントのライブラリアップデート mongoose や 各種言語の ライブラリを 2.4 対応にアップデートする。 MongoDB 2.4 のバイナリを各サーバの /usr/local に展開しておく。 更新系のクライアント、daemon や cron によるバッチなどを停止もしくは無効にしておく。 サービス死活監視を無効にする。 実行手順 Upgrade MongoDB to 2.4 — MongoDB Manual 2.4.8 こちらに従って行います。 現状の SECONDARY サーバに入り、mongod を停止させる。 /usr/local/mongodb のシンボリックリンクを 2.4 へ張り替える。 mongod を起動する。 mongo シェルで db.serverStatus().version を実行し、バージョンアップを確認。 ここまでで最初のサーバのアップグレード完了。 現状の PRIMARY サーバに入り、mongo シェルでアクセスし rs.stepDown() で SECONDARY に降格させる。 ファイルオーバーが完了もしくは、SECONDARY になったことが rs.status() で確認できたら、mongod を停止させる。 /usr/local/mongodb のシンボリックリンクを 2.4 へ張り替える。 mongod を起動する。 mongo シェルで db.serverStatus().version を実行し、バージョンアップを確認。 これで2台目のサーバのアップグレード完了。 自分の環境ではこちらが PRIMARY に復帰したことを確認して終了。 補足 db.collection.validate() などでデータベースが正常か確認する。 ...

2013年4月14日 · Toshimitsu Takahashi

Mongoose でセカンダリにアクセス可能な接続を設定をするには

MongoDB でレプリケーションセットを構成する。MongoDBでは Secondary サーバへのアクセスを読み取りであってもデフォルトで拒否するようになっている。 このためには接続ごとに slaveOk フラグを立てる必要があるが、そのときの Mongoose の設定に手間取ったのでメモしておく。 (2013/1/18 に、レプリケーション設定に誤りがあったため以降の内容を修正しています。) オプション設定 mongoose の connection を生成する方法は色々とありますが、createConnection メソッドを使っています。 createConnection の第2引数のオプションには、それぞれ以下のキーで設定を構成できます。 db - Node用 Native MongoDB ドライバーのオプション server - サーバ接続に関する設定 replset - レプリケーションセットに関する設定 ReplSet — MongoDB Node.JS Driver 1.3.20 documentation 接続を生成する関数例 以下、sampledb というデータベースに localhost で 27017 と 27018 ポートで動いている二つの MongoDB サーバに接続するときのサンプルです。レプリケーションセット名は「myrepl」で、コネクションプールもデフォルトの 5 から 10 に増やしています。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 const DB_HOST = "localhost:27017"; const DB_NAME = "sampledb"; const DB_REPLSET_NAME = "myrepl"; const DB_REPLSET_MEMBERS = "localhost:27017,localhost:27018" var mongoose = require('mongoose'); var mongooseConnection = (function(){ var uri; var opts = { server: { poolSize: 10, auto_reconnect: true } }; if (DB_REPLSET_NAME && DB_REPLSET_MEMBERS) { var rsmembers = DB_REPLSET_MEMBERS.split(','); var svs = []; rsmembers.forEach(function(sv){ svs.push("mongodb://" + sv + "/" + DB_NAME); }); uri = svs.join(","); opts.replset = { rs_name: DB_REPLSET_NAME, readPreference: 'primaryPreferred' }; } else { opts.db = { slave_ok: true }; uri = 'mongodb://' + DB_HOST + '/' + DB_NAME; } return mongoose.createConnection(uri, opts); })(); ※ DB_REPLSET_NAME, DB_REPLSET_MEMBERS が設定されていればレプリケーション設定になります。

2013年1月14日 · Toshimitsu Takahashi

AKB48 の Google+ アクティビティデータを MongoDB で MapReduce してみた

MapReduce について実際やってみたことがなかったので、MongoDB で試しそうと思っていました。 そんななか、AKB48 の(18歳以上?の)メンバーが Google+ を開始しました。これで「バルス」以上に定時でかつてない負荷が Google+ にかかり始めたと思われます。ということで、扱うにはもってこいなデータなのでこれを使うことにしました。 Google+ API は今のところデータのGETしかできないようですが、それで充分です。 とりあえずメンバーの Googel+ のID(?)と名前をMongoDB のコレクションに突っ込みます。 それを元に定期的に各メンバーのアクティビティ(活動のエントリ)を取得しては、 JSON をそのままほぼそのまま別のコレクションに突っ込みました。 メンバーの取得とセット AKB48 Now on Google+ のHTMLを適当にパースして突っ込みました。 MongoDB シェルで見ると以下のように入ってます。 $ /proj/arble/mongodb/bin/mongo MongoDB shell version: 2.0.0 connecting to: test \> db.idols.find({}, { "_id":0, "id":1, "name":1 }) { "id" : "108406705498777962659", "name" : "板野友美" } { "id" : "112077362806147944184", "name" : "梅田彩佳" } { "id" : "105229500895781124316", "name" : "大島優子" } { "id" : "108367535733172853340", "name" : "大家志津香" } { "id" : "116324240483798147615", "name" : "大矢真那" } { "id" : "107135851528812577523", "name" : "小木曽汐莉" } { "id" : "111145641865855965824", "name" : "小野晴香" } { "id" : "110230842586402039931", "name" : "河西智美" } { "id" : "109547251260290757268", "name" : "柏木由紀" } { "id" : "108485060451296256117", "name" : "片山陽加" } has more Google+ からデータの取り込み Activities: list - Google+ Platform — Google Developers を使うと、ユーザのアクティビティがリストで取得できます。userId に上記の idを、collection に “public” と指定します。 ...

2011年12月11日 · Toshimitsu Takahashi

Mongoose で MongoDB の Embedded Documents の扱いで嵌まったこと

node(.js)と相性が良いということで、MongoDB とそのJavaScript O/R マッパーライクなモデリングライブラリの Mongoose を使い始めました。 MongoDBと言えばドキュメント指向モデルでそれを特徴づける Embedded Documents が有名ですが、この機能を Mongoose から利用する上で躓いたので、メモしておきます。 Embbed Document の Array について var Users = new Schema({ name : String }); var Comments = new Schema({ title : String , body : String , date : Date }); var BlogPost = new Schema({ author : { type: ObjectId, ref: ‘User’ } , title : String , body : String , date : Date , comments : [Comments] , meta : { votes : Number , favs : Number } }); mongoose.model(‘User’, Users); mongoose.model(‘BlogPost’, BlogPost); ...

2011年10月30日 · Toshimitsu Takahashi