c10k on mongo's sharding
DESCRIPTION
TRANSCRIPT
MongoDB shardingC10Kとの戦い
-2 -
Shardingおさらい
-3 -
Simple case
shard1
mongod
shard2
client host
httpd httpd httpd httpd
mongosmongos
httpd httpd httpd
server
client
-4 -
Simple case
shard1
mongod
shard2
client host
httpd httpd httpd httpd
mongosmongos
httpd httpd httpd
server
client
Give me DATA_A !
-5 -
Simple case
shard1
mongod
shard2
client host
httpd httpd httpd httpd
mongosmongos
httpd httpd httpd
server
client
Where is the DATA_A ?
Give me DATA_A !
-6 -
Simple case
shard1
mongod
shard2
client host
httpd httpd httpd httpd
mongosmongos
httpd httpd httpd
server
client
Give me DATA_A !
Shard1 is saving it !
-7 -
Simple case
shard1
mongod
shard2
client host
httpd httpd httpd httpd
mongosmongos
httpd httpd httpd
server
client
Give me DATA_A !
Give me DATA_A !
-8 -
Simple case
shard1
mongod
shard2
client host
httpd httpd httpd httpd
mongosmongos
httpd httpd httpd
server
client
Give me DATA_A !
This is DATA_A.
-9 -
Simple case
shard1
mongod
shard2
client host
httpd httpd httpd httpd
mongosmongos
httpd httpd httpd
server
clientThis is DATA_A.
-10 -
Connection pool
-11 -
Connection pool
shard1
mongod
shard2
client host
httpd httpd httpd httpd
mongosmongos
httpd httpd httpd
server
client
Used connection is pooled !
-12 -
Connection pool
shard1
mongod
shard2
client host
httpd httpd httpd httpd
mongosmongos
httpd httpd httpd
server
client
Give me DATA_A !
Used connection is pooled !
-13 -
Connection pool
shard1
mongod
shard2
client host
httpd httpd httpd httpd
mongosmongos
httpd httpd httpd
server
client
Give me DATA_A !
shard1のコネクションが再利用できそう
-14 -
Connection pool
shard1
mongod
shard2
client host
httpd httpd httpd httpd
mongosmongos
httpd httpd httpd
server
client
Give me DATA_A !
Give me DATA_A !
-15 -
Connection pool
shard1
mongod
shard2
client host
httpd httpd httpd httpd
mongosmongos
httpd httpd httpd
server
client
Give me DATA_A !
This is DATA_A.
-16 -
Connection pool
shard1
mongod
shard2
client host
httpd httpd httpd httpd
mongosmongos
httpd httpd httpd
server
client
This is DATA_A.
-17 -
New connection
-18 -
Busy case
shard1
mongod
shard2
client host
httpd httpd httpd httpd
mongosmongos
httpd httpd httpd
server
client
Give me DATA_A !
Give me DATA_A !
-19 -
Busy case
shard1
mongod
shard2
client host
httpd httpd httpd httpd
mongosmongos
httpd httpd httpd
server
client
Give me DATA_A !
shard1 へのコネクションは既にあるが 今は利用中で使えない!
なので新たに1本コネクションを張る
-20 -
Busy case
shard1
mongod
shard2
client host
httpd httpd httpd httpd
mongosmongos
httpd httpd httpd
server
client
-21 -
recapitulation
■ mongosの役割● mongsはクエリーをプロキシし問題を解決してくれる。● スター型接続になるのでC10K対策にもなる。● mongos - mongod(shard)間のコネクションをプールし性能向上● プールするコネクション数は最大同時クエリー数(+α)
α = mongodの生死チェックの為のコネクションも別途張る
-22 -
recapitulation
■ mongosの役割● mongsはクエリーをプロキシし問題を解決してくれる。● スター型接続になるのでC10K対策にもなる。● mongos - mongod(shard)間のコネクションをプールし性能向上● プールするコネクション数は最大同時クエリー数(+α)
α = mongodの生死チェックの為のコネクションも別途張る
いい感じジャン!
-23 -
戦いが始まる...
-24 -
お客が増えたら?
-25 -
There are alot of clients
shard1
mongod
shard2
client host
httpd httpd httpd httpd
mongosmongos
httpd httpd httpd
server
client
-26 -
レプリカ無いと怖いよね...
-27 -
Keep availability !
shard1
mongod mongod mongod
shard2
client host
httpd httpd httpd httpd
mongosmongos
httpd httpd httpd
server
client
-28 -
やっぱshard足んね...
-29 -
shard3 shard4 shard5
Enough ?
shard1
mongod mongod mongod
shard2
client host
httpd httpd httpd httpd
mongosmongos
httpd httpd httpd
server
client
-30 -
How to operate shardingそもそもshardingを組むという事はそれなりの規模のデータやトラフィックを扱っている
のでC10K対策は避けては通れない。
■Shardingシステムは
接続数の爆発との戦い!!!■mongod最大コネクション数 = 20000
● 制限値を超える接続は拒否されるので一発レッド(サービス停止)● 一見充分な値だが現在のWEBでは簡単に超え得る– PHP on apache(MAX_CLIENT=500) × 4台 がフル稼働で超える計算– 実際は5000クライアント程度でも簡単に超える。※後述
● 最近のLinuxのTCPバッファデフォルトサイズから考える read (rmem) = 16k , write (wmem) = 85k
101k × 20000 = 2G強妥当な設計ではあるが安心はできない
-31 -
コネクション数爆発
-32 -
Connection inflation
shard1
mongod
shard2
client host
httpd
mongosmongos
server
client
Give me DATA_A !
-33 -
shard1
mongod
shard2
client host
httpd
mongosmongos
server
client
Give me DATA_A !
Connection inflation
Give me DATA_A !
-34 -
shard1
mongod
shard2
client host
httpd
mongosmongos
server
client
Time out (TT;
Give me DATA_A !
Connection inflation
-35 -
shard1
mongod
shard2
client host
httpd
mongosmongos
server
client
Give me DATA_A !!!
Give me DATA_A !
前回使ったshard1へのコネクションはまだ使えない なので新たに1本コネクションを張る必要がある
Connection inflation
-36 -
shard1
mongod
shard2
client host
httpd
mongosmongos
server
client
Give me DATA_A !Give me DATA_A !
Connection inflation
Give me DATA_A !!!
-37 -
shard1
mongod
shard2
client host
httpd
mongosmongos
server
client
Give me DATA_A !
Connection inflation
Time out (TT;
Give me DATA_A !
-38 -
Connection inflation
shard1
mongod
shard2
client host
httpd
mongosmongos
server
client
Please give me DATA_A !!!!!!!
Give me DATA_A !Give me DATA_A !Give me DATA_A !
リトライ3回なら
3コネクション消費する
勿論mongodに掛ける負荷も3倍
-39 -
Connection数が爆発1クライアントでもmongos-mongod間のコネクション数を大量に消費するケースがある。
どの分散システムにも言えるし接続数に限った話でもないが、
-40 -
Connection数が爆発1クライアントでもmongos-mongod間のコネクション数を大量に消費するケースがある。
どの分散システムにも言えるし接続数に限った話でもないが、
エラー時のリトライ禁止! ちょっぴり負荷が掛かり始めたシステムを
みんなで袋叩きして殺してしまう・・・
リトライして解決なら最初からクライアントが対応してるって。。。
-41 -
How to operate sharding■ 危険なケース
● ピーク時間帯に断続的にslow queryが起きている● クライアントが多く通常時のコネクション数がギリギリだ● リトライしている
これらのケースでは障害に至る可能性が特に高い
また明示的なリトライをせずとも、client - mongos間でTIMEOUTしたクエリーで利用したmongos - mongod間コネクションは即座に再利用できない。
接続数を完全に見積もり切る事は困難
-42 -
How to operate sharding■ mongs - mongod コネクションプールの問題
● mongos - mongod間の接続数を制御する手段が無い--maxConnsオプションはclient - mongos間のコネクションを扱っている
● mongosは定期的に不必要なコネクションプールを回収するが 30分以上使われなかったコネクション限定(hardcode)
瞬間負荷で張ったコネクションを長時間保持し続けてしまう
結局、本来必要ない接続を張ってしまう。
最大接続数20000という厳しい制限の元この手の無駄はシステムのスケーラビリティを大きく下げる!!
-43 -
How to operate sharding
■ 接続数不足の対策● 不必要なクライアントを排除
安易にapache MAX_CLIENT=1000とかやらない!(結局普通のアプリはそんなに食えない)
通常時mongodの接続数が7000位が安全ギリギリ
● リトライ処理をやめる システム保全の方が大事!そもそもリトライが成功する確率も低い。
● slow query抑止のチューニング– table scan禁止 (--notablescan)
– M/R 禁止– ピーク時の書き込みを抑止(各種ファイルpreallocateが一番怖い)– shard増やす– etc...
-44 -
それでもダメなら、、、
奥の手だ!
-45 -
hack
-46 -
-47 -
-48 -
パッチ解説■ 不要コネクションを回収するタイミングを修正
● 1800秒固定→オプションで指定可能● コネクションプール数の最大値を指定可能 必要なコネクションは張るが、指定値以上はプールしなくなる
最小値も指定出来た方が良いんだろうか? とりあえず今のところ必要なさそう
-49 -
補足
■パッチ
https://github.com/crumbjp/mongo/commit/b4a424fe02d7b5410db364b2d71f11ce09fd3fc3
■C10K と スター型接続
http://www.slideshare.net/crumbjp/cockatoo(39p~)