SlideShare a Scribd company logo
MongoDBの特徴と 
トラブルシューティング 
@第5回 中国地方DB勉強会 in 広島 
! 
玉川竜司@大阪
自己紹介 
• 玉川竜司 
• FB: Ryuji Tamagawa 
• Twitter: @tamagawa_ryuji 
• 本業ソフト開発(Sky株式会社) 
• 兼業翻訳者(ほぼオライリー)
What’s New & Next
今日のお題は 
MongoDB
MongoDBのいいところ 
• 一言で言うなら「お手軽」 - いい意味で 
• Webアプリケーションで求められる機能が手っ取り早く使える 
• 多目的の高性能「オートマ車」 
• インストーラやパッケージですぐ動きます 
• セカンダリインデックスやクエリオプティマイザがある 
• 多くの言語で、仕様がある程度統一されているドライバが利用可能
MEANスタック 
• JSONでバックエンドからフロントエンドまで統一 
• MongoDB、Express、AngularJS、Node.js 
• 昨日のOSCでも取りあげられていたようです
エコシステムの形成 
• 世界的に見れば、NoSQLデータベースとしては最もメジャーな存在になっ 
てきた → 周辺が充実してきている 
• クラウド上で実績多数。MongoHQなど、as a serviceでも提供されてい 
る 
• GUIツールも増えてきました 
• MMS(http://www.mongodb.com/mongodb-management-service) 
- バックアップ、運用管理などを行ってくれる本家のクラウドサービス
ただし 
• 集計は(今のところ)ちょっと苦手 - とはいえ改善中 
• (ほんとの)ビッグデータはちょっと難しいかも 
• 基本的に、オンメモリでいけるかどうかが問題 
• そういえば、でかいメモリのインスタンス、AWSでもAzureで 
もさくらでも増えましたね・・・
RDBとの違い 
• 物理構造の違い 
• 論理構造の違い 
• トレードオフの柔軟性 
• レプリカセット 
• シャーディング
物理構造の違い 
RDB MongoDB 
物理メモリ物理メモリ 
DBエンジンが管理する 
メモリバッファ 
サイズを 
指定できる 
データファイル 
メモリにマップされた 
ファイルの内容 
サイズを 
指定できない 
データファイル 
(メモリマップドファイル)
物理構造の違い(2) 
• とにかく、「ホット」なデータが物理メモリに収まるかが肝心 
• RDBほど細かなメモリのチューニングはできない 
• データが大きいなら、RAMを増やすか、シャーディングでスケール 
アウト
論理構造の違い 
RDB MongoDB 
{ 
_id: new ObjectId(""), 
slug: "gardening-tools", 
ancestors: 
[{ name: "Home", 
_id: new ObjectId(""), 
slug: "home" }, 
{ name: "Outdoors", 
_id: new ObjectId(“"), 
slug: "outdoors" 
} ], 
}
論理構造の違い(2) 
• スキーマの自由度は高い(特に変更に強い) 
• ドキュメントを超えたアトミック性はない 
• 設計上のトレードオフが生じる 
• 一つのドキュメントで閉じない場合はIDで参照 
• そうなると、処理をプログラムで書く必要が出てくる
トレードオフの柔軟性 
RDB MongoDB 
書いたら 
必ず 
永続化 
書き込み結果は 
必ず確認 
書き込み保証 
する?しない? 
しなけりゃ高速 
WAL使う? 
いくつのレプリ 
カへ書けたら成功 
したことにする?
トレードオフの柔軟性(2) 
• 書き込みの確実性とパフォーマンスはトレードオフ 
• 大量のログの記録などでは、多少こぼれるリスクを抱えてもコストダウ 
ンしたいこともある 
• 逆に、データセンター間で複製できていることを保証したいこともある 
• 書き込み保証(Write Concern)、WAL、レプリカへの書き込み、タ 
ギングなどで、多彩な調整が可能
レプリカセットとシャーディングについて 
• これらについては、「技術的には」RDBとの対立概念ではない 
• ただし、商用RDBではコストが跳ね上がる(ですよね?)機能 
• MongoDBでは最初から組み込まれて、非常にお手軽 & 便利 
• 大まかには 
• 読み込みのパフォーマンスと耐障害性を向上させるのがレプリカセット 
• 書き込みのパフォーマンスを向上させるのがシャーディング
レプリカセット 
Repreca-Master 
Client-App 
Driver 
Repreca-Slave 
Repreca-Slave 
書込 
複製 
読取 
oploogplog 
oplog 
oplog
oplogについて 
• Capped Collection : 追記のみ、古いデー 
タが自動的に削除される 
• oplog : データベースの更新処理を時系 
列で記録するcapped collection 
• プライマリのoplogをセカンダリのoplog 
が追いかけることでレプリケーションを 
行う 
Primary 
Secondary 
Secondary
レプリカセット 
Repreca-Master 
Client-App 
Driver 
Repreca-Slave 
Repreca-Slave 
書込 
複製 
読取 
oploogplog 
oplog 
oplog
レプリカセット(マスター交代) 
Repreca-Master 
Repreca-Master 
Repreca-Slave 
書込 
複製 
Client-App 
Driver 
読取 
oploogplog 
opolopglog 
oploogplog
障害発生時のoplog 
• 交代したプライマリと生きているセ 
カンダリのoplogは先へ進んでいく 
! 
• 停止中の元プライマリのoplogはも 
ちろん止まったまま 
元Primary 
(停止中) 
現Primary 
Secondary
レプリカセット(リカバリ中) 
Repreca-Slave 
(リカバリ中) 
Repreca-Master 
Repreca-Slave 
書込 
複製 
Client-App 
Driver 
読取 
! 
追いつくまで複製 
もしくはフルコピー 
opolopglog 
opolopglog
障害回復時のoplog(1) 
• 回復したセカンダリが、現プラ 
イマリのoplogを見て追いつい 
ていく 
Secondary 
現Primary 
Secondary
障害回復時のoplog(2) 
• 障害が長く続き、現プライマリの 
oplogと回復したセカンダリのoplog 
がオーバーラップしなくなってしまっ 
た場合 
• 仕方ないので自動的にfull syncに移 
行する 
• こうなると時間も負荷もかかるので、 
oplogの期間設定やファイルベースの 
バックアップ間隔は重要 
Secondary 
現Primary 
Secondary
レプリカセット(リカバリ後) 
Repreca-Slave 
Repreca-Master 
Repreca-Slave 
書込 
複製 
Client-App 
Driver 
読取 
! 
複製oopplologg 
opolpolgog 
opolpolgog
レプリカセット(バックアップのコストダウン) 
Repreca-Master 
(インデックスあり) 
Client-App 
Driver 
Repreca-Slave 
(インデックスあり) 
Repreca-Slave 
(バックアップ) 
書込 
複製 
読取 
バックアップ用のインスタン 
スにはインデックスを付けず、 
非力なマシンで済ませる
レプリカセット 
(誤操作、バグ対策) 
Repreca-Master 
(インデックスあり) 
Client-App 
Driver 
Repreca-Slave 
(インデックスあり) 
指定した時間遅らせて複製。 
誤操作によるデータ消去 
などの対策 
Repreca-Slave 
(バックアップ) 
書込 
複製 
読取 
Repreca-Slave 
(delayed)
レプリカセット(DC間での分散) 
Repreca-Master 
複製 
Client-App 
Driver 
Repreca-Slave 
Repreca-Slave 
書込 
読取 
DC-1 DC-2
レプリカセットのまとめ 
• 読み取り負荷の分散 
• 耐障害性 
• 自動フェイルオーバー & リカバリ 
• 多彩なトレードオフ
シャーディング 
• 書き込み負荷を1/nに 
• メモリ量をn倍に 
• パフォーマンスは上がる 
•障害は起きやすくなる 
→レプリカセットと併用 
Client-App 
Driver 
mongos 
mongod for 
あかさたな 
mongod for 
はまやらわ
やっと 
バックアップとリストアの話 
注)今回、ユーザー認証とかロールの話は、 
時間ないのであえてすっ飛ばします
ここ参照 
• P.288~ 
• 基本的になるのは2つの方法 
• データベースファイル+ジャーナ 
ルファイルを直接バックアップ・ 
リストア 
• ツールを使ってダンプ・リストア
特徴的なこと 
• そもそもトランザクションが(ほとんど)ないので、 
大きなトランザクションのロールフォワードを考える 
必要がない→楽ちん(実はアプリとのトレードオフな 
わけですが) 
• レプリカセットは重要
公式ドキュメントのシナリオ 
• ファイルシステムのスナップショットによるバックアップとリストア 
• バックアップからのレプリカセットのリストア 
• MongoDBのツールを使ったバックアップとリストア 
• シャードクラスタのバックアップとリストア 
• 予想外のシャットダウンからのデータリカバリ
ファイルシステムのスナップショットに 
よるバックアップとリストア 
• 普通にデータベースファイルをバックアップ/リストアするのと同じ。 
• ただし、OSのスナップショット機能を前提として考えた方がよさそう 
• メインのデータがあるディスクでジャーナリングしている場合、わりと単純 
• ジャーナリングをしていない場合、あるいはジャーナルが別ディスクの場合 
• db.fsyncLock()でファイルの整合性を保障(ただしバグっているらしい…) 
• レプリカセットのセカンダリを使うという手もある
バックアップからのレプリカセットのリストア 
• 想定されるシナリオ: 
• 初期データセットの実働環境のレプリカセットへの展開 
• バックアップデータセットからのレプリカセット再構築 
• まずレプリカセットのプライマリにバックアップデータをリストア 
• データが少なければ、そこから空のセカンダリへ同期 
• データが多ければ、セカンダリにセカンダリのバックアップをリストアして同期
MongoDBのツールを使ったバックアッ 
プとリストア 
• mongodumpとmongorestore 
• ドキュメントレベルでのリストアになるので、インデックスは再構 
築になる → 時間かかるので要注意
シャードクラスタのバックアップとリストア 
• 小規模なシャードクラスタ(根本的に矛盾してますが)なら、普通にツールでバッ 
クアップ/リストア 
• 通常は、シャード毎にバックアップ/リストアを行うことになる(難易度アップ) 
• ただし、シャードの境界は動的に変わるので、そこの対処はケースバイケース 
• 出て行ったドキュメントは無視してOK 
• バックアップ→リストアの間に当該シャードに入ってきたドキュメントがあっ 
た場合は、「どうにかして」対処が必要
予想外のシャットダウンからのデータ 
リカバリ 
• ジャーナリング無効 & 単独インスタンスで、クリーンにシャットダ 
ウンされなかった場合、データファイルの破損の可能性があるので、 
リペアの手順を踏むこと 
• シリアスな運用であれば、ジャーナリングを有効にするか、レプリ 
カセットを使うべきです
改善継続中 - 2.6以降について少し 
• 最新バージョンは2.6系 
• aggregation framework - サイズの制約の緩和 
• Write protocolの改善 - レイテンシの低減 
• Index Intersection - 複数インデクスの同時活用のはず… 
• 2.8/3.0はかなり大規模なアップデートになる模様
まとめ
今日話したこと 
• 運用についてはドキュメントをきっちり読見ましょう 
• この本に基本は書かれています。概要把握にどうぞ。 
• 電子書籍もあります。 
• http://www.oreilly.co.jp/books/ 
9784873115900/ 
• そのほかにもMongoDB関連の電子書籍があるの 
で、オライリージャパンのサイトで検索を。
それはともかく 
• 簡単に始められて 
• かなり深く使うこともできます 
• ただし落とし穴もあります 
→コミュニティへどうぞ! http://www.mongodb.jp 
• まずは手を動かしてみましょう! 
• レプリカセットをお手軽に試せます: 
• https://bitbucket.org/tamagawa_ryuji/mongodb_replicaset_playground_on_vagrant
ご清聴ありがとうございました。

More Related Content

What's hot (20)

PDF
Db tech showcase2015 how to replicate between clusters
Hiroaki Kubota
 
PPTX
Node.js×mongo dbで3年間サービス運用してみた話
leverages_event
 
PPTX
MongoDB World 2014に行ってきた!
Tetsutaro Watanabe
 
PPT
[大図解]ピグライフはこう動いている
Akihiro Kuwano
 
PPT
ザ・ドキュメント~うまくいかないNoSQL~
Akihiro Kuwano
 
PDF
Node js 入門
Satoshi Takami
 
PDF
サーバーのおしごと
Yugo Shimizu
 
PPT
mongoDB: OSC Tokyo2010 spring
ichikaway
 
PDF
Node.jsでサーバプログラマ デビューしよう
Yuusuke Takeuchi
 
PDF
大阪Node学園 七時限目 「ゼロからはじめるnode.js」
Shunsuke Watanabe
 
PDF
サーバサイドNodeの使い道
pospome
 
PDF
Hello, Node.js
Shin Sekaryo
 
PDF
MongoDB very basic (Japanese) / MongoDB基礎の基礎
Naruhiko Ogasawara
 
PDF
さいきんの InnoDB Adaptive Flushing (仮)
Takanori Sejima
 
PPTX
AngularJS2でつまづいたこと
Takehiro Takahashi
 
PDF
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
infinite_loop
 
PDF
サーバー未経験者がソーシャルゲームを通して知ったサーバーの事
Manabu Koga
 
PDF
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
infinite_loop
 
PPT
Node.js で Web アプリ開発
Tatsumi Naganuma
 
PDF
Node.js を選ぶとき 選ばないとき
Ryunosuke SATO
 
Db tech showcase2015 how to replicate between clusters
Hiroaki Kubota
 
Node.js×mongo dbで3年間サービス運用してみた話
leverages_event
 
MongoDB World 2014に行ってきた!
Tetsutaro Watanabe
 
[大図解]ピグライフはこう動いている
Akihiro Kuwano
 
ザ・ドキュメント~うまくいかないNoSQL~
Akihiro Kuwano
 
Node js 入門
Satoshi Takami
 
サーバーのおしごと
Yugo Shimizu
 
mongoDB: OSC Tokyo2010 spring
ichikaway
 
Node.jsでサーバプログラマ デビューしよう
Yuusuke Takeuchi
 
大阪Node学園 七時限目 「ゼロからはじめるnode.js」
Shunsuke Watanabe
 
サーバサイドNodeの使い道
pospome
 
Hello, Node.js
Shin Sekaryo
 
MongoDB very basic (Japanese) / MongoDB基礎の基礎
Naruhiko Ogasawara
 
さいきんの InnoDB Adaptive Flushing (仮)
Takanori Sejima
 
AngularJS2でつまづいたこと
Takehiro Takahashi
 
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
infinite_loop
 
サーバー未経験者がソーシャルゲームを通して知ったサーバーの事
Manabu Koga
 
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
infinite_loop
 
Node.js で Web アプリ開発
Tatsumi Naganuma
 
Node.js を選ぶとき 選ばないとき
Ryunosuke SATO
 

Similar to データベース勉強会 In 広島 mongodb (20)

PDF
Mongo dbを知ろう devlove関西
Ryuji Tamagawa
 
PDF
MongoDBざっくり解説
知教 本間
 
PPT
Mongodb
Satoru Mikami
 
DOC
20110301 Mongo Tokyo
Kenichi Masuda
 
DOC
20110302 Mongo Tokyo
Kenichi Masuda
 
PDF
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
Akihiro Kuwano
 
PDF
はじめてのMongoDB
Keisuke Izumiya
 
PDF
MongoDBのアレをアレする
Akihiro Kuwano
 
PPTX
Mongo db world 2018
Creationline,inc.
 
PDF
CasualなMongoDBのサービス運用Tips
Naoki Sega
 
PDF
CyberAgentにおけるMongoDB
Akihiro Kuwano
 
PDF
業務システムにおけるMongoDB活用法
Yoshitaka Mori
 
PDF
Mongodb 紹介
Ryo Matsumura
 
PPTX
比べてみよう リレーショナル vs ドキュメント.pptx
MariMurotani
 
PDF
MongoDB勉強会資料
Hiromune Shishido
 
PDF
MongoDB概要:金融業界でのMongoDB
ippei_suzuki
 
PPTX
Mongo dbを知ろう
CROOZ, inc.
 
PDF
何を基準に選定すべきなのか!? 〜ビッグデータ×IoT×AI時代のデータベースのアーキテクチャとメカニズムの比較〜
griddb
 
PDF
20120831 mongoid
Takeshi AKIMA
 
Mongo dbを知ろう devlove関西
Ryuji Tamagawa
 
MongoDBざっくり解説
知教 本間
 
Mongodb
Satoru Mikami
 
20110301 Mongo Tokyo
Kenichi Masuda
 
20110302 Mongo Tokyo
Kenichi Masuda
 
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
Akihiro Kuwano
 
はじめてのMongoDB
Keisuke Izumiya
 
MongoDBのアレをアレする
Akihiro Kuwano
 
Mongo db world 2018
Creationline,inc.
 
CasualなMongoDBのサービス運用Tips
Naoki Sega
 
CyberAgentにおけるMongoDB
Akihiro Kuwano
 
業務システムにおけるMongoDB活用法
Yoshitaka Mori
 
Mongodb 紹介
Ryo Matsumura
 
比べてみよう リレーショナル vs ドキュメント.pptx
MariMurotani
 
MongoDB勉強会資料
Hiromune Shishido
 
MongoDB概要:金融業界でのMongoDB
ippei_suzuki
 
Mongo dbを知ろう
CROOZ, inc.
 
何を基準に選定すべきなのか!? 〜ビッグデータ×IoT×AI時代のデータベースのアーキテクチャとメカニズムの比較〜
griddb
 
20120831 mongoid
Takeshi AKIMA
 
Ad

More from Ryuji Tamagawa (20)

PDF
20171012 found IT #9 PySparkの勘所
Ryuji Tamagawa
 
PDF
20170927 pydata tokyo データサイエンスな皆様に送る分散処理の基礎の基礎、そしてPySparkの勘所
Ryuji Tamagawa
 
PPTX
hbstudy 74 Site Reliability Engineering
Ryuji Tamagawa
 
PDF
PySparkの勘所(20170630 sapporo db analytics showcase)
Ryuji Tamagawa
 
PDF
20170210 sapporotechbar7
Ryuji Tamagawa
 
PDF
20161215 python pandas-spark四方山話
Ryuji Tamagawa
 
PDF
20161004 データ処理のプラットフォームとしてのpythonとpandas 東京
Ryuji Tamagawa
 
PDF
20160708 データ処理のプラットフォームとしてのpython 札幌
Ryuji Tamagawa
 
PDF
20160127三木会 RDB経験者のためのspark
Ryuji Tamagawa
 
PDF
20151205 Japan.R SparkRとParquet
Ryuji Tamagawa
 
PDF
Performant data processing with PySpark, SparkR and DataFrame API
Ryuji Tamagawa
 
PDF
Apache Sparkの紹介
Ryuji Tamagawa
 
PDF
足を地に着け落ち着いて考える
Ryuji Tamagawa
 
PDF
ヘルシープログラマ・翻訳と実践
Ryuji Tamagawa
 
PDF
Google Big Query
Ryuji Tamagawa
 
PDF
BigQueryの課金、節約しませんか
Ryuji Tamagawa
 
PDF
You might be paying too much for BigQuery
Ryuji Tamagawa
 
PDF
Google BigQueryについて 紹介と推測
Ryuji Tamagawa
 
PDF
lessons learned from talking at rakuten technology conference
Ryuji Tamagawa
 
PDF
丸の内MongoDB勉強会#20LT 2.8のストレージエンジン動かしてみました
Ryuji Tamagawa
 
20171012 found IT #9 PySparkの勘所
Ryuji Tamagawa
 
20170927 pydata tokyo データサイエンスな皆様に送る分散処理の基礎の基礎、そしてPySparkの勘所
Ryuji Tamagawa
 
hbstudy 74 Site Reliability Engineering
Ryuji Tamagawa
 
PySparkの勘所(20170630 sapporo db analytics showcase)
Ryuji Tamagawa
 
20170210 sapporotechbar7
Ryuji Tamagawa
 
20161215 python pandas-spark四方山話
Ryuji Tamagawa
 
20161004 データ処理のプラットフォームとしてのpythonとpandas 東京
Ryuji Tamagawa
 
20160708 データ処理のプラットフォームとしてのpython 札幌
Ryuji Tamagawa
 
20160127三木会 RDB経験者のためのspark
Ryuji Tamagawa
 
20151205 Japan.R SparkRとParquet
Ryuji Tamagawa
 
Performant data processing with PySpark, SparkR and DataFrame API
Ryuji Tamagawa
 
Apache Sparkの紹介
Ryuji Tamagawa
 
足を地に着け落ち着いて考える
Ryuji Tamagawa
 
ヘルシープログラマ・翻訳と実践
Ryuji Tamagawa
 
Google Big Query
Ryuji Tamagawa
 
BigQueryの課金、節約しませんか
Ryuji Tamagawa
 
You might be paying too much for BigQuery
Ryuji Tamagawa
 
Google BigQueryについて 紹介と推測
Ryuji Tamagawa
 
lessons learned from talking at rakuten technology conference
Ryuji Tamagawa
 
丸の内MongoDB勉強会#20LT 2.8のストレージエンジン動かしてみました
Ryuji Tamagawa
 
Ad

データベース勉強会 In 広島 mongodb