モンストのサーバー負荷との戦い 〜あけおめ2018編〜 / bcu_30_server_9

モンストのサーバー負荷との戦い 〜あけおめ2018編〜 / bcu_30_server_9

スマホアプリ「モンスターストライク」のサーバー負荷は、年末年始に1年のピークを迎えます。2018年元旦のサーバー負荷に立ち向かうために実施した対策の一例として、データベースサーバー(MySQL)を安全に水平分割した事例を紹介します。見積もりから計画、実施に至るまでを時系列で振り返ります。

854998126372637ef90f52912253a8d5?s=128

kyohei hamada

April 21, 2018
Tweet

Transcript

  1. Ϟϯετͷαʔόʔෛՙͱͷઓ͍ ʙ͚͓͋Ί2018ฤʙ 2018/04/21 ୈ2ճ Battle Conference U30 XFLAG։ൃຊ෦ XFLAGࣄۀਪਐࣨ SREάϧʔϓ

    ඿ా ګฏ @haman29 גࣜձࣾϛΫγΟ
  2. About me •඿ా ګฏ @haman29 •https://twitter.com/haman29 •XFLAG ελδΦ SREάϧʔϓ •ओʹࠃ಺൛ϞϯελʔετϥΠΫʢ௨শɺϞϯετʣͷ։ൃɾӡ༻ɾෛՙରࡦ

    Λ୲౰ɻ •هࣄ •ʮhbstudyˌ76 SREେશ: XFLAG ελδΦฤʯͰൃද͠·ͨ͠ɻ (2017.8) •ΤϯδχΞͬͯڅྉԿʹ࢖ͬͯΔͷʁۚમࣄ৘ʹ͍͍ͭͯΖ͍Ζฉ͍͖ͯͨʛ CodeIQ MAGAZINE 3ਓ໨ (2016.3) •झຯ͸ϘϧμϦϯά 2
  3. ϞϯελʔετϥΠΫ • ௨শɺϞϯετ • εϚϗͰ༡΂ΔɺͻͬͺΓϋϯςΟϯάRPG • ੈքྦྷܭར༻ऀ਺͕4,500ສਓಥഁʢ2018.3ʣ • ࠃ಺൛ɾւ֎൛ͱ෼͔Ε͍ͯΔ 3

  4. ࠓ೔ͷ͓࿩ 4 • ࠃ಺൛Ϟϯετ • ຖ೥૿͑ଓ͚Δαʔόෛՙͱͷઓ͍ • DBαʔόͷਫฏ෼ׂʢShardingʣ

  5. 5 ϞϯετͷDBαʔό

  6. ϞϯετͷDBαʔό 6 • MySQLʢMariaDBʣ • શͯΦϯϓϨϛε • 2ڌ఺ͰDC৑௕ • શମͰ300୆΄ͲʢόοΫΞοϓؚΉʣ

    • ਨ௚෼ׂ • ਫฏ෼ׂʢShardingʣ
  7. 7 ೥຤೥࢝ͷαʔόෛՙ

  8. ೥຤೥࢝ͷαʔόෛՙ • ຖ೥ɺϐʔΫΛܴ͑Δ • ಛʹɺݩ୴0͔࣌Β࢝·ΔΨνϟΠϕϯτʢڧڧΩϟϥʣ • 2017೥ݩ୴0࣌ɺαʔόෛՙʹΑΓۓٸϝϯςφϯε • ΞϓϦ಺௨՟༻DBʢҎ߱ɺΦʔϒDBʣͰεϩʔΫΤϦ͕ଟൃ •

    ଞͷϘτϧωοΫ • 2018೥͸উ͍ͪͨʂʂ • νʔϜͰ࿈ܞɾ෼୲ͯ͠ෛՙରࡦΛਐΊΔ 8
  9. 9 ΦʔϒDB

  10. ΦʔϒDB • Φʔϒɹɹɹ ʹ Ϣʔβ༷ͷେࣄͳ͓ۚ • ਺ԯϨίʔυ • ϐʔΫ࣌ͷUpdateΫΤϦ͕਺ສqpsʢΦʔϒͷফඅʹؔΘΔશͯʣ •

    ෛՙରࡦ • ͢ͰʹɺIndex΍ΫΤϦ͸࠷దԽࡁΈ • ͢Ͱʹɺਨ௚෼ׂࡁΈʢ1୆ͷ෺ཧϚγϯΛઐ༗ʣ • ͢Ͱʹɺߴ͍IOੑೳΛ࣋ͭioMemoryΛ࢖͍ͬͯΔ 10
  11. ΦʔϒDBɹෛՙରࡦ • ෆ੔߹͕ڐ͞Εͳ͍ • ReadΛSlave΍Ωϟογϡʹಀ͢͜ͱ΋Ͱ͖Ε͹ආ͚͍ͨɻ • ࢒͞ΕͨҰख͸ɺਫฏ෼ׂʢShardingʣ͔͠ͳ͍ • 2018೥ݩ୴0࣌ͷαʔόෛՙݟੵ΋Γ •

    DAUɺAPIϦΫΤετ਺ɺϐʔΫ࣌ select/update (qps) ౳ • ෼ׂ਺ɺϚγϯߏ੒ΛܾΊΔ 11
  12. 12 DBͷਫฏ෼ׂʢShardingʣͱ͸

  13. DBͷਫฏ෼ׂʢShardingʣͱ͸ 13 user_id orb 10001 100 10002 200 10003 300

    10004 400 10005 500 10006 600 10007 700 user_id orb 10001 100 10005 500 user_id orb 10002 200 10006 600 user_id orb 10003 300 10007 700 user_id orb 10004 400 • 4෼ׂͷྫ • shard_key Λݩʹ෼ׂ • modulo(৒༨) • auto_increment id ͕ར༻Ͱ͖ ͳ͍ͷͰࣗલͰ࠾൪ orbs_id_seq 10007 ࠾൪
  14. 14 ࣄྫʣΦʔϒDBͷਫฏ෼ׂʢShardingʣ

  15. 15 QɽαʔϏεՔಇதɹ͔ͭɹ਺ԯϨίʔυن໛ͷDBΛɺ ҆શʹ࣮֬ʹɺαʔϏεఀࢭΛ࠷খݶʹ཈͑ɺਫฏ෼ׂ ʢShardingʣΛ͢Δʹ͸ʁ

  16. 16 1. ৽چDBͷDouble Write 2. εΫϦϓτʹΑΔίϐʔͱݕূ 3. ৽چDBͷRead/Write੾Γସ͑ʢϝϯς࣌ʣ 4. چDB΁ͷWriteΛࢭΊΔ

    ਫฏ෼ׂʢShardingʣͷखॱ σʔλͷಉظ
  17. 17 1. ৽چDBͷDouble Write 2. εΫϦϓτʹΑΔίϐʔͱݕূ 3. ৽چDBͷRead/Write੾Γସ͑ʢϝϯς࣌ʣ 4. چDB΁ͷWriteΛࢭΊΔ

    σʔλͷಉظ ਫฏ෼ׂʢShardingʣͷखॱ
  18. 1. ৽چDB΁ͷDouble Write 18 app چDB Read Write app app

    shard_1 shard_2 shard_N ɾɾɾ چDB΁ͷWriteΛϑοΫͯ͠৽DBʹ΋Write͢Δ ৽DB INSERT or UPDATE
  19. 19 1. ৽چDBͷDouble Write 2. εΫϦϓτʹΑΔίϐʔͱݕূ 3. ৽چDBͷRead/Write੾Γସ͑ʢϝϯς࣌ʣ 4. چDB΁ͷWriteΛࢭΊΔ

    σʔλͷಉظ ਫฏ෼ׂʢShardingʣͷखॱ
  20. 2. εΫϦϓτʹΑΔίϐʔͱݕূ 20 app چDB Read Write app app shard_1

    shard_2 shard_N ɾɾɾ ৽DB copy script INSERT or UPDATE Double Write͸ܧଓͨ͠··ίϐʔʢ਺ԯϨίʔυʣ INSERT IGNORE INTO … ※ϢχʔΫΩʔ੍໿ҧ൓ͷ࣌ʹ͸Կ΋͠ͳ͍
  21. 21 app چDB Read Write app app shard_1 shard_2 shard_N

    ɾɾɾ ৽DB copy script verify script Verify ৽چDBͷσʔλ͕׬શʹҰக͍ͯ͠Δ͜ͱΛݕূ͢Δ INSERT or UPDATE 2. εΫϦϓτʹΑΔίϐʔͱݕূ
  22. 22 app چDB Read Write app app shard_1 shard_2 shard_N

    ɾɾɾ ৽DB copy script verify script Verify ͜͜Ͱෆ੔߹͕͋ͬͨ৔߹͸࠶౓ίϐʔͱݕূΛ࣮ࢪ INSERT or UPDATE 2. εΫϦϓτʹΑΔίϐʔͱݕূ
  23. 23 app چDB Read Write app app shard_1 shard_2 shard_N

    ɾɾɾ ৽DB copy script verify script Verify 8ฒྻͰ࣮ߦ͓ͯ͠Αͦ1ϲ݄Ͱ׬૸ʢcopy1पɺverify3पʣ INSERT or UPDATE 2. εΫϦϓτʹΑΔίϐʔͱݕূ ʹ ׬શʹಉظʂ
  24. 24 1. ৽چDBͷDouble Write 2. εΫϦϓτʹΑΔίϐʔͱݕূ 3. ৽چDBͷRead/Write੾Γସ͑ʢϝϯς࣌ʣ 4. چDB΁ͷWriteΛࢭΊΔ

    σʔλͷಉظ ਫฏ෼ׂʢShardingʣͷखॱ
  25. 25 app چDB Read Write app app shard_1 shard_2 shard_N

    ɾɾɾ ৽DB seq ʢ࠾൪ʣ ׬શʹRead/Write͍ͯ͠ͳ͍ঢ়ଶʹ͢Δʢϝϯςφϯεʣ 3. ৽چDBͷRead/Write੾Γସ͑ʢϝϯς࣌ʣ
  26. 26 app چDB Read Write app app shard_1 shard_2 shard_N

    ɾɾɾ ৽DB script seq ʢ࠾൪ʣ insert auto_increment id چDBͷ auto_increment id ͷ஋Λɺ৽DBͷ࠾൪ςʔϒϧʹ൓ө͢Δ 3. ৽چDBͷRead/Write੾Γସ͑ʢϝϯς࣌ʣ
  27. 27 app چDB Read Write app app shard_1 shard_2 shard_N

    ɾɾɾ ৽DB seq ʢ࠾൪ʣ ੾Γସ͑ɻ੾Γ໭͠Λߟྀͯ͠چDB΁ͷWrite͸ܧଓ͢Δ 3. ৽چDBͷRead/Write੾Γସ͑ʢϝϯς࣌ʣ
  28. 28 1. ৽چDBͷDouble Write 2. εΫϦϓτʹΑΔίϐʔͱݕূ 3. ৽چDBͷRead/Write੾Γସ͑ʢϝϯς࣌ʣ 4. چDB΁ͷWriteΛࢭΊΔ

    σʔλͷಉظ ਫฏ෼ׂʢShardingʣͷखॱ
  29. 4. چDB΁ͷWriteΛࢭΊΔ 29 app چDB Read Write app app shard_1

    shard_2 shard_N ɾɾɾ ৽DB seq ʢ࠾൪ʣ Τϥʔ0݅ɺෆ੔߹ͳ͘େ੒ޭ
  30. 30 2018೥ݩ୴0࣌ɹαʔόෛՙ

  31. 2018೥ݩ୴0࣌ɹαʔόෛՙ 31 • ΦʔϒDBͷεϩʔΫΤϦ͸0݅ → উͪʂʂʂ • ۓٸϝϯςφϯεແ͠ → উͪʂʂʂ

    ΦʔϒDB 2018೥ݩ୴ qps
  32. 32 ·ͱΊ • Ϟϯετͷαʔόෛՙ͸೥຤೥͕࢝ϐʔΫɻ • ΦʔϒDBͷਫฏ෼ׂʢShardingʣΛ࣮ࢪɻ • πʔϧ͕੔උ͞Ε͍ͯΔɻ • 2018೥ݩ୴0࣌ɺࠓ೥΋৽ͨͳϘτϧωοΫ͕ݟ͔ͭͬͨɻ

    • Ϩεϙϯε஗Ԇ͕ൃੜ͠ଓ͚͍ͯͨɻ
  33. 33 ׬શʹউͭ·ͰɺԶͨͪͱϞϯετ αʔόෛՙͷઓ͍͸ଓ͘…ʂʂ TO BE CONTINUED

  34. ͓͠·͍