20120831 mongoid

52
Mongoidを語ってみよう 2012/08/31 @akimatter 13124日木曜日

Upload: takeshi-akima

Post on 31-May-2015

1.378 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: 20120831 mongoid

Mongoidを語ってみよう2012/08/31 @akimatter

13年1月24日木曜日

Page 2: 20120831 mongoid

自己紹介秋間武志

RBCスタッフ

仕事でmongoidを使って約2年

株式会社グルーヴノーツ

@akimatter

https://github.com/akm

http://d.hatena.ne.jp/akm/

13年1月24日木曜日

Page 3: 20120831 mongoid

アジェンダNoSQLのおさらい

MongoDBの概要

Mongoidの概要

Mongoid3の変更点

MongoDB 2.2の新機能

Mongoidでのモデリング

13年1月24日木曜日

Page 4: 20120831 mongoid

NoSQLのおさらい

13年1月24日木曜日

Page 5: 20120831 mongoid

NoSQLとはNoSQLとは、リレーショナルデータベース管理システム(RDBMS)以外のデータベース管理システムを指し、リレーショナルデータベースの長い歴史を打破するものとして、広い意味での関係モデル以外に属するデータベースの発展を促進させようとする運動である。

http://ja.wikipedia.org/wiki/NoSQL より

13年1月24日木曜日

Page 7: 20120831 mongoid

分散データベース

いくつかのNoSQLシステムは分散アーキテクチャを採用している

13年1月24日木曜日

Page 8: 20120831 mongoid

CAP定理ブリュワーの定理とも呼ばれ、分散コンピュータシステムのマシン間の情報複製に関する定理。ウェブサービスを想定して作られた定理。同時に以下の3つを満たすことはできないというもの。

一貫性 (Consistency)

可用性 (Availability)

分断耐性 (Partition-tolerance)

13年1月24日木曜日

Page 9: 20120831 mongoid

13年1月24日木曜日

Page 10: 20120831 mongoid

13年1月24日木曜日

Page 11: 20120831 mongoid

Eventually Consistency

システム内に、一時的にConsistentでない状態が生まれても、ある期間の後には、Consistentな状態になるような性質を、Eventually Consistencyという。

13年1月24日木曜日

Page 12: 20120831 mongoid

Eventually Consistency

この言葉が定義されたことで「ScalableでAvailableで、かつ、Eventually Consistentなシステムは可能である。」と言うことが可能になった。

実際、mongoidにも、consistencyの選択肢に:eventual と :strongがある

13年1月24日木曜日

Page 14: 20120831 mongoid

MongoDBの概要

13年1月24日木曜日

Page 15: 20120831 mongoid

特徴「MongoDB はドキュメント志向のDBMSです。 MySQLですがJSON型オブジェクトを伴い、RDBMS表ではなく、データモデルで構成されます。大切なことは、MongoDBは、結合やトランザクションをサポートしないということです。しかし二次的インデックスで、クエリ言語表示、アトミックがドキュメントレベルで書き込みを行い一貫した読み込みをするのを特徴とします。

操作上、MongoDBは、自動範囲ベース自動フェイルオーバーと水平スケーリングを内蔵する、マスタースレーブ・レプリケーションを特徴とします。」

http://jp.docs.mongodb.org/manual/faq/fundamentals/#what-kind-of-database-is-mongodb

13年1月24日木曜日

Page 16: 20120831 mongoid

例えばこんな構成も

13年1月24日木曜日

Page 17: 20120831 mongoid

分散アーキテクチャ

レプリケーション

マスター/スレイブ

レプリカセット

シャーディング

13年1月24日木曜日

Page 18: 20120831 mongoid

JOINなし

「Mongoでは、リレーショナルデータベースのデザインでするような"正規化"はそれほど必要ありません。サーバサイドでの"join"がないからです。」

http://www.mongodb.org/pages/viewpage.action?pageId=7209156

13年1月24日木曜日

Page 19: 20120831 mongoid

埋め込みドキュメントドキュメントに複数のドキュメントを埋め込むことができる

db.employees.insert({_id:  ObjectId("4d85c7039ab0fd70a117d734"),  name:  'Ghanima',  family:  {mother:  'Chani',  father:  'Paul',  brother:  ObjectId("4d85c7039ab0fd70a117d730")}})

http://www.mongodb.org/pages/viewpage.action?pageId=18907286

13年1月24日木曜日

Page 20: 20120831 mongoid

組み込み vs 参照

http://www.mongodb.org/pages/viewpage.action?pageId=7209156

13年1月24日木曜日

Page 22: 20120831 mongoid

アトミックな操作

「MongoDBは、一つのドキュメント でのアトミックな操作をサポートしています」

http://www.mongodb.org/pages/viewpage.action?pageId=7209573

13年1月24日木曜日

Page 24: 20120831 mongoid

ACIDについて比較

http://ja.wikipedia.org/wiki/ACID_(コンピュータ科学)

RDB MongoDB

原子性 atomicity ○ △

一貫性 consistency ○ ○

独立性 isolation ○ ○

永続性 durability ○ ○

13年1月24日木曜日

Page 25: 20120831 mongoid

consistencyという言葉「一貫性のあるサービスでは、操作は完了するか、一切何もしないかの、どちらかだ。 ギルバートとリンチは、一貫性ではなく原子性(atomic)という語を証明の中で使っている。 理論的な文脈では原子性という方が要領を得ている。 というのも細かい話をすると、一貫性(Consistent) は データベーストランザクションの望ましい性質をあらわす ACID の C に使われており、 これはあるデータが事前に与えられた制約を破った状態で残らないことを意味している。 ところが CAP の C を分散システムでの事前の制約とみなし、 同じデータをあらわす複数の値を許さないことにすると、抽象化が漏れて紛らわしいことになる。 (それに、もしブリュワーが原子性(atomic)という語を使っていたら AAP 定理になる。 こんなのを発音しようとしたら皆が病人みたいになってしまう。)」

http://www.hyuki.com/yukiwiki/wiki.cgi?BrewersCapTheorem

13年1月24日木曜日

Page 26: 20120831 mongoid

Mongoidの概要

13年1月24日木曜日

Page 27: 20120831 mongoid

ODM for MongoDB

Mongoid (pronounced mann-goyd) is an Object-Document-Mapper (ODM) for MongoDB written in Ruby. It was conceived in August, 2009 during a whiskey-induced evening at the infamous Oasis in Florida, USA by Durran Jordan.

http://mongoid.org/en/mongoid/index.html

13年1月24日木曜日

Page 28: 20120831 mongoid

Mongoidの哲学

The philosophy of Mongoid is to provide a familiar API to Ruby developers who have been using Active Record or Data Mapper, while leveraging the power of MongoDB's schemaless and performant document-based design, dynamic queries, and atomic modifier operations.

MongoIdの哲学は、MongoDBのスキーマレスとパフォーマンスのドキュメントベースの設計、動的なクエリ、およびアトミックな更新操作のパワーを活用しながら、ActiveRecordやDataMapperを使用しているRubyの開発者におなじみのAPIを提供することです。

13年1月24日木曜日

Page 29: 20120831 mongoid

Documents Fields

class Person include Mongoid::Document field :first_name, type: String field :middle_name, type: String field :last_name, type: Stringend

ArrayBigDecimalBooleanDateDateTimeFloatHashIntegerMoped::BSON::ObjectIdRangeRegexpStringSymbolTimeTimeWithZone

13年1月24日木曜日

Page 30: 20120831 mongoid

Persistence StandardModel.create, Model.create!, Model#save, Model#save!, Model#update_attributes, Model#update_attributes!, Model#update_attribute, Model#upsert, Model#touch, Model#delete, Model#destroy, Model.delete_all, Model.destroy_all

この辺はActiveRecordと同じ感じ

13年1月24日木曜日

Page 31: 20120831 mongoid

Persistence Atomic

Model#add_to_set, Model#bit, Model#inc, Model#pop, Model#pull, Model#pull_all, Model#push, Model#push_all, Model#rename, Model#set, Model#unset

コールバックもバリデーションも呼ばれないから要注意

13年1月24日木曜日

Page 32: 20120831 mongoid

relationsActiveRecord Mongoid

ReferenceMongoidEmbed

belongs_to belongs_to embedded_in

has_many has_many embeds_many

has_one has_one embeds_one

has_and_belongs_to_many

has_and_belongs_to_many N/A

13年1月24日木曜日

Page 33: 20120831 mongoid

IDの振り方ActiveRecordでは、RDBサーバのautoincrementのカラムをidとして使用する。

MongoDBでは主キーとなる_idの値はクライアントで生成する必要がある。 Mongoidではドライバのmopedが行う。この値はUUIDを用いる。衝突する可能性はxxxくらい。

13年1月24日木曜日

Page 34: 20120831 mongoid

Mongoid3の変更点

13年1月24日木曜日

Page 35: 20120831 mongoid

構造

13年1月24日木曜日

Page 36: 20120831 mongoid

origin

One of MongoDB's greatest features is its ability to execute dynamic queries, which Origin abstracts in a familiar Arel-style DSL that Mongoid includes.

13年1月24日木曜日

Page 37: 20120831 mongoid

moped

Goal of this gem

Thread-safe

No more extension (bson_ext)

Cleanest API

Better ReplicaSet management

13年1月24日木曜日

Page 38: 20120831 mongoid

moped limitationLimitation

Ruby 1.9 only

No GridFS support

The only case where moped is slower than bson_ext is the ObjectId generation

13年1月24日木曜日

Page 39: 20120831 mongoid

MongoDB2.2

13年1月24日木曜日

Page 40: 20120831 mongoid

New FeaturesAggregation Framework

TTL Collections

Concurrency Improvements

Improved Data Center Awareness with Tag Aware Sharding

Fully Supported Read Preference Semantics

http://docs.mongodb.org/manual/release-notes/

13年1月24日木曜日

Page 41: 20120831 mongoid

Mongoidでのモデリング

13年1月24日木曜日

Page 42: 20120831 mongoid

Tengineの例

TengineはGroovenautsが開発している分散環境におけるイベントハンドリングおよびジョブの実行制御のためのフレームワーク

https://github.com/tengine/tengine

13年1月24日木曜日

Page 43: 20120831 mongoid

分散処理でのカウント

13年1月24日木曜日

Page 44: 20120831 mongoid

分散処理でのカウント

13年1月24日木曜日

Page 45: 20120831 mongoid

分散処理でのカウント

13年1月24日木曜日

Page 47: 20120831 mongoid

モデリングのポイント◦リレーショナルモデリングは利用可能なデータ構造駆動だ。この設計をするにあたって重要なテーマは"自分はどの答えを持っているか?"

◦NoSQLデータモデリングはアプリケーション特有のアクセスパターン、すなわち、サポートされるクエリの型駆動だ。メインテーマは"自分は何を知りたいのか?"

https://gist.github.com/2396234

13年1月24日木曜日

Page 48: 20120831 mongoid

組み込み vs 参照 再び

http://www.mongodb.org/pages/viewpage.action?pageId=7209156

13年1月24日木曜日

Page 49: 20120831 mongoid

関連テーブルとか

13年1月24日木曜日

Page 50: 20120831 mongoid

関連テーブルとか

13年1月24日木曜日

Page 52: 20120831 mongoid

参考文献

NoSQLデータモデリング技法

https://gist.github.com/2396234

ブリュワーの CAP 定理

http://www.hyuki.com/yukiwiki/wiki.cgi?BrewersCapTheorem

13年1月24日木曜日