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

44
MongoDBの特徴と トラブルシューティング @第5回 中国地方DB勉強会 in 広島 玉川竜司@大阪
  • Upload

    -
  • Category

    Software

  • view

    840
  • download

    3

description

MongoDBの概要と、特にレプリカセットの耐障害性の話です。

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

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

MongoDBの特徴と トラブルシューティング @第5回 中国地方DB勉強会 in 広島

!

玉川竜司@大阪

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

自己紹介• 玉川竜司

• FB: Ryuji Tamagawa

• Twitter: @tamagawa_ryuji

• 本業ソフト開発(Sky株式会社)

• 兼業翻訳者(ほぼオライリー)

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

What’s New & Next

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

今日のお題は

MongoDB

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

MongoDBのいいところ• 一言で言うなら「お手軽」 - いい意味で

• Webアプリケーションで求められる機能が手っ取り早く使える

• 多目的の高性能「オートマ車」

• インストーラやパッケージですぐ動きます

• セカンダリインデックスやクエリオプティマイザがある

• 多くの言語で、仕様がある程度統一されているドライバが利用可能

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

MEANスタック

• JSONでバックエンドからフロントエンドまで統一

• MongoDB、Express、AngularJS、Node.js

• 昨日のOSCでも取りあげられていたようです

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

エコシステムの形成• 世界的に見れば、NoSQLデータベースとしては最もメジャーな存在になってきた → 周辺が充実してきている

• クラウド上で実績多数。MongoHQなど、as a serviceでも提供されている

• GUIツールも増えてきました

• MMS(http://www.mongodb.com/mongodb-management-service) - バックアップ、運用管理などを行ってくれる本家のクラウドサービス

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

ただし• 集計は(今のところ)ちょっと苦手 - とはいえ改善中

• (ほんとの)ビッグデータはちょっと難しいかも

• 基本的に、オンメモリでいけるかどうかが問題

• そういえば、でかいメモリのインスタンス、AWSでもAzureでもさくらでも増えましたね・・・

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

RDBとの違い• 物理構造の違い

• 論理構造の違い

• トレードオフの柔軟性

• レプリカセット

• シャーディング

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

物理メモリ物理メモリ

物理構造の違いRDB MongoDB

DBエンジンが管理する メモリバッファ

サイズを 指定できる

データファイル

メモリにマップされた ファイルの内容

サイズを 指定できない

データファイル (メモリマップドファイル)

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

物理構造の違い(2)

• とにかく、「ホット」なデータが物理メモリに収まるかが肝心

• RDBほど細かなメモリのチューニングはできない

• データが大きいなら、RAMを増やすか、シャーディングでスケールアウト

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

論理構造の違いRDB MongoDB

{ _id: new ObjectId(""), slug: "gardening-tools", ancestors: [{ name: "Home", _id: new ObjectId(""), slug: "home" }, { name: "Outdoors", _id: new ObjectId(“"), slug: "outdoors" } ], }

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

論理構造の違い(2)• スキーマの自由度は高い(特に変更に強い)

• ドキュメントを超えたアトミック性はない

• 設計上のトレードオフが生じる

• 一つのドキュメントで閉じない場合はIDで参照

• そうなると、処理をプログラムで書く必要が出てくる

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

トレードオフの柔軟性

RDB MongoDB

書いたら 必ず 永続化

書き込み結果は 必ず確認

書き込み保証 する?しない? しなけりゃ高速

WAL使う?

いくつのレプリカへ書けたら成功したことにする?

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

トレードオフの柔軟性(2)• 書き込みの確実性とパフォーマンスはトレードオフ

• 大量のログの記録などでは、多少こぼれるリスクを抱えてもコストダウンしたいこともある

• 逆に、データセンター間で複製できていることを保証したいこともある

• 書き込み保証(Write Concern)、WAL、レプリカへの書き込み、タギングなどで、多彩な調整が可能

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

レプリカセットとシャーディングについて• これらについては、「技術的には」RDBとの対立概念ではない

• ただし、商用RDBではコストが跳ね上がる(ですよね?)機能

• MongoDBでは最初から組み込まれて、非常にお手軽 & 便利

• 大まかには

• 読み込みのパフォーマンスと耐障害性を向上させるのがレプリカセット

• 書き込みのパフォーマンスを向上させるのがシャーディング

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

レプリカセット

Repreca-Master

Repreca-Slave

Repreca-Slave

書込

複製

Client-App

Driver

読取

oplogoplog

oplog

oplog

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

oplogについて

• Capped Collection : 追記のみ、古いデータが自動的に削除される

• oplog : データベースの更新処理を時系列で記録するcapped collection

• プライマリのoplogをセカンダリのoplogが追いかけることでレプリケーションを行う

Primary

Secondary

Secondary

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

レプリカセット

Repreca-Master

Repreca-Slave

Repreca-Slave

書込

複製

Client-App

Driver

読取

oplogoplog

oplog

oplog

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

レプリカセット(マスター交代)

Repreca-Master

Repreca-Master

Repreca-Slave書込

複製

Client-App

Driver

読取

oplogoplog

oplogoplog

oplogoplog

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

障害発生時のoplog

• 交代したプライマリと生きているセカンダリのoplogは先へ進んでいく

!

• 停止中の元プライマリのoplogはもちろん止まったまま

元Primary (停止中)

現Primary

Secondary

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

レプリカセット(リカバリ中)

Repreca-Slave (リカバリ中)

Repreca-Master

Repreca-Slave書込

複製

Client-App

Driver

読取

!

追いつくまで複製 もしくはフルコピー

oplogoplog

oplogoplog

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

障害回復時のoplog(1)

• 回復したセカンダリが、現プライマリのoplogを見て追いついていく

Secondary

現Primary

Secondary

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

障害回復時のoplog(2)• 障害が長く続き、現プライマリのoplogと回復したセカンダリのoplogがオーバーラップしなくなってしまった場合

• 仕方ないので自動的にfull syncに移行する

• こうなると時間も負荷もかかるので、oplogの期間設定やファイルベースのバックアップ間隔は重要

Secondary

現Primary

Secondary

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

レプリカセット(リカバリ後)

Repreca-Slave

Repreca-Master

Repreca-Slave書込

複製

Client-App

Driver

読取

!

複製 oplogoplog

oplogoplog

oplogoplog

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

レプリカセット(バックアップのコストダウン)

Repreca-Master (インデックスあり)

Repreca-Slave (インデックスあり)

Repreca-Slave (バックアップ)

書込

複製

Client-App

Driver

読取

バックアップ用のインスタンスにはインデックスを付けず、非力なマシンで済ませる

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

レプリカセット (誤操作、バグ対策)

Repreca-Master (インデックスあり)

Repreca-Slave (インデックスあり)

Repreca-Slave (バックアップ)

書込

複製

Client-App

Driver

読取

Repreca-Slave (delayed)

指定した時間遅らせて複製。 誤操作によるデータ消去

などの対策

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

DC-2DC-1

レプリカセット(DC間での分散)

Repreca-Master

Repreca-Slave

Repreca-Slave

書込

複製

Client-App

Driver

読取

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

レプリカセットのまとめ

• 読み取り負荷の分散

• 耐障害性

• 自動フェイルオーバー & リカバリ

• 多彩なトレードオフ

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

シャーディング•書き込み負荷を1/nに

• メモリ量をn倍に

• パフォーマンスは上がる

•障害は起きやすくなる→レプリカセットと併用

Client-App

Driver

mongos

mongod for あかさたな

mongod for はまやらわ

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

やっと バックアップとリストアの話

注)今回、ユーザー認証とかロールの話は、 時間ないのであえてすっ飛ばします

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

ここ参照• P.288~

• 基本的になるのは2つの方法

• データベースファイル+ジャーナルファイルを直接バックアップ・リストア

• ツールを使ってダンプ・リストア

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

特徴的なこと

• そもそもトランザクションが(ほとんど)ないので、大きなトランザクションのロールフォワードを考える必要がない→楽ちん(実はアプリとのトレードオフなわけですが)

• レプリカセットは重要

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

公式ドキュメントのシナリオ• ファイルシステムのスナップショットによるバックアップとリストア

• バックアップからのレプリカセットのリストア

• MongoDBのツールを使ったバックアップとリストア

• シャードクラスタのバックアップとリストア

• 予想外のシャットダウンからのデータリカバリ

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

ファイルシステムのスナップショットによるバックアップとリストア• 普通にデータベースファイルをバックアップ/リストアするのと同じ。

• ただし、OSのスナップショット機能を前提として考えた方がよさそう

• メインのデータがあるディスクでジャーナリングしている場合、わりと単純

• ジャーナリングをしていない場合、あるいはジャーナルが別ディスクの場合

• db.fsyncLock()でファイルの整合性を保障(ただしバグっているらしい…)

• レプリカセットのセカンダリを使うという手もある

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

バックアップからのレプリカセットのリストア• 想定されるシナリオ:

• 初期データセットの実働環境のレプリカセットへの展開

• バックアップデータセットからのレプリカセット再構築

• まずレプリカセットのプライマリにバックアップデータをリストア

• データが少なければ、そこから空のセカンダリへ同期

• データが多ければ、セカンダリにセカンダリのバックアップをリストアして同期

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

MongoDBのツールを使ったバックアップとリストア

• mongodumpとmongorestore

• ドキュメントレベルでのリストアになるので、インデックスは再構築になる → 時間かかるので要注意

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

シャードクラスタのバックアップとリストア• 小規模なシャードクラスタ(根本的に矛盾してますが)なら、普通にツールでバックアップ/リストア

• 通常は、シャード毎にバックアップ/リストアを行うことになる(難易度アップ)

• ただし、シャードの境界は動的に変わるので、そこの対処はケースバイケース

• 出て行ったドキュメントは無視してOK

• バックアップ→リストアの間に当該シャードに入ってきたドキュメントがあった場合は、「どうにかして」対処が必要

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

予想外のシャットダウンからのデータリカバリ

• ジャーナリング無効 & 単独インスタンスで、クリーンにシャットダウンされなかった場合、データファイルの破損の可能性があるので、リペアの手順を踏むこと

• シリアスな運用であれば、ジャーナリングを有効にするか、レプリカセットを使うべきです

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

改善継続中 - 2.6以降について少し• 最新バージョンは2.6系

• aggregation framework - サイズの制約の緩和

• Write protocolの改善 - レイテンシの低減

• Index Intersection - 複数インデクスの同時活用のはず…

• 2.8/3.0はかなり大規模なアップデートになる模様

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

まとめ

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

今日話したこと• 運用についてはドキュメントをきっちり読見ましょう • この本に基本は書かれています。概要把握にどうぞ。 • 電子書籍もあります。 • http://www.oreilly.co.jp/books/

9784873115900/ • そのほかにもMongoDB関連の電子書籍があるの

で、オライリージャパンのサイトで検索を。

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

それはともかく• 簡単に始められて

• かなり深く使うこともできます

• ただし落とし穴もあります→コミュニティへどうぞ! http://www.mongodb.jp

• まずは手を動かしてみましょう!

• レプリカセットをお手軽に試せます:

• https://bitbucket.org/tamagawa_ryuji/mongodb_replicaset_playground_on_vagrant

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

ご清聴ありがとうございました。