Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

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

More Decks by 浜田 恭平 (Kyohei Hamada)

Other Decks in Programming

Transcript

  1. Ϟϯετͷαʔόʔෛՙͱͷઓ͍
    ʙ͚͓͋Ί2018ฤʙ
    2018/04/21
    ୈ2ճ Battle Conference U30
    XFLAG։ൃຊ෦ XFLAGࣄۀਪਐࣨ SREάϧʔϓ
    ඿ా ګฏ @haman29
    גࣜձࣾϛΫγΟ

    View Slide

  2. About me
    •඿ా ګฏ @haman29
    •https://twitter.com/haman29
    •XFLAG ελδΦ SREάϧʔϓ
    •ओʹࠃ಺൛ϞϯελʔετϥΠΫʢ௨শɺϞϯετʣͷ։ൃɾӡ༻ɾෛՙରࡦ
    Λ୲౰ɻ
    •هࣄ
    •ʮhbstudyˌ76 SREେશ: XFLAG ελδΦฤʯͰൃද͠·ͨ͠ɻ (2017.8)
    •ΤϯδχΞͬͯڅྉԿʹ࢖ͬͯΔͷʁۚમࣄ৘ʹ͍͍ͭͯΖ͍Ζฉ͍͖ͯͨʛ
    CodeIQ MAGAZINE 3ਓ໨ (2016.3)
    •झຯ͸ϘϧμϦϯά 2

    View Slide

  3. ϞϯελʔετϥΠΫ
    • ௨শɺϞϯετ
    • εϚϗͰ༡΂ΔɺͻͬͺΓϋϯςΟϯάRPG
    • ੈքྦྷܭར༻ऀ਺͕4,500ສਓಥഁʢ2018.3ʣ
    • ࠃ಺൛ɾւ֎൛ͱ෼͔Ε͍ͯΔ
    3

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. 7
    ೥຤೥࢝ͷαʔόෛՙ

    View Slide

  8. ೥຤೥࢝ͷαʔόෛՙ
    • ຖ೥ɺϐʔΫΛܴ͑Δ
    • ಛʹɺݩ୴0͔࣌Β࢝·ΔΨνϟΠϕϯτʢڧڧΩϟϥʣ
    • 2017೥ݩ୴0࣌ɺαʔόෛՙʹΑΓۓٸϝϯςφϯε
    • ΞϓϦ಺௨՟༻DBʢҎ߱ɺΦʔϒDBʣͰεϩʔΫΤϦ͕ଟൃ
    • ଞͷϘτϧωοΫ
    • 2018೥͸উ͍ͪͨʂʂ
    • νʔϜͰ࿈ܞɾ෼୲ͯ͠ෛՙରࡦΛਐΊΔ
    8

    View Slide

  9. 9
    ΦʔϒDB

    View Slide

  10. ΦʔϒDB
    • Φʔϒɹɹɹ ʹ Ϣʔβ༷ͷେࣄͳ͓ۚ
    • ਺ԯϨίʔυ
    • ϐʔΫ࣌ͷUpdateΫΤϦ͕਺ສqpsʢΦʔϒͷফඅʹؔΘΔશͯʣ
    • ෛՙରࡦ
    • ͢ͰʹɺIndex΍ΫΤϦ͸࠷దԽࡁΈ
    • ͢Ͱʹɺਨ௚෼ׂࡁΈʢ1୆ͷ෺ཧϚγϯΛઐ༗ʣ
    • ͢Ͱʹɺߴ͍IOੑೳΛ࣋ͭioMemoryΛ࢖͍ͬͯΔ
    10

    View Slide

  11. ΦʔϒDBɹෛՙରࡦ
    • ෆ੔߹͕ڐ͞Εͳ͍
    • ReadΛSlave΍Ωϟογϡʹಀ͢͜ͱ΋Ͱ͖Ε͹ආ͚͍ͨɻ
    • ࢒͞ΕͨҰख͸ɺਫฏ෼ׂʢShardingʣ͔͠ͳ͍
    • 2018೥ݩ୴0࣌ͷαʔόෛՙݟੵ΋Γ
    • DAUɺAPIϦΫΤετ਺ɺϐʔΫ࣌ select/update (qps) ౳
    • ෼ׂ਺ɺϚγϯߏ੒ΛܾΊΔ
    11

    View Slide

  12. 12
    DBͷਫฏ෼ׂʢShardingʣͱ͸

    View Slide

  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
    ࠾൪

    View Slide

  14. 14
    ࣄྫʣΦʔϒDBͷਫฏ෼ׂʢShardingʣ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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 …
    ※ϢχʔΫΩʔ੍໿ҧ൓ͷ࣌ʹ͸Կ΋͠ͳ͍

    View Slide

  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. εΫϦϓτʹΑΔίϐʔͱݕূ

    View Slide

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

    View Slide

  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. εΫϦϓτʹΑΔίϐʔͱݕূ
    ʹ ׬શʹಉظʂ

    View Slide

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

    View Slide

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

    View Slide

  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੾Γସ͑ʢϝϯς࣌ʣ

    View Slide

  27. 27
    app
    چDB
    Read
    Write
    app
    app
    shard_1 shard_2 shard_N
    ɾɾɾ
    ৽DB
    seq
    ʢ࠾൪ʣ
    ੾Γସ͑ɻ੾Γ໭͠Λߟྀͯ͠چDB΁ͷWrite͸ܧଓ͢Δ
    3. ৽چDBͷRead/Write੾Γସ͑ʢϝϯς࣌ʣ

    View Slide

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

    View Slide

  29. 4. چDB΁ͷWriteΛࢭΊΔ
    29
    app
    چDB
    Read
    Write
    app
    app
    shard_1 shard_2 shard_N
    ɾɾɾ
    ৽DB
    seq
    ʢ࠾൪ʣ
    Τϥʔ0݅ɺෆ੔߹ͳ͘େ੒ޭ

    View Slide

  30. 30
    2018೥ݩ୴0࣌ɹαʔόෛՙ

    View Slide

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

    View Slide

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

    View Slide

  33. 33
    ׬શʹউͭ·ͰɺԶͨͪͱϞϯετ
    αʔόෛՙͷઓ͍͸ଓ͘…ʂʂ
    TO BE CONTINUED

    View Slide

  34. ͓͠·͍

    View Slide