はじめてのMongoDB

2013/09/18 TechCircle
IT基盤サービス企画室 泉谷圭祐
アジェンダ
MongoDBとは

MongoDBの特徴

MongoDBの基本

MongoDBの操作

MongoDBの運用

まとめ
MongoDBとは
米10gen社が開発しているオープンソースNoSQLデータベース

2009年2月に初回リリース

最新版は2.4.6

C++で書かれている
!?
MongoDBとは
公式サイト http://www.mongodb.org/
MongoDBの特徴
ドキュメント指向データベース

アドホッククエリが使える

高い可用性

多数のメジャーな言語でAPIを提供
MongoDBの特徴
ドキュメント指向データベース
JSONでデータを保存 

スキーマレス
{❴

}❵




id : "1" 

name : "hoge"

age : "25"

email : "hoge@tis.co.jp"

...
MongoDBの特徴
アドホッククエリが使える
RDBライクな操作が可能
> db.user.findOne(❨{❴"name" : "hoge"}❵)❩

!
{❴

"id" : "1",

"name" : "hoge",

"email"...
MongoDBの特徴
高い可用性
レプリカセット
Cluster
Node

Node

Node

Node
MongoDBの特徴
多数のメジャーな言語でAPIを提供
C


Erlang


PHP


C++


Java


Python


C#


Javascript


Ruby


Go

Node.js

Scala
MongoDBの特徴
統一的なインターフェースを提供
Ruby
require 'mongo'


!

db = MongoClient.new(❨'localhost', '27017')❩.db(❨'mydb')❩

collection...
MongoDBの基本
データベースの表現について

ドキュメントについて

Mongo Console
MongoDBの基本
データベースの表現について
MySQL

MongoDB

DatabaseA

DatabaseA

TableA

CollectionA

TableB

CollectionB

DatabaseB
TableC
...
MongoDBの基本
1レコード=1ドキュメント
{❴

MongoDB

DatabaseA
CollectionA



_id : ObjectId(❨"523444c714a05837e26ca8a0")❩

name : "hoge"...
MongoDBの基本
ドキュメントについて
{❴

}❵



_id : ObjectId(❨"523444c714a05837e26ca8a0")❩

name : "hoge"

age : "25"

email : "hoge@tis...
MongoDBの基本
Mongo Console

MongoDBのコンソールはJavascriptで実装されている
[hogeuser@localhost]$ mongo

MongoDB shell version: 2.4.6

conn...
MongoDBの操作
ドキュメントの作成

ドキュメントの参照

ドキュメントの更新

ドキュメントの削除
MongoDBの操作
ドキュメントの作成
> use test #DBの指定

> db.test_collection.insert(❨{❴

"name" : "hoge",

"email" : "hoge@tis.co.jp"

}❵)...
MongoDBの操作
ドキュメントの参照
!

#全件検索

> db.test_collection.find(❨)❩;

{❴ "_id" : ObjectId(❨"5234628337f4ddc7fa170918")❩, "name" : ...
MongoDBの操作
ドキュメントの更新
!

#事前状態

> db.test_collection.find(❨{❴"name":"hoge"}❵)❩;

{❴ "_id" : ObjectId(❨"5234628337f4ddc7fa170...
MongoDBの操作
ドキュメントの削除
!

#事前状態

> db.test_collection.find(❨{❴"name":"hoge"}❵)❩;

{❴ "_id" : ObjectId(❨"5234628337f4ddc7fa170...
MongoDBの操作
mongoDBにはトランザクションがない!!

> db.test_collection.remove(❨)❩;
MongoDBの操作
Demo
MongoDBの運用
レプリカセット

シャーディング

その他の機能
MongoDBの運用
レプリカセット

複数台のノードでクラスタを組んでミラーリング

PRIMARY1台、他はすべてSECANDARY

書き込みはPRIMARYで行う

PRIMARYが落ちたら投票が行われ、

次のPRIMARYが選出され...
MongoDBの運用
Demo
MongoDBの運用
シャーディング

複数台のレプリカセットクラスタでデータを分割
MongoDBの運用
シャーディング構成図
MongoDBの運用
シャーディング構成

シャード

通常はレプリカセットで構成する

コンフィグサーバー

1台か3台で構成(プロダクションでは3台構成とされている)

勝手に同期しているのでレプリカセットにする必要はない

ルーティングサ...
MongoDBの運用
その他の機能

ダンプ / リストア

cappedコレクション

TTLインデックス

MapReduce
MongoDBの運用
ダンプ / リストア

ユーティリティが付属
$ mongodump --collection "COLLECTION_NAME" --db "DB_NAME"

$ mongorestore --collection "...
MongoDBの運用
cappedコレクション

サイズ制限付きのコレクション

容量もしくはドキュメント数の制限をかけられる

古いものから自動的に削除される

※シャーディング環境では使えません
MongoDBの運用
TTL index

保持期限付きのコレクション

時刻型のフィールドが必要

古いものから自動的に削除される
MongoDBの運用
MapReduce

APIを叩くことで実行可能
#初期データ

> db.test.insert(❨{❴ "_id" : ObjectId(❨"523444c714a05837e26ca8a0")❩, "name" : ...
MongoDBの運用
その他にも

GridFS

地理空間インデックス

など、便利な機能がある
まとめ
MongoDBのいいところ

スキーマレス

アドホッククエリ

冗長化が楽

便利な機能が豊富

コミュニティが活発
まとめ
MongoDBのイケてないところ

トランザクションがない

結合がない、外部キーがない

悪い意味でスキーマレス

運用面で苦労話の

が。。。
まとめ
NoSQL全般に言えることだが。。。

新しい万能兵器ではない

限られた使い所で効力を発揮

非正規型データが大量にある場合

データ構造が確定していない場合
興味を持った方は
うちのリーダーが書いた記事を参考にまずはインストールから

http://codezine.jp/article/
detail/6982
御静聴ありがとうございました
eXcaleもよろしくお願いします

https://www.excale.net/
Upcoming SlideShare
Loading in...5
×

はじめてのMongoDB

1,583

Published on

社内勉強会での発表資料です

0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,583
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
18
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

はじめてのMongoDB

  1. 1. はじめてのMongoDB 2013/09/18 TechCircle IT基盤サービス企画室 泉谷圭祐
  2. 2. アジェンダ MongoDBとは MongoDBの特徴 MongoDBの基本 MongoDBの操作 MongoDBの運用 まとめ
  3. 3. MongoDBとは 米10gen社が開発しているオープンソースNoSQLデータベース 2009年2月に初回リリース 最新版は2.4.6 C++で書かれている
  4. 4. !?
  5. 5. MongoDBとは 公式サイト http://www.mongodb.org/
  6. 6. MongoDBの特徴 ドキュメント指向データベース アドホッククエリが使える 高い可用性 多数のメジャーな言語でAPIを提供
  7. 7. MongoDBの特徴 ドキュメント指向データベース JSONでデータを保存 スキーマレス {❴ }❵ id : "1" name : "hoge" age : "25" email : "hoge@tis.co.jp" company : {❴ name : "TIS" address : "新宿区西新宿8-17-1 }❵ ※厳密にはBSON(❨Binary JSON)❩で保存される
  8. 8. MongoDBの特徴 アドホッククエリが使える RDBライクな操作が可能 > db.user.findOne(❨{❴"name" : "hoge"}❵)❩ ! {❴ "id" : "1", "name" : "hoge", "email" : "hoge@tis.co.jp" }❵
  9. 9. MongoDBの特徴 高い可用性 レプリカセット Cluster Node Node Node Node
  10. 10. MongoDBの特徴 多数のメジャーな言語でAPIを提供 C Erlang PHP C++ Java Python C# Javascript Ruby Go Node.js Scala
  11. 11. MongoDBの特徴 統一的なインターフェースを提供 Ruby require 'mongo' ! db = MongoClient.new(❨'localhost', '27017')❩.db(❨'mydb')❩ collection = db.collection(❨'test_col')❩ ! documents = collection.find(❨'name' => 'hoge')❩ Java import com.mongodb."いろいろ" ! DB db = new MongoClient(❨ "localhost" , 27017 )❩.getDB(❨"mydb")❩; DBCollection collection = db.getCollection(❨"test_coll")❩; ! BasicDBObject query = new BasicDBObject(❨"name", "hoge")❩; DBCursor documents = collection.find(❨query)❩;
  12. 12. MongoDBの基本 データベースの表現について ドキュメントについて Mongo Console
  13. 13. MongoDBの基本 データベースの表現について MySQL MongoDB DatabaseA DatabaseA TableA CollectionA TableB CollectionB DatabaseB TableC DatabaseB CollectionC
  14. 14. MongoDBの基本 1レコード=1ドキュメント {❴ MongoDB DatabaseA CollectionA _id : ObjectId(❨"523444c714a05837e26ca8a0")❩ name : "hoge" age : "25" email : "hoge@tis.co.jp" }❵ {❴ CollectionB _id : ObjectId(❨"523444c714a05837e26ca8a1")❩ name : "huga" age : "30" email : "huga@tis.co.jp" }❵ DatabaseB CollectionC {❴ _id : ObjectId(❨"523444c714a05837e26ca8a2")❩ name : "foo" age : "32" phone : "090-1234-5678" <= !?
  15. 15. MongoDBの基本 ドキュメントについて {❴ }❵ _id : ObjectId(❨"523444c714a05837e26ca8a0")❩ name : "hoge" age : "25" email : "hoge@tis.co.jp" language : ["Japanese", "English"] home : {❴ name : "hoge apart" address : "新宿区西新宿1-1-1" }❵ "updatedAt" : ISODate(❨"2013-09-18T18:00:15.598Z")❩ 自動でidが割り振られる(❨DBで一 意)❩ 配列を要素にできる 入れ子にすることもできる 時刻を入れることもできる コレクション内で要素が異なっていても良い 1ドキュメントのサイズはBSONで16MBまで
  16. 16. MongoDBの基本 Mongo Console MongoDBのコンソールはJavascriptで実装されている [hogeuser@localhost]$ mongo MongoDB shell version: 2.4.6 connecting to: test ! > > var test = db.test.find(❨)❩.length(❨)❩; > > print(❨test)❩ 3 > 標準API以外に変数やメソッドを使った操作も可能
  17. 17. MongoDBの操作 ドキュメントの作成 ドキュメントの参照 ドキュメントの更新 ドキュメントの削除
  18. 18. MongoDBの操作 ドキュメントの作成 > use test #DBの指定 > db.test_collection.insert(❨{❴ "name" : "hoge", "email" : "hoge@tis.co.jp" }❵)❩; > コレクションはuse等する必要がない データベースもコレクションも初めてドキュメントを追加した時に
 自動で作成される
  19. 19. MongoDBの操作 ドキュメントの参照 ! #全件検索 > db.test_collection.find(❨)❩; {❴ "_id" : ObjectId(❨"5234628337f4ddc7fa170918")❩, "name" : "hoge", "email" : "hoge@tis.co.jp" }❵ > ! # クエリ検索 > db.test_collection.find(❨{❴"name":"hoge"}❵)❩; {❴ "_id" : ObjectId(❨"5234628337f4ddc7fa170918")❩, "name" : "hoge", "email" : "hoge@tis.co.jp" }❵ > ! #1件検索 > db.test_collection.findOne(❨{❴"name":"hoge"}❵)❩; {❴ "_id" : ObjectId(❨"5234628337f4ddc7fa170918")❩, "name" : "hoge",
  20. 20. MongoDBの操作 ドキュメントの更新 ! #事前状態 > db.test_collection.find(❨{❴"name":"hoge"}❵)❩; {❴ "_id" : ObjectId(❨"5234628337f4ddc7fa170918")❩, "name" : "hoge", "email" : "hoge@tis.co.jp" }❵ > ! #更新 > db.test_collection.update(❨{❴"name":"hoge"}❵, {❴$set : {❴"email" : "hoge@excale.net"}❵}❵)❩; ! #結果確認 > db.test_collection.find(❨{❴"name":"hoge"}❵)❩;
  21. 21. MongoDBの操作 ドキュメントの削除 ! #事前状態 > db.test_collection.find(❨{❴"name":"hoge"}❵)❩; {❴ "_id" : ObjectId(❨"5234628337f4ddc7fa170918")❩, "name" : "hoge", "email" : "hoge@tis.co.jp" }❵ > ! #削除 > db.test_collection.remove(❨{❴"name":"hoge"}❵)❩; ! #結果確認 > db.test_collection.find(❨{❴"name":"hoge"}❵)❩; ・・・?
  22. 22. MongoDBの操作 mongoDBにはトランザクションがない!! > db.test_collection.remove(❨)❩;
  23. 23. MongoDBの操作 Demo
  24. 24. MongoDBの運用 レプリカセット シャーディング その他の機能
  25. 25. MongoDBの運用 レプリカセット 複数台のノードでクラスタを組んでミラーリング PRIMARY1台、他はすべてSECANDARY 書き込みはPRIMARYで行う PRIMARYが落ちたら投票が行われ、
 次のPRIMARYが選出される
 (❨10∼20のダウンタイムが発生)❩ ノード数は奇数が推奨されている
  26. 26. MongoDBの運用 Demo
  27. 27. MongoDBの運用 シャーディング 複数台のレプリカセットクラスタでデータを分割
  28. 28. MongoDBの運用 シャーディング構成図
  29. 29. MongoDBの運用 シャーディング構成 シャード 通常はレプリカセットで構成する コンフィグサーバー 1台か3台で構成(プロダクションでは3台構成とされている) 勝手に同期しているのでレプリカセットにする必要はない ルーティングサーバー(❨mongos)❩ mongoを使う各サーバー自身が持つ コンフィグサーバーに問い合わせをして読み書きを分散
  30. 30. MongoDBの運用 その他の機能 ダンプ / リストア cappedコレクション TTLインデックス MapReduce
  31. 31. MongoDBの運用 ダンプ / リストア ユーティリティが付属 $ mongodump --collection "COLLECTION_NAME" --db "DB_NAME" $ mongorestore --collection "COLLECTION_NAME" --db "DB_NAME"
  32. 32. MongoDBの運用 cappedコレクション サイズ制限付きのコレクション 容量もしくはドキュメント数の制限をかけられる 古いものから自動的に削除される ※シャーディング環境では使えません
  33. 33. MongoDBの運用 TTL index 保持期限付きのコレクション 時刻型のフィールドが必要 古いものから自動的に削除される
  34. 34. MongoDBの運用 MapReduce APIを叩くことで実行可能 #初期データ > db.test.insert(❨{❴ "_id" : ObjectId(❨"523444c714a05837e26ca8a0")❩, "name" : "hoge", "age" : 25, "likes" : "music"}❵)❩ > db.test.insert(❨{❴ "_id" : ObjectId(❨"523444c714a05837e26ca8a1")❩, "name" : "huga", "age" : 30, "likes" : "sport" }❵)❩ > db.test.insert(❨{❴ "_id" : ObjectId(❨"523444c714a05837e26ca8a2")❩, "name" : "foo", "age" : 40,"likes" : "music"}❵)❩ > db.test.insert(❨{❴ "_id" : ObjectId(❨"523444c714a05837e26ca8a3")❩, "name" : "bar", "age" : 21, "likes" : "coding" }❵)❩ > db.test.insert(❨{❴ "_id" : ObjectId(❨"523444c714a05837e26ca8a4")❩, "name" : "test", "age" : 19, "likes" : "sport" }❵)❩ ! > var map = function(❨)❩{❴ emit(❨this.likes,1)❩; }❵; > > var reduce = function(❨key, value)❩{❴ return Array.sum(❨value)❩; }❵; > > db.test.mapReduce(❨map, reduce, {❴ query : {❴"age" : {❴$gt : 20}❵}❵, out : "likes_map"}❵)❩ ! /* 結果サマリ(省略)*/
  35. 35. MongoDBの運用 その他にも GridFS 地理空間インデックス など、便利な機能がある
  36. 36. まとめ MongoDBのいいところ スキーマレス アドホッククエリ 冗長化が楽 便利な機能が豊富 コミュニティが活発
  37. 37. まとめ MongoDBのイケてないところ トランザクションがない 結合がない、外部キーがない 悪い意味でスキーマレス 運用面で苦労話の が。。。
  38. 38. まとめ NoSQL全般に言えることだが。。。 新しい万能兵器ではない 限られた使い所で効力を発揮 非正規型データが大量にある場合 データ構造が確定していない場合
  39. 39. 興味を持った方は うちのリーダーが書いた記事を参考にまずはインストールから http://codezine.jp/article/ detail/6982
  40. 40. 御静聴ありがとうございました eXcaleもよろしくお願いします https://www.excale.net/
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×