Top Banner
MongoDB sharding C10Kとの戦い
49

C10K on Mongo's sharding

Jan 15, 2015

Download

Documents

Hiroaki Kubota

 
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: C10K on Mongo's sharding

MongoDB shardingC10Kとの戦い

Page 2: C10K on Mongo's sharding

-2 -

Shardingおさらい

Page 3: C10K on Mongo's sharding

-3 -

Simple case

shard1

mongod

shard2

client host

httpd httpd httpd httpd

mongosmongos

httpd httpd httpd

server

client

Page 4: C10K on Mongo's sharding

-4 -

Simple case

shard1

mongod

shard2

client host

httpd httpd httpd httpd

mongosmongos

httpd httpd httpd

server

client

Give me DATA_A !

Page 5: C10K on Mongo's sharding

-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 !

Page 6: C10K on Mongo's sharding

-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 !

Page 7: C10K on Mongo's sharding

-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 !

Page 8: C10K on Mongo's sharding

-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.

Page 9: C10K on Mongo's sharding

-9 -

Simple case

shard1

mongod

shard2

client host

httpd httpd httpd httpd

mongosmongos

httpd httpd httpd

server

clientThis is DATA_A.

Page 10: C10K on Mongo's sharding

-10 -

Connection pool

Page 11: C10K on Mongo's sharding

-11 -

Connection pool

shard1

mongod

shard2

client host

httpd httpd httpd httpd

mongosmongos

httpd httpd httpd

server

client

Used connection is pooled !

Page 12: C10K on Mongo's sharding

-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 !

Page 13: C10K on Mongo's sharding

-13 -

Connection pool

shard1

mongod

shard2

client host

httpd httpd httpd httpd

mongosmongos

httpd httpd httpd

server

client

Give me DATA_A !

shard1のコネクションが再利用できそう

Page 14: C10K on Mongo's sharding

-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 !

Page 15: C10K on Mongo's sharding

-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.

Page 16: C10K on Mongo's sharding

-16 -

Connection pool

shard1

mongod

shard2

client host

httpd httpd httpd httpd

mongosmongos

httpd httpd httpd

server

client

This is DATA_A.

Page 17: C10K on Mongo's sharding

-17 -

New connection

Page 18: C10K on Mongo's sharding

-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 !

Page 19: C10K on Mongo's sharding

-19 -

Busy case

shard1

mongod

shard2

client host

httpd httpd httpd httpd

mongosmongos

httpd httpd httpd

server

client

Give me DATA_A !

shard1 へのコネクションは既にあるが 今は利用中で使えない!

なので新たに1本コネクションを張る

Page 20: C10K on Mongo's sharding

-20 -

Busy case

shard1

mongod

shard2

client host

httpd httpd httpd httpd

mongosmongos

httpd httpd httpd

server

client

Page 21: C10K on Mongo's sharding

-21 -

recapitulation

■ mongosの役割● mongsはクエリーをプロキシし問題を解決してくれる。● スター型接続になるのでC10K対策にもなる。● mongos - mongod(shard)間のコネクションをプールし性能向上● プールするコネクション数は最大同時クエリー数(+α)

α = mongodの生死チェックの為のコネクションも別途張る

  

Page 22: C10K on Mongo's sharding

-22 -

recapitulation

■ mongosの役割● mongsはクエリーをプロキシし問題を解決してくれる。● スター型接続になるのでC10K対策にもなる。● mongos - mongod(shard)間のコネクションをプールし性能向上● プールするコネクション数は最大同時クエリー数(+α)

α = mongodの生死チェックの為のコネクションも別途張る

いい感じジャン!  

Page 23: C10K on Mongo's sharding

-23 -

戦いが始まる...

Page 24: C10K on Mongo's sharding

-24 -

お客が増えたら?

Page 25: C10K on Mongo's sharding

-25 -

There are alot of clients

shard1

mongod

shard2

client host

httpd httpd httpd httpd

mongosmongos

httpd httpd httpd

server

client

Page 26: C10K on Mongo's sharding

-26 -

レプリカ無いと怖いよね...

Page 27: C10K on Mongo's sharding

-27 -

Keep availability !

shard1

mongod mongod mongod

shard2

client host

httpd httpd httpd httpd

mongosmongos

httpd httpd httpd

server

client

Page 28: C10K on Mongo's sharding

-28 -

やっぱshard足んね...

Page 29: C10K on Mongo's sharding

-29 -

shard3 shard4 shard5

Enough ?

shard1

mongod mongod mongod

shard2

client host

httpd httpd httpd httpd

mongosmongos

httpd httpd httpd

server

client

Page 30: C10K on Mongo's sharding

-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強妥当な設計ではあるが安心はできない

Page 31: C10K on Mongo's sharding

-31 -

コネクション数爆発

Page 32: C10K on Mongo's sharding

-32 -

Connection inflation

shard1

mongod

shard2

client host

httpd

mongosmongos

server

client

Give me DATA_A !

Page 33: C10K on Mongo's sharding

-33 -

shard1

mongod

shard2

client host

httpd

mongosmongos

server

client

Give me DATA_A !

Connection inflation

Give me DATA_A !

Page 34: C10K on Mongo's sharding

-34 -

shard1

mongod

shard2

client host

httpd

mongosmongos

server

client

Time out (TT;

Give me DATA_A !

Connection inflation

Page 35: C10K on Mongo's sharding

-35 -

shard1

mongod

shard2

client host

httpd

mongosmongos

server

client

Give me DATA_A !!!

Give me DATA_A !

前回使ったshard1へのコネクションはまだ使えない なので新たに1本コネクションを張る必要がある

Connection inflation

Page 36: C10K on Mongo's sharding

-36 -

shard1

mongod

shard2

client host

httpd

mongosmongos

server

client

Give me DATA_A !Give me DATA_A !

Connection inflation

Give me DATA_A !!!

Page 37: C10K on Mongo's sharding

-37 -

shard1

mongod

shard2

client host

httpd

mongosmongos

server

client

Give me DATA_A !

Connection inflation

Time out (TT;

Give me DATA_A !

Page 38: C10K on Mongo's sharding

-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倍

                                             

                              

Page 39: C10K on Mongo's sharding

-39 -

Connection数が爆発1クライアントでもmongos-mongod間のコネクション数を大量に消費するケースがある。

どの分散システムにも言えるし接続数に限った話でもないが、

                                             

                              

Page 40: C10K on Mongo's sharding

-40 -

Connection数が爆発1クライアントでもmongos-mongod間のコネクション数を大量に消費するケースがある。

どの分散システムにも言えるし接続数に限った話でもないが、

エラー時のリトライ禁止!  ちょっぴり負荷が掛かり始めたシステムを

みんなで袋叩きして殺してしまう・・・

リトライして解決なら最初からクライアントが対応してるって。。。

Page 41: C10K on Mongo's sharding

-41 -

How to operate sharding■ 危険なケース

● ピーク時間帯に断続的にslow queryが起きている● クライアントが多く通常時のコネクション数がギリギリだ● リトライしている

  これらのケースでは障害に至る可能性が特に高い

また明示的なリトライをせずとも、client - mongos間でTIMEOUTしたクエリーで利用したmongos - mongod間コネクションは即座に再利用できない。

     接続数を完全に見積もり切る事は困難

Page 42: C10K on Mongo's sharding

-42 -

How to operate sharding■ mongs - mongod コネクションプールの問題

● mongos - mongod間の接続数を制御する手段が無い--maxConnsオプションはclient - mongos間のコネクションを扱っている

● mongosは定期的に不必要なコネクションプールを回収するが  30分以上使われなかったコネクション限定(hardcode)

  瞬間負荷で張ったコネクションを長時間保持し続けてしまう

結局、本来必要ない接続を張ってしまう。

最大接続数20000という厳しい制限の元この手の無駄はシステムのスケーラビリティを大きく下げる!!

Page 43: C10K on Mongo's sharding

-43 -

How to operate sharding

■ 接続数不足の対策● 不必要なクライアントを排除

安易にapache MAX_CLIENT=1000とかやらない!(結局普通のアプリはそんなに食えない)

  通常時mongodの接続数が7000位が安全ギリギリ

● リトライ処理をやめる システム保全の方が大事!そもそもリトライが成功する確率も低い。

● slow query抑止のチューニング– table scan禁止 (--notablescan)

– M/R 禁止– ピーク時の書き込みを抑止(各種ファイルpreallocateが一番怖い)– shard増やす– etc...

Page 44: C10K on Mongo's sharding

-44 -

        それでもダメなら、、、

奥の手だ!

Page 45: C10K on Mongo's sharding

-45 -

hack

Page 46: C10K on Mongo's sharding

-46 -

Page 47: C10K on Mongo's sharding

-47 -

Page 48: C10K on Mongo's sharding

-48 -

パッチ解説■ 不要コネクションを回収するタイミングを修正

● 1800秒固定→オプションで指定可能● コネクションプール数の最大値を指定可能 必要なコネクションは張るが、指定値以上はプールしなくなる

最小値も指定出来た方が良いんだろうか? とりあえず今のところ必要なさそう

Page 49: C10K on Mongo's sharding

-49 -

補足

■パッチ

https://github.com/crumbjp/mongo/commit/b4a424fe02d7b5410db364b2d71f11ce09fd3fc3

■C10K と スター型接続

http://www.slideshare.net/crumbjp/cockatoo(39p~)