39
Replication, Sharding, MapReduce 「第1回分散処理ワークショップ in Tokyo」 #dist_study doryokujin

MongoDB: Replication,Sharding,MapReduce

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: MongoDB: Replication,Sharding,MapReduce

Replication, Sharding, MapReduce

「第1回分散処理ワークショップ in Tokyo」#dist_study

doryokujin

Page 2: MongoDB: Replication,Sharding,MapReduce

[名前] doryokujin ( 井上 敬浩 )

[年齢] 26歳

[専攻] 数学修士(統計・確率的アルゴリズム)

[会社] 芸者東京エンターテインメント(GTE)

[職業] データマイニングエンジニア

[趣味] マラソン ( 42.195km: 2時間33分 )

[コミュニティ]

・MongoDB JP 代表: もっとMongoDBを日本に!

・TokyoWebMining 運営: 統計解析・データマイニングの各種方法論、WEBデータ活用に関する勉強会

・おしゃれStatistics 運営: 名著「statistics」を読み進めながら統計を学ぶ勉強会

自己紹介

Page 3: MongoDB: Replication,Sharding,MapReduce

1. イントロダクション

2. Replication

3. + Sharding

4. + MapReduce

アジェンダ

Page 4: MongoDB: Replication,Sharding,MapReduce

1. イントロダクション

Page 5: MongoDB: Replication,Sharding,MapReduce

[開発元] 10gen http://www.10gen.com/

[実装] C++

[OS] Linux, Mac, Windows, Solaris

[由来] “Humongous”(ばかでかい)amounts of data

[ライセンス] ・Database: GNU AGPL v3.0 License・Drivers: Apache License v2.0

イントロダクション

Page 6: MongoDB: Replication,Sharding,MapReduce

Production Deployments

Page 7: MongoDB: Replication,Sharding,MapReduce

[Mongo system]

database の集合

[database]

collection の集合

[collection]

document の集合

[document]

field の集合

[field]

key-value のペア

[key]

name (string)

[value]

value (string, integer, float, timestamp, binary, document, array)

MongoDBデータモデル

Page 8: MongoDB: Replication,Sharding,MapReduce

MongoDB System (mongod, mongos)

Database

Document

Document

Document

Document

Document

Document

Document

Document

Collection

MongoDB データモデル

Database

CollectionCollection Collection

Page 9: MongoDB: Replication,Sharding,MapReduce

{

"_id" : ObjectId("4dcd3ebc9278000000005158"),

"timestamp" : ISODate("2011-05-13T14:22:46.777Z"),

"binary" : BinData(0,""),

"string" : "abc",

"number" : 3,

"subobj" : {"subA": 1, "subB": 2 },

"array" : [1, 2, 3],

"dbref" : [_id1, _id2, _id3]

}

padding

Page 10: MongoDB: Replication,Sharding,MapReduce

{

"_id" : ObjectId("4dcd3ebc9278000000005158"),

"timestamp" : ISODate("2011-05-13T14:22:46.777Z"),

"binary" : BinData(0,""),

"string" : "abc",

"number" : 3,

"subobj" : {"subA": 1, "subB": 2 },

"array" : [1, 2, 3],

"dbref" : [_id1, _id2, _id3]

}

db.coll.find({"number": 3});

db.coll.find({"number": {$gt: 1}});

db.coll.find({"subobj.subA": 1});

db.coll.find({"subobj.subB": {$exists: true} });

db.coll.find({"string": "abc"});

db.coll.find({ "string" : /^a.*$/i });

padding

db.coll.find({"array": {$all:[1, 2]} });

db.coll.find({"array": {$in:[2, 4, 6]} });

Query

Page 11: MongoDB: Replication,Sharding,MapReduce

{

"_id" : ObjectId("4dcd3ebc9278000000005158"),

"timestamp" : ISODate("2011-05-13T14:22:46.777Z"),

"binary" : BinData(0,""),

"string" : "def",

"number" : 4,

"subobj" : {"subA": 1, "subB": 2 },

"array" : [1, 2, 3, 4, 5, 6],

"dbref" : [_id1, _id2, _id3]

"newkey" : "In-place"

}

{ $inc : {"number": 1} }

{ $set : {"string": "def"} }

{ $pull : {"subobj": {"subB": 2 } } }

{ $addToSet : { "array" : { $each : [ 4 , 5 , 6 ] } } }

{ $set : {"newkey": "In-place"} }

Update

Page 12: MongoDB: Replication,Sharding,MapReduce

2. Replication

Page 13: MongoDB: Replication,Sharding,MapReduce

・1 Primary + N Secondary

・i.e. Write は Primary のみ

・Read はオプションで Secondary からも ( “Read Scaling” )

・自動フェイルオーバー

・書き込みオペレーション自身はOplogに記録され、Secondaryが定期的に最新オペレーションを取得&実行

1. Replica Set

Page 14: MongoDB: Replication,Sharding,MapReduce

[自動フェイルオーバー]

Sync

SyncSync

1. Current Primary

Replica Set

Member2 Secondary

Member1 Primary

Member4 Secondary

Member3 Secondary

Page 15: MongoDB: Replication,Sharding,MapReduce

[自動フェイルオーバー]2. Primary Down

Replica Set

Member2 Secondary

Member1 Primary

Member4 Secondary

Member3 Secondary

Page 16: MongoDB: Replication,Sharding,MapReduce

[自動フェイルオーバー]3. Election Time

Negotiate

Negotiate

Negotiate

Replica Set

Member2 Secondary

Member1 Primary

Member4 Secondary

Member3 Secondary

Page 17: MongoDB: Replication,Sharding,MapReduce

[自動フェイルオーバー]4. New Primary

Sync

Sync

primary 選出基準1. priority 値が最大2. primary との最終同期が最新3. votes 値が高い

Replica Set 矛盾が起こらないように他のメンバーにあって、新Primaryにないデータは削除

Member2 Secondary

Member4 Secondary

Member3 Secondary Sync

Page 18: MongoDB: Replication,Sharding,MapReduce

Replica Set

Member1 Primary

Member3 Secondary

Member2 Secondary

Member4 Secondary

Member6 Secondary

Member5 Secondary

[Network Partition]

Page 19: MongoDB: Replication,Sharding,MapReduce

Replica Set

Member1 Primary

Member3 Secondary

Member2 Secondary

Member4 Secondary

Member6 Secondary

Member5 Secondary

Negotiate

[Network Partition]

Page 20: MongoDB: Replication,Sharding,MapReduce

Replica Set過半数以下のメンバーでは誰もPrimaryになれない Member1

Primary

Member3 Secondary

Member2 Secondary

Member4 Secondary

Member6 Secondary

Member5 Secondary

Page 21: MongoDB: Replication,Sharding,MapReduce

3. Sharding

Page 22: MongoDB: Replication,Sharding,MapReduce

・GFS データディストリビューションモデル

・document への書き込み・読み込みはすべてルーティングサーバーである mongos を介する

・バックグラウンドでの自動ロードバランシング

・ダイナミックな shard 追加: その際に均等分散するようにデータの再配置が行われる

・Shard Key を条件にしたクエリは該当する Shard にしかスキャンを行わない

Sharding

Page 23: MongoDB: Replication,Sharding,MapReduce

・データの分割はドキュメント内の特定のフィールドキーに従う

・それを Shard Key と呼び、環境構築時に設定(変更不可能)

・ドキュメントは必ずShard Keyを含んでいないといけない

・各 Shard 内のデータはShard Keyの値の、互いに重複しない範囲を持つ Chunk と呼ばれる単位で分割・移動・削除などが行われる

・Shard 間の偏りとは、Chunkの数が一部に偏る事

Shard Key

Page 24: MongoDB: Replication,Sharding,MapReduce

Chunkと呼ばれるデータの集合単位。 連続した範囲のデータ集合。新しい データは Shard Keyの値がChunkの 範囲内にある所に入る。デフォルトで は200MBを超える度に分割が起こる。

Page 25: MongoDB: Replication,Sharding,MapReduce

config Servers (Shard Configration)

mongos Servers (Routers)

Shard Servers (Data)

[ a, f )

[ f, k )

[ k, n)

[ n, o )

[ o, t )

[ t, } )

shard1 shard2 shard3

Chunk

Cluster

Sharding を構成するサーバー

Page 26: MongoDB: Replication,Sharding,MapReduce

Replica Set + Sharding

http://www.mongodb.org/display/DOCS/Introduction

replica set

Page 27: MongoDB: Replication,Sharding,MapReduce

クライアントのアクセスは 必ず mongos に対して行う

該当データのある Shard にのみ クエリの送出・データの取得を行う

cinfig サーバーから Shard に関する情報を取得する

各Shardごとに書き込み先は1つ

( mongosがprimaryを自動選択 )

primary primary

primary

primary

Replica Set + Sharding

http://www.mongodb.org/display/DOCS/Introduction

replica set

Page 28: MongoDB: Replication,Sharding,MapReduce

自動 Load Balancing

[ a, f )

shard1 shard2

[ f, k )

[ n, o )

[ k, n)

[ o, t)

[ 0, 9)

[ a, f )

shard1 shard2

[ f, k )

[ n, o )

[ k, n)

[ o, t)

[ 0, 9)

最大 Chunk 数を持つ Shardとの数の差が10コ(2GB)になった時点でChunkが5コ移動

before

after

Page 29: MongoDB: Replication,Sharding,MapReduce

CAP[CAP:CP (C > A)]

〇 Consistency(一貫性)

- 複数の Primary が存在する状況に決してならない

- ただしオプションにより Secondary からの読み込み可能(Eventual Consistency・Read Scaling)

× Availability(可用性)

- 過半数サーバーにアクセス不可能/一貫性を担保できない場合はクライアントからのアクセスを受け付けない(All Secondary)

※ SPOF は存在しない

Page 30: MongoDB: Replication,Sharding,MapReduce

・Q:Shard 数

・N:Shard ごとのコピー数 = Replica Set メンバー数

・W:書き込み時の整合性確保数

- i.e. 何台の書き込みが終了した時点で書き込みOKとするか

- デフォルトでは 0 ( Fire-and-Forget )

- オプションで任意に指定可能 ( W ≦ N )

・R:読み込み時の整合性確保数 ( R ≦ N )

- 読み込みレスポンスを返す前に確認する数

※ BigCouchではこれらのパラメータが default.ini に記述できる

Quorum

Page 31: MongoDB: Replication,Sharding,MapReduce

4. Map Reduce

Page 32: MongoDB: Replication,Sharding,MapReduce

・JavaScript ベースの Map Reduce を実行可

・ただし 1Core / Shard の制約

・Mapper 数 ≦ Shard 数 ≦ Chunk 数(Chunk単位での入力不可)

(対策)1サーバー内に Core の数だけ Shard サーバーを構築すればフルコアを活用できる

・クエリによって入力データをフィルタリングできるのはメリット

Map Reduce

Page 33: MongoDB: Replication,Sharding,MapReduce

N-Mapper-Combiner 1-Reduce“Primary”に指定した Shard

ResultCollection

3. Reduce

out option1. replace2. merge3. reduce(Inclement)4. memory

4. Result

※ N = Shard 数

※ Combiner = Reducer

※ Shuffle 無し

mongos1.ルーティング・指示

Shard1

2. Map Reduce

Shard2

2. Map Reduce

Shard3

2. Map Reduce

Shard4

2. Map Reduce

Shard5

2. Map Reduce

Shard6

Shard13. Reduce

2. Map Reduce

Page 34: MongoDB: Replication,Sharding,MapReduce

m = function(){

this.tags.forEach{

function(z) {

emit(z, {count: 1});

}

};

};

r = function(key, values) {

var total=0;

for (i=0, i<values.length, i++)

total += values[i].count;

return { count : total };

}

res=db.things.mapReduce(m,!r);

# クエリによるフィルタリングや finalize 処理も可能

Page 35: MongoDB: Replication,Sharding,MapReduce

Map Reduce: More Power !!

Page 36: MongoDB: Replication,Sharding,MapReduce

・Mongo-Hadoop Plugin (from 10gen)

- Chunk や Shard の数だけ mapper を立ち上げ可能

- Secondary からもインプット対応(と思われる)

- さらに Pig 対応も進んでいる

- Flume の sink に MongoDB を指定可能

github: mongodb / mongo-hadoop

Mongo - Hadoop

Page 37: MongoDB: Replication,Sharding,MapReduce

・v2.0 - 2.2 で新しい Aggregation Framework

- JavaScript → C++ implementation

- Pipeline オペレーション (Like shell pipeline)

- JavaScript に依存しない Map Reduce

MongoDB Aggregation MongoSF May 2011

New Aggregation Framework

Page 38: MongoDB: Replication,Sharding,MapReduce

・MongoDB は世界で大人気

・MongoDBは新たなMySQLなのか?

・SPOFを持たず、スケールアウトが容易なのは魅力

・ただし Sharding 環境では Consistency の問題などまだ未成熟。Map Reduce もまだまだ

・コミュニティ活動が活発なので今後の改善に大いに期待

・Hadoop との連携や新Aggregationフレームワークで強力なデータ処理が可能に

全体総括

Page 39: MongoDB: Replication,Sharding,MapReduce

ありがとうございました