Hatena Engineer Seminar #14 魔法のiらんど データ移行編 〜新旧システム間のデータマイグレーション時に我々が考えること〜 / hatena-engineer-seminer-number-14-data-migration

Cd13a4e6df1a0813e093b744a5929b22?s=47 tkzwtks
July 15, 2020
590

Hatena Engineer Seminar #14 魔法のiらんど データ移行編 〜新旧システム間のデータマイグレーション時に我々が考えること〜 / hatena-engineer-seminer-number-14-data-migration

Cd13a4e6df1a0813e093b744a5929b22?s=128

tkzwtks

July 15, 2020
Tweet

Transcript

  1. Hatena Engineer Seminar #14 ຐ๏ͷiΒΜͲ σʔλҠߦฤ ʙ৽چγεςϜؒͷσʔλϚΠάϨʔ γϣϯ࣌ʹզʑ͕ߟ͑Δ͜ͱʙ id:tkzwtksʢ୍ᖒ ਸʣ

  2. ࣗݾ঺հ • id:tkzwtks ୍ᖒ ਸ • 2015೥11݄ೖࣾ • ۀ຿ྺ •

    ΧΫϤϜʢKADOKAWA༷ʣ • GigaViewer • ͸ͯͳμΠΞϦʔऴྃ(͸ͯͳμΠ ΞϦʔ͔Βϒϩά΁ͷҠߦ࡞ۀ) • Ҿӽ͠Ҋ݅͸3݅໨͘Β͍
  3. վΊͯຐ๏ͷiΒΜͲ֓ཁ • KADOKAWA༷͕ӡӦ͢Δʮ೔ຊ࠷େڃͷΨʔϧζΤϯλς ΠϝϯταΠτʯ • 1999೥ʹແྉϗʔϜϖʔδ࡞੒αʔϏεͱͯ͠ελʔτ • খઆ౤ߘػೳͰ͸ʮ࿀ۭʕ੾φΠ࿀෺ޠʯ౳ͷਓؾ࡞඼͕ੜ ·Ε͍ͯΔ •

    ໿20೥෼ͷখઆ΍ؔ࿈σʔλ͕ཷ·͍ͬͯΔ
  4. ࠓ೔࿩͢͜ͱ • σʔλҠߦͷͱ͖ʹ཈͑ΔϙΠϯτ • ৽چຐ๏ͷiΒΜͲؒͰσʔλҾӽ͢͠Δࡍʹզʑ͕ߟ͑ͨ͜ ͱ • ͲͷΑ͏ʹҠߦ४උΛਐΊ͔ͨ • Ҡߦ࣌ͷ՝୊ͱͦͷղܾํ๏

  5. ࠓ೔࿩͢͜ͱ • σʔλҠߦͱ͸ʁ • ຐ๏ͷiΒΜͲʹ͓͚ΔσʔλҠߦ • σʔλ೺Ѳ • Ҡߦॲཧ࣮૷/ࣄલ࣮ߦ/վળ •

    ฒྻ࣮ߦઃܭ/࣮૷ • ·ͱΊ
  6. σʔλҠߦͱ͸ʁ

  7. σʔλҠߦͱ͸ʁ چγεςϜ͔Β৽γεςϜʹσʔλΛҠ͢͜ͱ • DBͳΒ • εΩʔϚఆٛมߋແ͠ / มߋͭͭ͠Ҡߦ • ϑΝΠϧͳΒ

    • چετϨʔδ͔Β৽ετϨʔδ΁ͷҾӽ͠
  8. σʔλҠߦ·ͰͷಓͷΓ • ೺Ѳɾ࡞ઓཱҊ • ԿΛͲ͜ʹҠ͢ͷ͔ / ͲΕ͘Β͍Ҡ͢ͷ͔ • ͲΕ͘Β͍͕͔͔࣌ؒΔ͔ •

    ४උɾ࣮૷ • ࣮ߦ
  9. ຐ๏ͷiΒΜͲͷ Ҿӽ֓͠ཁ

  10. ԿΛͲΕ͘Β͍Ҡ͢ͷ͔ʁ • Ϣʔβʔσʔλʢ470ສਓʣ • ࡞඼ʢ132ສ࡞඼ʣ • Τϐιʔυʢ3000ສΤϐιʔυʣ

  11. ԿΛͲΕ͘Β͍Ҡ͢ͷ͔ʁ • ͓͠Γʢ640ສʣ • ϨϏϡʔʢ219ສʣ • ࡞඼΁ͷ൓Ԡʢ144ສʣ • খઆૠֆ/ϓϩϑΟʔϧը૾ʢ500ສϑΝΠϧʣ

  12. Ҿӽ͠ʹ͓͚Δ՝୊ • γεςϜͷ׬શϦχϡʔΞϧ • ΧΫϤϜͱίʔυϕʔε͕ಉ͡ • ৽چγεςϜؒͰεΩʔϚఆٛ΋ҧ͏ • ه๏΋ҧ͏ͷͰશΤϐιʔυॻ͖׵͑ͳͯ͘͸ͳΒͳ͍ •

    σʔλؒͷґଘؔ܎Λղܾ͠ͳ͕ΒҠߦ͢Δඞཁ͕͋Δ • ྫ) ࡞඼ͱͦͷ࡞ऀ / ը૾ͱͦͷΦʔφʔ
  13. ಺༰Λ೺Ѳ͢Δ

  14. σʔλϚοϐϯά • چεΩʔϚ͔Β৽εΩʔϚʹରԠ͢Δςʔϒϧ/ΧϥϜΛݟͭ ͚Δ • ৽εΩʔϚͰඞཁͳσʔλΛ͢΂ͯચ͍ग़͠ɺچεΩʔϚ ͔ΒରԠ͢ΔΧϥϜΛݟ͚ͭΔ • چγεςϜ͔ΒҠߦ͢Δඞཁ͕͋ΔσʔλͷҠߦઌͷςʔϒ ϧ/ΧϥϜ͕ଘࡏ͢Δ͔ચ͍ग़͢

  15. Ҡߦର৅ͷચ͍ग़͠ • Ҡߦ͢Δ΋ͷ / ͠ͳ͍΋ͷΛܾΊͯ਺Λग़͢ • ྫʣୀձࡁΈϢʔβʔͱͦͷ࡞඼͸Ҡߦ͠ͳ͍ • ਺Λग़ͯ͠ɺҠߦظؒͷݟੵ΋Γʹར༻͢Δ

  16. ྫ ࡞඼/ຊจͷҠߦ • ࡞඼λΠτϧ΍ຊจ͸৽γεςϜͷରԠ͢ΔΧϥϜʹϚοϐ ϯά͢Δ • ݪଇͱͯ͠͸ҠߦલޙͰʮมߋ͠ͳ͍ʯ • چεΩʔϚͷෳ਺ͷσʔλΛࢀর͠ͳ͍ͱܾఆͰ͖ͳ͍΋ͷ ΋͋Δ

    • ެ։ϑϥάʢ࡞඼ɾখઆຊจʣ΍ ষɾઅͷઃఆ • ϚοϐϯάҎ֎ʹ΋ม׵ϩδοΫ͕ඞཁ
  17. Ҡߦॲཧͷ࣮૷

  18. Ҡߦॲཧͷ࣮૷ํ਑ • Ҡߦର৅σʔλͷछྨ͕ଟ͍ͷͰɺ֤ॲཧΛผʑͷόονॲ ཧͱ࣮ͯ͠૷͢Δ • ෳ਺ͷछྨͷσʔλҠߦΛฒߦ࣮ͯ͠ߦͰ͖ΔΑ͏ʹ • ෳ਺ਓͰ࣮૷͠΍͍͢Α͏ʹ • ֤ॲཧΛγϯϓϧʹอͭΑ͏ʹ

    • ֤ॲཧ͸ผͷ࢓૊ΈͰ࿈݁͢Δ
  19. Ҡߦॲཧͷ࣮૷ํ਑ • ͍͖ͳΓ࡞Γࠐ·ͳ͍ • ࠷ॳ͸ͱʹ͔͘ಈ͔͢͜ͱΛ໨ඪʹ • ૝ఆ͍ͯ͠ͳ͍σʔλ͸ଘࡏ͢Δલఏʹཱͪଓ͚Δ • ͋Δఔ౓ಈ͘Α͏ʹͳͬͨΒɺ࣮ࡍʹશ݅ʢ͋Δ͍͸ݱ࣮త ʹऴΘΔ͘Β͍ͷྔʣͰ࣮ࡍҠߦΛࢼ͍ͯ͘͠

    • ૝ఆ͠ͳ͍σʔλ͕͖ͨΒΤϥʔͰམͪΔΑ͏͢Δ
  20. Ҡߦॲཧͷ࣮૷ํ਑ • Ͱ͖Δ͚ͩಛผͳ͜ͱΛ͠ͳ͍ • Ϣʔβʔ͕࣮ࡍʹૢ࡞͢Δ৔߹ͱಉ͡Α͏ͳσʔλ͕࡞Β ΕΔΑ͏ʹ͢Δ • কདྷʹʮ໌Β͔ʹ͓͔͠ͳσʔλʹݟ͑ΔΜ͚ͩͲ͜Ε͍ ͭͲ͏΍ͬͯ࡞ΒΕͨΜͩΖ͏ʯͱͳΔͷΛආ͚͍ͨ •

    DB্ͷσʔλͷมߋཤྺ͸௥͍ʹ͍͘
  21. ࣮૷ • ࠷ॳ͸ҠߦઌͷίʔυΛྲྀ༻͢ΔܗͰ֤ҠߦॲཧΛ࣮૷ • Ҡߦ࣌ʹ͓͔͠ͳσʔλ͕࡞ΒΕΔͷΛ๷͙ͷ͕ૂ͍ • WebଆͱͰ͖Δ͚ͩಉ͡ϩδοΫΛ࢖͏͜ͱͰɺෆ׬શͳ σʔλ͕࡞ΒΕͳ͍Α͏ʹ

  22. ࣄલ࣮ߦ/վળ

  23. ࣌ؒΛݟੵ΋Δ • ࣮σʔλͰࢼ̐͢ • શମͷྔ/Ұ݅͋ͨΓͷҠߦʹ͔͔Δ࣌ؒΛग़͢ • ϝϯςφϯεظؒͷݟੵ΋Γ • શͯͷύλʔϯΛ໢ཏ͢Δඞཁ͸ͳ͍ •

    ݟੵ΋ΓͳͷͰશ݅ࢼ͞ͳͯ͘΋Α͍ • ࣮૷ → ࣮ߦ → मਖ਼ͷαΠΫϧΛճ͍ͯ͘͠
  24. ຐ๏ͷiΒΜͲͰͷ࣌ؒݟੵ΋Γ • ಈ͘Α͏ʹͳͬͨ͘Β͍Ͱ͓ࢼ࣮͠ߦ • ૉ๿ʹ࣮ߦͯ͠ΈΔͱɺҰϲ݄Λͪΐͬͱ௒͑ͦ͏ͱ͍͏͜ ͱ͕Θ͔Δ • ͜ΕͩͱҰൃউෛʹͳͬͯ͠·͏ • λΠϜϦϛοτ͕2݄ޙ൒ʹͳΔ/ϝϯςφϯεظ͕ؒ௕͘

    ͳΓ͗͢Δ • ॲཧࣗମͷվળͱฒྻ࣮ߦ͢Δ࢓૊ΈͷಋೖͰରԠ͢Δ
  25. Ҡߦॲཧͦͷ΋ͷͷվળ • ҠߦॲཧࣗମΛ࠷దԽ͢Δ • ࠷ॳ͸webଆͱಉ͡ίʔυΛར༻͓ͯ͠ΓɺҰ݅ͣͭ INSERT͢ΔϩδοΫʹͳ͍ͬͯͨʢ͍ΘΏΔn+1໰୊ʣ • webଆͱಉ͡ίʔυΛͦͷ··ར༻͢ΔͷΛఘΊͯɺෳ਺ ϨίʔυΛbulk insert͢Δίʔυʹม͍͑ͯ͘

    • INSERT͕ϝΠϯͳͷͰେ෯վળ • UPDATEʹ͍ͭͯ͸ఘΊΔ
  26. ฒྻ࣮ߦ

  27. Ҡߦͷ࡞ઓݕ౼ Ͳ͏΍ͬͯૉૣ͘Ҡߦ͢Δʁ • ฒྻΠϯϙʔτ & ฒྻ਺ΛͰ͖Δ͚ͩ૿΍͢ • ௚ྻʹ΍ͬͯ100೔͔͔ΔͳΒɺ୯७ܭࢉͰ͸100ฒྻͳ Β1೔ͰऴΘΔ •

    ฒྻ਺͸উखʹ্ݶ·Ͱ૿͑ͯཉ͍͠
  28. Ͳ͏΍ͬͯฒྻ࣮ߦ͢Δʁ ϚωʔδυαʔϏεΛಋೖͰղܾΛਤΔ • AWS Batch + StepFunctions • BatchͰҠߦॲཧࣗମΛ࣮ߦ •

    ґଘ͢ΔBatchॲཧΛStepFunctionsͰͭͳ͙ • StepFunctionsͰBatchͷδϣϒΛૹ৴ͭͭ͠ɺਐḿ؅ཧΛߦ ͏࢓૊ΈΛͭ͘Δ
  29. AWS Batch • ϑϧϚωʔδυͳόονॲཧ࣮ߦ؀ڥ • Ϧιʔεʹ༨༟͕͋ΔݶΓδϣϒΛฒྻ࣮ߦͯ͘͠ΕΔ • DockerΠϝʔδ͕͋Ε͹࢖͑ΔͷͰɺٕज़બ୒ͷ෯͕޿͍ • Lambdaͱͷҧ͍͸͜͜

    • ୯ମͰ΋ಈ͘όονॲཧͱͯ͠ಈ͘΋ͷΛࡌ࣮ͤͯߦ
  30. AWS StepFunctions • AWSͷෳ਺αʔϏεΛ૊Έ߹ΘͤͯϫʔΫϑϩʔΛ࡞੒ • ϫʔΫϑϩʔ͸εςοϓͷ૊Έ߹ΘͤͰߏ੒͞ΕΔ • ֤εςοϓ͸ࣗಈతʹτϦΨʔ͞ΕɺτϨʔε͞ΕΔ • ෳ਺ͷॲཧΛͭͳ͛ͯҰ࿈ͷॲཧΛͭ͘Δ

    • ෼ׂ͞Ε֤ͨ޻ఔ͕εςοϓͱͳΔ
  31. AWS StepFunctions • 2019/9ʹαϙʔτ͞ΕͨMap͕ڧྗ • ಈతฒྻॲཧΛ؆୯ʹॻ͚Δ • Ҡߦର৅͕ॻ͔ΕͨJSONͷS3Ωʔͷ഑ྻΛ౉ͯ͠ɺ֤ Ωʔ͝ͱʹBatchΛ࣮ߦ͢ΔɺΈ͍ͨͳ͜ͱ͕ॻ͚Δ গ͠ࢼͨ͠ͱ͜Ζɺ͏·͍͖ͦ͘͏ͳࢉஈ͕͍ͭͨͷͰ࠾༻

  32. σʔλҠߦਐḿ؅ཧ

  33. σʔλҠߦਐḿ؅ཧ • σʔλҠߦͦͷ΋ͷͷਐḿΛ؅ཧ͓ͯ͘͠ • Ҡߦલ/ॲཧ੒ޭ/ࣦഊͷঢ়ଶ؅ཧ • ࣦഊͨ͠σʔλ͸࠶ҠߦͰ͖ΔΑ͏ʹ • Ͳ͏΍ͬͯ؅ཧ͢Δ͔ •

    ӬଓԽͰ͖Ε͹Ͳ͏͍͏ํ๏Ͱ΋͍͍
  34. Savepoint • ࠓճ͸Ҡߦର৅ͷҠߦݩIDҰཡ͕هड़͞ΕͨJSONΛS3ʹஔ ͘΍ΓํΛ࠾༻ • JSONϑΝΠϧҰ͕࣮ͭߦ୯Ґʹͳ͍ͬͯͯɺͦΕͧΕ͕ ฒྻʹ࣮ߦՄೳ • ֤޻ఔͰ΋Ͱ͖Δ͚ͩฒྻ࣮ߦͰ͖ΔΑ͏ʹ •

    ͍͍ͩͨಉ݅͡਺ʢbatch_sizeʣʹͳΔΑ͏ʹۉ͞Ε͍ͯΔ
  35. Savepoint • S3ͷΩʔͰʮҠߦର৅ͷछྨ/Ҡߦݩ/Ҡߦͷ੒൱ʯΛදݱ͢ Δ • ΩʔΛݟΔͱҠߦঢ়ଶ͕Θ͔Δ • ࣮ߦલ/੒ޭ/ࣦഊ • ࣦഊͨ͠άϧʔϓ͸࠶࣮ߦՄೳ

  36. ॲཧ݅਺ΛۉҰʹ͢Δ ֤ॲཧͷॲཧ݅਺Λ͍͍ͩͨಉ͡ʹۉ͢ • Ϣʔβʔ100ਓ ͷάϧʔϓΛ͍͔ͭ͘࡞ͬͯฒྻ࣮ߦ͢Δͱ ͯ͠ • ͦΕͧΕ͕࣋ͭ࡞඼਺΍খઆຊจͷ߹ܭ͸όϥόϥ • ͦΕͧΕͷ޻ఔΛ௚ྻͰॲཧ͢Δ৔߹ɺ਺ʹΑ࣮ͬͯߦ࣌

    ͕ؒมΘΔ • ͕࣌ؒಡΈʹ͘͘ͳΔ
  37. ॲཧ݅਺ΛۉҰʹ͢Δ • ॲཧ݅਺ΛۉҰʹ͢Δ͜ͱͰ֤ॲཧ ͷ࣮ߦ࣌ؒΛ֓Ͷಉ͡ʹͰ͖Δ • savepointͷΦϒδΣΫτ਺Λ؂ࢹ͢ Δ͜ͱͰେମͷਐḿΛ؂ࢹՄೳ • ࣮ߦલͷ݅਺/੒ޭ਺/ࣦഊ਺

  38. ׬੒ͨ͠εςʔτϚγϯ

  39. ͦͷଞ

  40. ը૾ͷҠߦ ը૾ͷҠߦʹ͸S3 BatchOperationsΛར༻ • Ҡߦݩͷը૾ετϨʔδ͔ΒҰ౓S3ͷҰ࣌ஔ͖৔ʹू໿͢Δ • Ұ࣌ஔ͖৔͔Β഑৴༻όέοτ΁ͷҠಈʹ͸S3 BatchOperationsΛར༻ • LambdaΛڬΜͰը૾ΛϦωʔϜ

    • େମ2࣌ؒఔ౓
  41. Ҡߦ݁Ռͷݕূ • ࣄલʹ݅਺Λग़͓͍ͯͯ͠ɺҠߦ݅਺ͱൺֱ • ݕূର৅Λࣄલʹ͍͔ͭ͘ग़͓͍ͯͯ͠ɺҠߦલޙͰҧ͍͕ ͳ͍͔Λൺֱ • ݟͨ໨ʹؔ͢Δ෦෼͸࣮ࡍʹݟͯ֬ೝ • ͜͜͸վળͷ༨஍͕͋ͬͨ

  42. ݁Ռͱ·ͱΊ

  43. ݁Ռ • શ݅Ҡߦ͕εϜʔζʹऴΘΔͱ͍͍ͩͨ10~14h͘Β͍ • ۚમతίετ͸ͦΜͳʹ͔͔Βͳ͍ • Batch͸ࣗಈͰඞཁͳαΠζͷEC2ΠϯελϯεΛཱͯΔ ͕ɺཱ͍ͬͯΔ࣌ؒ͸୹͍ • খ͍͞ΠϯελϯεͰ࣌ؒΛ͔͚ΔΑΓ͸ଟগ͓͕͔ۚ

    ͔ͬͯ΋ߴ଎ʹऴΘΔํ͕ϦΧόϦ͠΍͍͢
  44. ·ͱΊ • ҠߦॲཧΛ෼ׂ͢Δ࡞ઓ͕Α͔ͬͨ • ίʔυ͕ѻ͍΍͍͢ɺಈ࡞֬ೝͷείʔϓΛݶఆͰ͖Δ • ϚωʔδυαʔϏεͷಋೖ • ࣮ߦ؀ڥͷ४උίετΛԼ͛ΒΕͨ •

    ࣗಈͰεέʔϧΞ΢τͯ͘͠ΕΔͷ͸ָ
  45. ·ͱΊ • ݴޠબఆ • ݁ՌతʹΫΤϦΛେ෯ʹॻ͖׵͑ͨͷͰWebଆͱಉ͡ݴޠ Λ࠾༻͢ΔࢫΈ͸ݮͬͨ • ҰํطଘͷॲཧΛਖ਼͘͠࠶࣮૷͢Δͷ͸೉͘͠ɺDBʹೖ ΕΔ௚લ·Ͱ͸ಉ͡ॲཧ͕࢖͑ͨͷ͸ྑ͔ͬͨ •

    ແࣄʹҠߦͰ͖ͨ • ԿΑΓ͜Ε͕Ұ൪