SlideShare a Scribd company logo
Begining MongoDB
初心者向け
MongoDBのキホン!
渡部 徹太郎2014/03/01
OSC2014Tokyo/Spring
Ver 3.0用に
ちょっと修正
2015/7/15
自己紹介
{"ID" :"fetaro"
"名前" :"渡部 徹太郎"
"経歴" :"学生時代は情報検索の研究(@日本データベース学会)"
"仕事" :{"昔":"証券会社のオントレシステムのWeb基盤",
"今":"オープンソース全般"}
"特技":["サーバ基盤","Linux","KVM","ruby","MongoDB"]
"エディタ":"emacs派"
"趣味":"自宅サーバ"
"MongoDB関連":{
-"3年前に、友人の結婚式用のアプリを作った時に利用"
-"技評記事「MongoDBでゆるふわDB体験」"
-"日経SYSTEMS 8月号 「ドキュメント指向データベース」"
}
}
2
NoSQLの位置づけ
• NoSQLはデータベースの中でも、
スキーマレス&ビックデータが得意で、オンライン操作向け
NoSQL
• MongoDB
• Cassandra
• Couchbase
• Redis
• Neo4j
Hadoop
• Apache Hadoop
• Hortonworks
• Cloudera
• MapR
RDBMS
• Oracle
• MySQL
• SQL Server
• PostgreSQL
DWH
• Teradata
• IBM Netezza
• EMC Greenplum
• HP Vertica
オンラインで
データ操作
バッチで
分析・集計
スキーマあり&非ビックデー
タ
スキーマレス & ビックデータ
MongoDBの位置づけ(1/3)
• MongoDBはNoSQLの中のドキュメント指向データベース
44
キーバリュー型
Riak, Redis,
memcached,
KVS
RDBMS
MySQL,PostgreSQL,
Oracle,SQL Server,DB2
列指向
Cassandra,
HBase,
Amazon DynamoDB
キ
ー
列 array
hash
ドキュメント
NOSQL(Not Only SQL)
ドキュメント指向
MongoDB, Couchbase Server
DocumentDB, DynamoDB,
ドキュメント
データベース
キー 値
キー
値
グラフ指向
Neo4j
MongoDBの位置づけ(2/3)
• ドキュメント指向データベースとは
o データを階層構造のドキュメント(≒JSON)で扱う
• JSONとは
o ハッシュと配列をネストして使うことができる
o XMLよりシンプルに表現できる。読みやすく直観的
o ネストが深くなる場合に、より効率的に扱える。
• JSONの例
5
{
ID : 12345 ,
name :"渡部”,
address : {
Company :"日本”,
City :"東京”,
ZipNo :"045-3356”,
}
friendID : [ 3134 , 10231 , 10974 , 11165 ] ,
hobbies :
[
{ name :"自宅サーバ","year": 6 } ,
{ name :"プログラミング","year": 10 } ,
{ name :"麻雀","no": 16 } ] }
配列
ハッシュの配列
キーと値
ハッシュ
MongoDBの位置づけ(3/3)
6
 ドキュメント指向データベースの比較
MongoDB CouchDB Couchbase Server
データ構造 データベース
└コレクション
└ドキュメント
データベース
└ドキュメント
バケット
└ドキュメント
インデックスの
生成
インデックスを張りたいキーを指定
する
MapReduce関数を用いたビューを作成することで対
応
クエリー 動的クエリ。SQLライクな記述が
可能。
基本的なCRUD以外は、静的クエリ。上記
MapReduceで作成したビューへのアクセスがクエリ
にあたる。
主なインター
フェース
独自プロトコル。各言語用専用ドラ
イバを利用。
REST(HTTP) memcachedプロトコル
レプリケーショ
ン
シングルマスタ型レプリケーション
(1ノードにしか書き込めない)
マルチマスタ型レプリケーション
(複数ノードに書き込める)
開発言語 C++ Erlang C,C++,Erlang
MongoDBの特徴(1/8)
• MongoDBを一言でいうと
o RDBMSとKVSの中間
o MongoDBの特徴
7
水平分散 スキーマレス
多機能
リッチなデータ
レプリケーション 使いやすい柔軟なクエリ
KVSと
比較して
RDBMSと
比較して
MongoDBならでは
機能数
スケーラビリティ
水平分散能力
KVS
RDBMS
MongoDB
水平分散できて、
機能も多い
MongoDBの特徴(2/8)
• .
o JSON(階層型データ)は、Key-Valueに比べて、リッチなデータモ
デル
o このようにKey-Valueで1対多を表現しようとすると、key名に"-
1"等の配列の番号を持たせなければならず非常に扱いにくい。
8
リッチなデータ
key value
id 10
10-name "watanabe"
10-friendId-0 4
10-friendId-1 7
10-friendId-2 12
10-friendId-3 19
{
id: 10
name: "watanabe"
friendId : [4, 7, 12, 19]
}
JSON Key-Value
MongoDBの特徴(3/8)
• .
o 表現力豊かなクエリ
 SQLの文法に似せたクエリが扱いやすい。
 動的に作成可能。事前に定義不要。
 単純な条件検索だけでなく、集計等の高度なクエリも書ける。
o RDBMS以上に強力なインデックス
 セカンダリインデックス:主キー以外でインデックスを作成可能
 複合キーインデックス:複数のキーでインデックスを作成可能
 マルチキーインデックス:配列の要素に対してインデックス作成可
能
9
db.person.find( {"name":"watanabe","age": 30 } ).limit(3)
例)コレクションpersonに、“name”が“watanabe”で、
“age”が30のドキュメントを3つだけ取得したい
柔軟なクエリ
MongoDBの特徴(4/8)
• .
o 水平分散(シャーディング)が簡単
 キーによってデータをノードに分散することができる。また、
ノードを動的に追加し、データの自動バランシング機能もあ
る。
10
範囲 0-9 範囲10-19 範囲20-
x ドキュメント
チャン
ク
アプリケーション
mongosルータ
1 4 9 11 16 20 27
MongoDB
ドライバ
23
23 クエリを適切な
ノードに分散
シャードキーで
分散
ノード ノード ノード
シャードキー
水平分散
ドキュメント
MongoDBの特徴(5/8)
•
o 複製(レプリケーション)が簡単
 簡単なコマンドで、レプリケーションを構築可能。
 シャーディングと組み合わせることも可能
 MongoDBドライバが自動的に書き込み先を切り替えるため、仮想IPなどを
用意しなくてもフェイルオーバが可能(≒クラスタソフトウェアが不要)
11
アプリケーション
プライマリ
1 4 9
セカンダリ
1 4 9
セカンダリ
1 4
MongoDBドライバ
9
書き込み
レプリカセット
読み込み
データ複
製
読み込み
書き込めるのは
マスタのみ
読み込みは負
荷分散可能
プライマリ
1 4 9
プライマリ
1 4 9
セカンダリ
1 4 9データ複
製
アプリケーション
MongoDBドライバ
書き込み 読み込み読み込み
プライマリが障
害になったら、
プライマリノード
を選出し、自動
フェイルオーバ
レプリカセット
レプリケーション
MongoDBの特徴(6/8)
o レプリケーションとシャーディングを組み合わせて、負荷分散と冗長化を両立
12
マシン2
マシン3
マシン1プライマリ
データ1
セカンダリ
データ1
セカンダリ
データ1
レプリカセット
セカンダリ
データ2
プライマリ
データ2
セカンダリ
データ2
レプリカセッ
ト
セカンダリ
データ3
セカンダリ
データ3
プライマリ
データ3
レプリカセット
mongosルータ
負荷分散
冗
長
化
アプリケーション
MongoDBの特徴(6/8)
o レプリケーションとシャーディングを組み合わせて、負荷分散と冗長化を両立
13
マシン2
マシン3
マシン1プライマリ
データ1
セカンダリ
データ1
セカンダリ
データ1
レプリカセット
セカンダリ
データ2
プライマリ
データ2
セカンダリ
データ2
レプリカセッ
ト
セカンダリ
データ3
セカンダリ
データ3
プライマリ
データ3
レプリカセット
mongosルータ
アプリケーション
MongoDBの特徴(7/8)
•
o スキーマレスデータを扱える
o テーブル定義など無しに、すぐにデータをCRUDできる
•
o セットアップが非常に簡単
 OS毎にバイナリがあるため、ライブラリの追加インストール不要。
 起動までわずか3ステップ。
• OS毎のバイナリをダウンロード
• データディレクトリを作成
• 起動
o RDBMSを使っていた人が使いやすいように作られている
 データベース>テーブル(コレクション)>ドキュメント というデータ構造
 SQLとMongoクエリ言語は大部分マッピング可能
 インデックスもSQLと同じような宣言ができる
o 豊富なドキュメント・ノウハウ
 英語ではあるが公式ドキュメントは他のNOSQLに比べても豊富
 多くの人が使っているため、ノウハウが豊富。日本語のノウハウも多い。
14
使いやすい
スキーマレス
MongoDBの特徴(8/8)
•
15
機能 説明 ユースケース
機能 GridFS 大容量ファイル(16M以上)を扱うことができる。
大容量ファイルをドキュメントに分割して格納し、
アプリケーションには等価的なAPIを提供。
大容量ファイルの管理
地理空間インデック
ス
2Dや3Dのデータを格納し、それに対して交点や
近傍などの検索をかけることができる。
アプリでのつくり込み不要。
地図アプリのデータベース
キャップ付きコレクショ
ン・TTLインデクス
期限やサイズを指定したコレクションを作り、自動
的に古いドキュメントを引き落とせる
ログ保管
集計機能 SQLのグループ関数のように集計できる。
また集計関数をパイプラインでつなぐこともできる
データの集計
対障
害
ジャーナリング 単一ドキュメントに対して、書き込みの一貫性が
保持できる。
突然の電源停止等に対応し
たい
運用
性
各種統計コマンド 様々なサーバの統計情報を取得するツールや、
JSON形式で出力するコマンドがある
運用監視ツールとの連携
障害対応効率化
MMS (MongoDB
Management
Service)
MongoDBの監視、アラート、自動バックアップ、
ポイントインタイムリカバリ、自動バージョンアップ
ができるクラウドサービス。
運用監視の仕組みを簡単に
作りたい
多機能
MongoDB
GridFS API
GridFSのイメージ
db.map.find({loc:{$near:[ 139.701238, 35.658871 ]}})
大容量ファイル 地理空間インデックスを使ったデータに対するクエリ
$nearにより、座標に近
い点を検索
MongoDB 2.xとMongoDB 3.0の違い
• アプリケーションからのインターフェースは変更なし
• 大きな変更点はストレージエンジン(データ永続化部分)。
MongoDB 3.0では新しいWiredTigerと古いmmapベース
が選択可能。
MongoDB 2.x MongoDB 3.0
ストレージエンジン
(データ永続化部分)
mmapベース
(=OSまかせ)
mmapベース
(=OSまかせ)
WiredTiger
ロックの粒度 データベース単位 コレクション単位 ドキュメント単位
データ圧縮 × ○
snappyとzlibを選択可
データとインデックスの分
離
× ○
メモリ使用量制限 ×
OSから与えられるだけ使う
○
肥大化するドキュメントの
扱い
×
ドキュメントが肥大化する
と、物理的な移動が必要
△
アルゴリズムの変更によ
り、以前ほど発生しなく
なった
○
肥大化しても移動は発生
しない
使ってみよう
• コマンドメモ
# インストール
# ダウンロードページ
http://www.mongodb.org/downloads
wget https://fastdl.mongodb.org/linux/mongodb-linux-
x86_64-3.0.4.tgz
tar zxvf mongodb-linux-x86_64-3.0.4.tgz
# 起動
cd mongodb-linux-x86_64-3.0.4.tgz
mkdir data
./bin/mongod --dbpath=data --nojournal
# MongoDBへ接続
# 別のターミナルを上げて、mongo shellで接続
./bin/mongo
# 基本的なCRUD
use mydb
db.mycol.insert({"key1":"value1"})
db.mycol.insert({"key2":"value2"})
db.mycol.find()
db.mycol.find({"key1":"value1"})
db.mycol.update({"key1":"value1"},{"key1":"value-hoge"})
db.mycol.remove({"key1":"value1"})
db.mycol.remove()
# 少し実践的なデータで試してみる
db.profile.insert(
{
"name" : "watanabe",
"skill" : ["MongoDB","KVM","ruby"],
"job":{
"before" : "Online Trade System",
"now" : "Open Source"
},
"editor":"emacs"
}
)
db.profile.insert(
{
"name" : "ogasawara",
"skill" : ["MongoDB","LibreOffice","Printing"],
"editor":"vim"
}
)
db.profile.insert(
kubota = {
"name" : "kubota",
"skill" : ["MongoDB","MySQL","PostgreSQL","ruby","c++","java","Web"],
"editor":"emacs",
"keybord":"kinesis"
}
)
db.profile.find({"skill":"MongoDB"},{"name":1})
db.profile.find({"skill":"KVM"},{"name":1})
watanabe = db.profile.findOne({"name":"watanabe"})
watanabe["job"]
17
プログラミング言語から使う場合
• mongoshellと同じ使い勝手です
• rubyの例
18
MongoDBを使う上での注意点
• トランザクションが無い
o MongoDBが複数のドキュメントを一貫性をもって更新する事ができな
い
o ミッションクリティカルで複数のテーブルの更新を保証しなければな
らないようなシステムでは、利用してはならない。
• 外部キー・結合が無い
o 他のドキュメントへの参照はアプリケーションで実装する必要がある。
o 当然ながら、外部キー制約もないため、テーブル間の整合性が重要な
システムには向いていない。
o 複数のドキュメントの内容を結合して取得することはできない。
• スキーマが無い
o どのようなキー名でデータが入っているかわからない。データ型もわ
からない。
o データ登録間違えの際にエラーが発生しない。
o 設計書を厳格に管理しないと、どのようなデータが入っているかわか
らなくなり、保守性の低下を招く恐れがある。
19
MongoDBの使いどころ
• 使いどころ、ユースケースしては「がっつりMongoDB事例紹介」の方を参
照ください。
• http://www.slideshare.net/tetsutarowatanabe/mongodb-32964238
20
MongoDB JP ”日本MongoDBユーザ会”
• ホームページ
o MongoDB JP. http://www.mongodb.jp/mongo/main
• メーリングリスト
o google group 名「MongoDB JP」
o https://groups.google.com/forum/#!forum/mongodb-jp
21

More Related Content

初心者向けMongoDBのキホン!