Shoken Startup Blog

KitchHike Founder/CTO

MongoDB 3.2の新機能を先取りチェック

MongoDB 3.2の新機能について言及している記事を読んだので、簡単に要約を書く。

www.compose.io

MongoDB 3.2の新機能を早送りで見てみよう

MongoDB 3.2は2015年の終わりにリリースされる見込みだということが、MongoDB Worldで報告されました。新機能を見てみますが、開発中なのでリリースまでには変更する可能性があります。

今回はこの3つについて見てみます。

  1. ドキュメント バリデーション
  2. Partial Index
  3. Aggregationでjoin ($lookup)

カンファレンスではスキーマについて多くの話がありました。MongoDBはこれまでスキーマレスを売りにプロモーションされてきたので、スキーマについて言及されることは奇妙に見えます。これは、MongoDB, Incがデータベースに格納された文書への規則的な構造を再評価していることなのでしょうか。

MongoDBのエンタープライズツールではscans collectionsやeverse engineers a schema from the collectionsなど、スキーマについてのものがリリースされています。これらは3.2で、コレクションをより便利で整然とするための新機能への提案になるでしょう。

1. ドキュメント バリデーション

[SERVER-18227] Document Validation - MongoDB
3.1.3でリリース済み

コレクションと条件式を指定するシンプルな形のバリデーションです。バリデーションにパスしなかったら error 121 DocumentValidationFailureを出します。
条件式は、greater than, less than, existsなどの式が使えますが、今のところgeo nearやtext search, whereは使えません。

db.runCommand({"collMod": collName,  
               "validator" : {a: {$exists: true}}})

注意点。すでに存在しているコレクションのvalidateはできない。insert, update時のみ。

2. Partial Indexes

JIRAチケット: System Dashboard - MongoDB
3.1 RequiredでOpenだが、3.1.5で試したところ動いた。

2010年からJIRAに登録されている課題で、スキーマに関する新機能。filter expressionをパスしたドキュメントのみがindexされる仕組み。

db.myusercoll.createIndex({ name: 1 },  
        { partialFilterExpression: { status: { $eq: "active" } } } )

ユーザーをactive, inactiveというステータスで管理している状況を考える。例えばsoft remove実装。 上記のクエリを流すと、activeなユーザーのみがnameでindexされる。

巨大なデータでのパフォーマンス改善になるだろう。filterにマッチしなかったドキュメントはクエリーでスキップされるだけではなく、insert やupdate時のindexingもスキップされる。

3. Aggregationでjoin ($lookup)

JIRAチケット: [SERVER-19095] $lookup - MongoDB
3.1.6でリリース予定

Aggregationフレームワークで、コレクション間のjoinに関する機能。普段の業務でjoinは使わなくても、analyseで使いたくなる時がある。MongoDB, Incはこれまでそのような場合は非正規化をするようにアドバイスしてきた。

これまでのAggregationフレームワークでは、単一のコレクションについてのパイプラインしか実行できなかったが、新機能の$lookupオペレータでは他のコレクションのデータを取得できるようになる。言い換えると、Aggregationステージでleft outer join機能を提供する。

$lookupは大きなポテンシャルを秘めているだろう。ユーザーはデータを非正規化しなくてもよくなる。ただ、実際にどのくらい使える機能なのかはalpha/beta版のリリースを待たなければならない。

まとめ

これらの3つの新機能は、サーバーサイドのMongoDBアーキテクチャにとって課題だった点への取り組みである。MongoDB 3.2 alpha/betaがリリースされた時、その改善を目に出来るだろう。3.2での他の変更点のほとんどはストレージエンジン、認証、他ツールとの連携とレプリケーションである。今後、残りの新機能についても取り上げていく。

MongoDBをtarからインストールしてCentOS 7のsystemdで起動/停止する設定

CentOS 7では、これまでのSysVinitからsystemdが使われるようになりました。 MongoDBもyumrpmでインストールするとsystemdで管理できるようになるみたいです。 ただ、yumに上がっていないリリース直後のMongoDBをtarからインストールしたい場合、自分で設定する必要があります。ちょうどCentOS 7に最新のMongoDBを環境構築する機会があったので、作業メモとして残します。

一番手っ取り早いのは、yumなりrpmなりでMongoDBをインストールした後、インストールされた/usr/binディレクトリにあるバイナリを差し替えることです。ただし、そうするとyumで管理しているバージョンと差異が出るので注意しないといけません。

今回はyumでのインストールを行わずに、MongoDBのtar + Githubリポジトリにあるrpm用の設定ファイルを使ってsystemdでの起動設定を行います。作業はすべてrootユーザーで行いました。

環境

手順

1. MongoDB 3.1.5のインストール

Downloads - MongoDB から最新のMongoDBをtgz形式でダウンロードします。今回は、RHEL 7 Linux64-bitです。

https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.1.5.tgz

設定ファイルはMongoDBのgithubにひな形があるので、ダウンロードして使います。

https://github.com/mongodb/mongo/blob/master/rpm/mongod.conf

他にもgithubrpmディレクトリにはsystemdで管理する際に必要となるファイルがありますので、後ほど使います。

まずは、rootユーザーでMongoDBが手動で起動するところまで進めます。

cd /opt
wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.1.5.tgz
tar zxfv mongodb-linux-x86_64-rhel70-3.1.5.tgz  
ln -s /opt/mongodb-linux-x86_64-rhel70-3.1.5/ /opt/mongodb

wget https://raw.githubusercontent.com/mongodb/mongo/master/rpm/mongod.conf
mv mongod.conf /etc/mongod.conf

mkdir /var/log/mongodb
mkdir /var/lib/mongo
mkdir /var/run/mongodb

準備できました。起動の確認を行います。

[root@xxxx ~]# /opt/mongodb/bin/mongod -f /etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 6637
child process started successfully, parent exiting

起動しない場合は、/var/log/mongodb/mongod.logを確認しましょう。

mongoシェルから接続を確認します。

[root@xxxx ~]# /opt/mongodb/bin/mongo
MongoDB shell version: 3.1.5
connecting to: test
Server has startup warnings: 
2015-07-13T15:46:30.961+0900 I CONTROL  [initandlisten] 
2015-07-13T15:46:30.961+0900 I CONTROL  [initandlisten] ** NOTE: This is a development version (3.1.5) of MongoDB.
2015-07-13T15:46:30.961+0900 I CONTROL  [initandlisten] **       Not recommended for production.
2015-07-13T15:46:30.961+0900 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2015-07-13T15:46:30.961+0900 I CONTROL  [initandlisten] 
> 

WARNINGがいくつか出ると思いますが、今回の記事では気にしないこととします。 接続できたことが確認できたら成功です。

次の手順でsystemdによる起動を行うので、いま起動させたmongodプロセスは停止させましょう。 mongod.lockファイルの削除も忘れずに。

kill `cat /var/run/mongodb/mongod.pid`
rm /var/lib/mongo/mongod.lock

2. systemdによる起動設定

ここから本題のsystemdによる設定に入ります。まずはmongodグループとmongodユーザーを作成します。コマンドはgithubにあるrpm用のspecファイルを参考にしています。

https://github.com/mongodb/mongo/blob/master/rpm/mongodb-org.spec

/usr/sbin/groupadd -r mongod
/usr/sbin/useradd -M -r -g mongod -d /var/lib/mongo -s /bin/false -c mongod mongod 

関連するディレクトリの所有者をmongodに変更します。

chown -R mongod:mongod /opt/mongodb
chown -R mongod:mongod /var/log/mongodb
chown -R mongod:mongod /var/lib/mongo
chown -R mongod:mongod /var/run/mongodb

systemdのserviceファイルをgithubからダウンロードして配置します。

wget https://raw.githubusercontent.com/mongodb/mongo/master/rpm/mongod.service
mv mongod.service /usr/lib/systemd/system
ln -s /usr/lib/systemd/system/mongod.service /etc/systemd/system/multi-user.target.wants/

daemon-reloadの後、起動させます。

systemctl daemon-reload
systemctl start mongod.service

systemctl statusで起動を確認しましょう。

[root@xxx ~]# systemctl status mongod.service
mongod.service - High-performance, schema-free document-oriented database
   Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled)
   Active: active (running) since Mon 2015-07-13 16:16:04 JST; 5s ago
 Main PID: 6774 (mongod)
   CGroup: /system.slice/mongod.service
           └─6774 /opt/mongodb/bin/mongod --quiet -f /etc/mongod.conf run

Jul 13 16:16:04 xxx systemd[1]: Starting High-performance, schema-free d.....
Jul 13 16:16:04 xxx systemd[1]: Started High-performance, schema-free do...e.
Jul 13 16:16:04 xxx mongod[6772]: about to fork child process, waiting u...s.
Jul 13 16:16:04 xxx mongod[6772]: forked process: 6774
Jul 13 16:16:04 xxx mongod[6772]: child process started successfully, pa...ng
Hint: Some lines were ellipsized, use -l to show in full.

Activeがactive (running) となっていたら成功です。お疲れさまでした!

停止コマンド

systemctl stop mongod.service

3. OS再起動時に/var/run/mongodbを作成する設定

CentOS 7は/var/run はtmpfsとなっているので、OS再起動時に削除されます。 /etc/tmpfiles.d/mongod.confを作成して再起動後もディレクトリが作成されるようにしましょう。

echo "D /var/run/mongodb 0755 mongod mongod -" > /etc/tmpfiles.d/mongod.conf

第二回もんご祭りの発表スライドまとめ

2014/10/11(土)に行われた第二回もんご祭りのスライドをまとめます。
第二回もんご祭りの概要はスタートアップCTO x MongoDBパネルディスカッションやります - Shokenをどうぞ。

Mongo db as_a_building_block

OpenStreetMap+MongoDBで地図情報を検索してみたい!

スタートアップCTO x MongoDB パネルディスカッション

MongoDB祭り 2014年

第二回もんご祭 パネルディスカッション by yujiosaka

スタートアップCTO x MongoDBパネルディスカッションやります

f:id:sfujisak:20140930210807j:plain

第二回もんご祭りで、CTOパネルディスカッションやります。

http://mongodb.jp/mongo/noryo2014/top

内容

スタートアップCTOが自社サービスでの事例を中心に、MongoDBの使いどころ、運用面、メリット/デメリット、MongoDBのロードマップについて議論します。
当日は会場の参加者からも質問を募集する予定です。

スピーカー

  • ニュース、サクサク スマートニュース 大平 哲也氏
  • お料理写真レシピアプリ SnapDish 清田 史和氏
  • Mongoで月間10億pvを支える ZenClerk 礒部 有司氏
  • モデレータ KitchHike 藤崎 祥見

第二回もんご祭りへの参加方法

Doorkeeperから申し込みください。第二回もんご祭りでは他にも、

などを予定しています。

MongoDBを使っている人、これから使おうとしている人、なんとなく興味ある方、10/11に渋谷でお待ちしてます!

http://62e60c2c9e4f4c61769ea89b71.doorkeeper.jp/events/15132

追記 当日の様子とスライド

f:id:sfujisak:20190616144840j:plain

speakerdeck.com

SnapDish 清田 史和氏

www.slideshare.net

ZenClerk< 礒部 有司氏

speakerdeck.com

Mongoidで日付の期間を指定して検索する方法

RailsからMongoidを使って、日付の期間を指定して検索する方法。

環境

  • Rails 4.1
  • Ruby 2.1.0
  • Mongoid 4.0.0.beta1
  • MongoDB 2.4.8

3日以内に作成されたユーザーを検索

この3つの書き方ができる。

User.where( :created_at => { "$gte" => Time.now.ago(3.days) }
User.where( :created_at.gte => Time.now.ago(3.days) )
User.gte( :created_at => Time.now.ago(3.days) )

他の条件を追加して絞り込むパターン

localeがjaで、3日以内に作成されたユーザーを検索

User.where( :locale => 'ja' ).gte( :created_at => Time.now.ago(3.days) )

公式ドキュメント

Mongoid: Querying