C10K on Mongo's sharding

3,635 views

Published on

C10K on Mongo's sharding

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

×