Upload
takahiro-inoue
View
3.464
Download
1
Embed Size (px)
DESCRIPTION
Citation preview
Replication, Sharding, MapReduce
「第1回分散処理ワークショップ in Tokyo」#dist_study
doryokujin
[名前] doryokujin ( 井上 敬浩 )
[年齢] 26歳
[専攻] 数学修士(統計・確率的アルゴリズム)
[会社] 芸者東京エンターテインメント(GTE)
[職業] データマイニングエンジニア
[趣味] マラソン ( 42.195km: 2時間33分 )
[コミュニティ]
・MongoDB JP 代表: もっとMongoDBを日本に!
・TokyoWebMining 運営: 統計解析・データマイニングの各種方法論、WEBデータ活用に関する勉強会
・おしゃれStatistics 運営: 名著「statistics」を読み進めながら統計を学ぶ勉強会
自己紹介
1. イントロダクション
2. Replication
3. + Sharding
4. + MapReduce
アジェンダ
1. イントロダクション
[開発元] 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
イントロダクション
Production Deployments
[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データモデル
MongoDB System (mongod, mongos)
Database
Document
Document
Document
Document
Document
Document
Document
Document
Collection
MongoDB データモデル
Database
CollectionCollection Collection
{
"_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
{
"_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
{
"_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
2. Replication
・1 Primary + N Secondary
・i.e. Write は Primary のみ
・Read はオプションで Secondary からも ( “Read Scaling” )
・自動フェイルオーバー
・書き込みオペレーション自身はOplogに記録され、Secondaryが定期的に最新オペレーションを取得&実行
1. Replica Set
[自動フェイルオーバー]
Sync
SyncSync
1. Current Primary
Replica Set
Member2 Secondary
Member1 Primary
Member4 Secondary
Member3 Secondary
[自動フェイルオーバー]2. Primary Down
Replica Set
Member2 Secondary
Member1 Primary
Member4 Secondary
Member3 Secondary
[自動フェイルオーバー]3. Election Time
Negotiate
Negotiate
Negotiate
Replica Set
Member2 Secondary
Member1 Primary
Member4 Secondary
Member3 Secondary
[自動フェイルオーバー]4. New Primary
Sync
Sync
primary 選出基準1. priority 値が最大2. primary との最終同期が最新3. votes 値が高い
Replica Set 矛盾が起こらないように他のメンバーにあって、新Primaryにないデータは削除
Member2 Secondary
Member4 Secondary
Member3 Secondary Sync
Replica Set
Member1 Primary
Member3 Secondary
Member2 Secondary
Member4 Secondary
Member6 Secondary
Member5 Secondary
[Network Partition]
Replica Set
Member1 Primary
Member3 Secondary
Member2 Secondary
Member4 Secondary
Member6 Secondary
Member5 Secondary
Negotiate
[Network Partition]
Replica Set過半数以下のメンバーでは誰もPrimaryになれない Member1
Primary
Member3 Secondary
Member2 Secondary
Member4 Secondary
Member6 Secondary
Member5 Secondary
3. Sharding
・GFS データディストリビューションモデル
・document への書き込み・読み込みはすべてルーティングサーバーである mongos を介する
・バックグラウンドでの自動ロードバランシング
・ダイナミックな shard 追加: その際に均等分散するようにデータの再配置が行われる
・Shard Key を条件にしたクエリは該当する Shard にしかスキャンを行わない
Sharding
・データの分割はドキュメント内の特定のフィールドキーに従う
・それを Shard Key と呼び、環境構築時に設定(変更不可能)
・ドキュメントは必ずShard Keyを含んでいないといけない
・各 Shard 内のデータはShard Keyの値の、互いに重複しない範囲を持つ Chunk と呼ばれる単位で分割・移動・削除などが行われる
・Shard 間の偏りとは、Chunkの数が一部に偏る事
Shard Key
Chunkと呼ばれるデータの集合単位。 連続した範囲のデータ集合。新しい データは Shard Keyの値がChunkの 範囲内にある所に入る。デフォルトで は200MBを超える度に分割が起こる。
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 を構成するサーバー
Replica Set + Sharding
http://www.mongodb.org/display/DOCS/Introduction
replica set
クライアントのアクセスは 必ず mongos に対して行う
該当データのある Shard にのみ クエリの送出・データの取得を行う
cinfig サーバーから Shard に関する情報を取得する
各Shardごとに書き込み先は1つ
( mongosがprimaryを自動選択 )
primary primary
primary
primary
Replica Set + Sharding
http://www.mongodb.org/display/DOCS/Introduction
replica set
自動 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
CAP[CAP:CP (C > A)]
〇 Consistency(一貫性)
- 複数の Primary が存在する状況に決してならない
- ただしオプションにより Secondary からの読み込み可能(Eventual Consistency・Read Scaling)
× Availability(可用性)
- 過半数サーバーにアクセス不可能/一貫性を担保できない場合はクライアントからのアクセスを受け付けない(All Secondary)
※ SPOF は存在しない
・Q:Shard 数
・N:Shard ごとのコピー数 = Replica Set メンバー数
・W:書き込み時の整合性確保数
- i.e. 何台の書き込みが終了した時点で書き込みOKとするか
- デフォルトでは 0 ( Fire-and-Forget )
- オプションで任意に指定可能 ( W ≦ N )
・R:読み込み時の整合性確保数 ( R ≦ N )
- 読み込みレスポンスを返す前に確認する数
※ BigCouchではこれらのパラメータが default.ini に記述できる
Quorum
4. Map Reduce
・JavaScript ベースの Map Reduce を実行可
・ただし 1Core / Shard の制約
・Mapper 数 ≦ Shard 数 ≦ Chunk 数(Chunk単位での入力不可)
(対策)1サーバー内に Core の数だけ Shard サーバーを構築すればフルコアを活用できる
・クエリによって入力データをフィルタリングできるのはメリット
Map Reduce
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
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 処理も可能
Map Reduce: More Power !!
・Mongo-Hadoop Plugin (from 10gen)
- Chunk や Shard の数だけ mapper を立ち上げ可能
- Secondary からもインプット対応(と思われる)
- さらに Pig 対応も進んでいる
- Flume の sink に MongoDB を指定可能
github: mongodb / mongo-hadoop
Mongo - Hadoop
・v2.0 - 2.2 で新しい Aggregation Framework
- JavaScript → C++ implementation
- Pipeline オペレーション (Like shell pipeline)
- JavaScript に依存しない Map Reduce
MongoDB Aggregation MongoSF May 2011
New Aggregation Framework
・MongoDB は世界で大人気
・MongoDBは新たなMySQLなのか?
・SPOFを持たず、スケールアウトが容易なのは魅力
・ただし Sharding 環境では Consistency の問題などまだ未成熟。Map Reduce もまだまだ
・コミュニティ活動が活発なので今後の改善に大いに期待
・Hadoop との連携や新Aggregationフレームワークで強力なデータ処理が可能に
全体総括
ありがとうございました