初心者向けMongoDBのキホン!

23,024 views

Published on

初心者向けにMongoDBの基本を解説しています。
この資料は2014/3/1のOSC 2014 Tokyo/Springで発表しました 。
2015/3/3最新の情報で一部アップデートしました。
2015/7/15MongoDB ver3.0ようにちょっと修正しました。

Published in: Technology
0 Comments
90 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
23,024
On SlideShare
0
From Embeds
0
Number of Embeds
1,208
Actions
Shares
0
Downloads
215
Comments
0
Likes
90
Embeds 0
No embeds

No notes for slide

初心者向けMongoDBのキホン!

  1. 1. Begining MongoDB 初心者向け MongoDBのキホン! 渡部 徹太郎2014/03/01 OSC2014Tokyo/Spring Ver 3.0用に ちょっと修正 2015/7/15
  2. 2. 自己紹介 {"ID" :"fetaro" "名前" :"渡部 徹太郎" "経歴" :"学生時代は情報検索の研究(@日本データベース学会)" "仕事" :{"昔":"証券会社のオントレシステムのWeb基盤", "今":"オープンソース全般"} "特技":["サーバ基盤","Linux","KVM","ruby","MongoDB"] "エディタ":"emacs派" "趣味":"自宅サーバ" "MongoDB関連":{ -"3年前に、友人の結婚式用のアプリを作った時に利用" -"技評記事「MongoDBでゆるふわDB体験」" -"日経SYSTEMS 8月号 「ドキュメント指向データベース」" } } 2
  3. 3. 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 オンラインで データ操作 バッチで 分析・集計 スキーマあり&非ビックデー タ スキーマレス & ビックデータ
  4. 4. 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
  5. 5. 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 } ] } 配列 ハッシュの配列 キーと値 ハッシュ
  6. 6. MongoDBの位置づけ(3/3) 6  ドキュメント指向データベースの比較 MongoDB CouchDB Couchbase Server データ構造 データベース └コレクション └ドキュメント データベース └ドキュメント バケット └ドキュメント インデックスの 生成 インデックスを張りたいキーを指定 する MapReduce関数を用いたビューを作成することで対 応 クエリー 動的クエリ。SQLライクな記述が 可能。 基本的なCRUD以外は、静的クエリ。上記 MapReduceで作成したビューへのアクセスがクエリ にあたる。 主なインター フェース 独自プロトコル。各言語用専用ドラ イバを利用。 REST(HTTP) memcachedプロトコル レプリケーショ ン シングルマスタ型レプリケーション (1ノードにしか書き込めない) マルチマスタ型レプリケーション (複数ノードに書き込める) 開発言語 C++ Erlang C,C++,Erlang
  7. 7. MongoDBの特徴(1/8) • MongoDBを一言でいうと o RDBMSとKVSの中間 o MongoDBの特徴 7 水平分散 スキーマレス 多機能 リッチなデータ レプリケーション 使いやすい柔軟なクエリ KVSと 比較して RDBMSと 比較して MongoDBならでは 機能数 スケーラビリティ 水平分散能力 KVS RDBMS MongoDB 水平分散できて、 機能も多い
  8. 8. 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
  9. 9. MongoDBの特徴(3/8) • . o 表現力豊かなクエリ  SQLの文法に似せたクエリが扱いやすい。  動的に作成可能。事前に定義不要。  単純な条件検索だけでなく、集計等の高度なクエリも書ける。 o RDBMS以上に強力なインデックス  セカンダリインデックス:主キー以外でインデックスを作成可能  複合キーインデックス:複数のキーでインデックスを作成可能  マルチキーインデックス:配列の要素に対してインデックス作成可 能 9 db.person.find( {"name":"watanabe","age": 30 } ).limit(3) 例)コレクションpersonに、“name”が“watanabe”で、 “age”が30のドキュメントを3つだけ取得したい 柔軟なクエリ
  10. 10. MongoDBの特徴(4/8) • . o 水平分散(シャーディング)が簡単  キーによってデータをノードに分散することができる。また、 ノードを動的に追加し、データの自動バランシング機能もあ る。 10 範囲 0-9 範囲10-19 範囲20- x ドキュメント チャン ク アプリケーション mongosルータ 1 4 9 11 16 20 27 MongoDB ドライバ 23 23 クエリを適切な ノードに分散 シャードキーで 分散 ノード ノード ノード シャードキー 水平分散
  11. 11. ドキュメント 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ドライバ 書き込み 読み込み読み込み プライマリが障 害になったら、 プライマリノード を選出し、自動 フェイルオーバ レプリカセット レプリケーション
  12. 12. MongoDBの特徴(6/8) o レプリケーションとシャーディングを組み合わせて、負荷分散と冗長化を両立 12 マシン2 マシン3 マシン1プライマリ データ1 セカンダリ データ1 セカンダリ データ1 レプリカセット セカンダリ データ2 プライマリ データ2 セカンダリ データ2 レプリカセッ ト セカンダリ データ3 セカンダリ データ3 プライマリ データ3 レプリカセット mongosルータ 負荷分散 冗 長 化 アプリケーション
  13. 13. MongoDBの特徴(6/8) o レプリケーションとシャーディングを組み合わせて、負荷分散と冗長化を両立 13 マシン2 マシン3 マシン1プライマリ データ1 セカンダリ データ1 セカンダリ データ1 レプリカセット セカンダリ データ2 プライマリ データ2 セカンダリ データ2 レプリカセッ ト セカンダリ データ3 セカンダリ データ3 プライマリ データ3 レプリカセット mongosルータ アプリケーション
  14. 14. MongoDBの特徴(7/8) • o スキーマレスデータを扱える o テーブル定義など無しに、すぐにデータをCRUDできる • o セットアップが非常に簡単  OS毎にバイナリがあるため、ライブラリの追加インストール不要。  起動までわずか3ステップ。 • OS毎のバイナリをダウンロード • データディレクトリを作成 • 起動 o RDBMSを使っていた人が使いやすいように作られている  データベース>テーブル(コレクション)>ドキュメント というデータ構造  SQLとMongoクエリ言語は大部分マッピング可能  インデックスもSQLと同じような宣言ができる o 豊富なドキュメント・ノウハウ  英語ではあるが公式ドキュメントは他のNOSQLに比べても豊富  多くの人が使っているため、ノウハウが豊富。日本語のノウハウも多い。 14 使いやすい スキーマレス
  15. 15. 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により、座標に近 い点を検索
  16. 16. 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から与えられるだけ使う ○ 肥大化するドキュメントの 扱い × ドキュメントが肥大化する と、物理的な移動が必要 △ アルゴリズムの変更によ り、以前ほど発生しなく なった ○ 肥大化しても移動は発生 しない
  17. 17. 使ってみよう • コマンドメモ # インストール # ダウンロードページ 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
  18. 18. プログラミング言語から使う場合 • mongoshellと同じ使い勝手です • rubyの例 18
  19. 19. MongoDBを使う上での注意点 • トランザクションが無い o MongoDBが複数のドキュメントを一貫性をもって更新する事ができな い o ミッションクリティカルで複数のテーブルの更新を保証しなければな らないようなシステムでは、利用してはならない。 • 外部キー・結合が無い o 他のドキュメントへの参照はアプリケーションで実装する必要がある。 o 当然ながら、外部キー制約もないため、テーブル間の整合性が重要な システムには向いていない。 o 複数のドキュメントの内容を結合して取得することはできない。 • スキーマが無い o どのようなキー名でデータが入っているかわからない。データ型もわ からない。 o データ登録間違えの際にエラーが発生しない。 o 設計書を厳格に管理しないと、どのようなデータが入っているかわか らなくなり、保守性の低下を招く恐れがある。 19
  20. 20. MongoDBの使いどころ • 使いどころ、ユースケースしては「がっつりMongoDB事例紹介」の方を参 照ください。 • http://www.slideshare.net/tetsutarowatanabe/mongodb-32964238 20
  21. 21. 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

×