Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Hatena Engineer Seminar #14 魔法のiらんど データ移行編 〜新旧...
Search
tkzwtks
July 15, 2020
0
1.8k
Hatena Engineer Seminar #14 魔法のiらんど データ移行編 〜新旧システム間のデータマイグレーション時に我々が考えること〜 / hatena-engineer-seminer-number-14-data-migration
tkzwtks
July 15, 2020
Tweet
Share
More Decks by tkzwtks
See All by tkzwtks
データマイグレーションの成功戦略~サービスリニューアルで失敗しないための実践ガイド~
tkzwtks
10
1.9k
ちょっぴりDiveDeepするAWSの時間 AWS Dev Day 2023 Tokyo 延長戦 実践データ移行 〜はてなダイアリーや魔法のiらんどの事例と共に〜
tkzwtks
1
140
はてなスターにおける静的ファイル配信の話
tkzwtks
0
130
YAPC::Kyoto 2023 LT Perlブートキャンプご紹介
tkzwtks
0
1.2k
レガシーシステムからのデータマイグレーションあれこれ
tkzwtks
4
1.7k
hatena-engineer-seminar-10
tkzwtks
0
2.4k
Featured
See All Featured
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.2k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
A designer walks into a library…
pauljervisheath
205
24k
Practical Orchestrator
shlominoach
186
10k
Raft: Consensus for Rubyists
vanstee
137
6.8k
Building an army of robots
kneath
303
45k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
VelocityConf: Rendering Performance Case Studies
addyosmani
328
24k
Stop Working from a Prison Cell
hatefulcrawdad
268
20k
Why You Should Never Use an ORM
jnunemaker
PRO
55
9.2k
Transcript
Hatena Engineer Seminar #14 ຐ๏ͷiΒΜͲ σʔλҠߦฤ ʙ৽چγεςϜؒͷσʔλϚΠάϨʔ γϣϯ࣌ʹզʑ͕ߟ͑Δ͜ͱʙ id:tkzwtksʢ୍ᖒ ਸʣ
ࣗݾհ • id:tkzwtks ୍ᖒ ਸ • 201511݄ೖࣾ • ۀྺ •
ΧΫϤϜʢKADOKAWA༷ʣ • GigaViewer • ͯͳμΠΞϦʔऴྃ(ͯͳμΠ ΞϦʔ͔ΒϒϩάͷҠߦ࡞ۀ) • Ҿӽ͠Ҋ݅3݅͘Β͍
վΊͯຐ๏ͷiΒΜͲ֓ཁ • KADOKAWA༷͕ӡӦ͢Δʮຊ࠷େڃͷΨʔϧζΤϯλς ΠϝϯταΠτʯ • 1999ʹແྉϗʔϜϖʔδ࡞αʔϏεͱͯ͠ελʔτ • খઆߘػೳͰʮ࿀ۭʕφΠ࿀ޠʯͷਓؾ࡞͕ੜ ·Ε͍ͯΔ •
20ͷখઆؔ࿈σʔλ͕ཷ·͍ͬͯΔ
ࠓ͢͜ͱ • σʔλҠߦͷͱ͖ʹ͑ΔϙΠϯτ • ৽چຐ๏ͷiΒΜͲؒͰσʔλҾӽ͢͠Δࡍʹզʑ͕ߟ͑ͨ͜ ͱ • ͲͷΑ͏ʹҠߦ४උΛਐΊ͔ͨ • Ҡߦ࣌ͷ՝ͱͦͷղܾํ๏
ࠓ͢͜ͱ • σʔλҠߦͱʁ • ຐ๏ͷiΒΜͲʹ͓͚ΔσʔλҠߦ • σʔλѲ • Ҡߦॲཧ࣮/ࣄલ࣮ߦ/վળ •
ฒྻ࣮ߦઃܭ/࣮ • ·ͱΊ
σʔλҠߦͱʁ
σʔλҠߦͱʁ چγεςϜ͔Β৽γεςϜʹσʔλΛҠ͢͜ͱ • DBͳΒ • εΩʔϚఆٛมߋແ͠ / มߋͭͭ͠Ҡߦ • ϑΝΠϧͳΒ
• چετϨʔδ͔Β৽ετϨʔδͷҾӽ͠
σʔλҠߦ·ͰͷಓͷΓ • Ѳɾ࡞ઓཱҊ • ԿΛͲ͜ʹҠ͢ͷ͔ / ͲΕ͘Β͍Ҡ͢ͷ͔ • ͲΕ͘Β͍͕͔͔࣌ؒΔ͔ •
४උɾ࣮ • ࣮ߦ
ຐ๏ͷiΒΜͲͷ Ҿӽ֓͠ཁ
ԿΛͲΕ͘Β͍Ҡ͢ͷ͔ʁ • Ϣʔβʔσʔλʢ470ສਓʣ • ࡞ʢ132ສ࡞ʣ • Τϐιʔυʢ3000ສΤϐιʔυʣ
ԿΛͲΕ͘Β͍Ҡ͢ͷ͔ʁ • ͓͠Γʢ640ສʣ • ϨϏϡʔʢ219ສʣ • ࡞ͷԠʢ144ສʣ • খઆૠֆ/ϓϩϑΟʔϧը૾ʢ500ສϑΝΠϧʣ
Ҿӽ͠ʹ͓͚Δ՝ • γεςϜͷશϦχϡʔΞϧ • ΧΫϤϜͱίʔυϕʔε͕ಉ͡ • ৽چγεςϜؒͰεΩʔϚఆٛҧ͏ • ه๏ҧ͏ͷͰશΤϐιʔυॻ͖͑ͳͯ͘ͳΒͳ͍ •
σʔλؒͷґଘؔΛղܾ͠ͳ͕ΒҠߦ͢Δඞཁ͕͋Δ • ྫ) ࡞ͱͦͷ࡞ऀ / ը૾ͱͦͷΦʔφʔ
༰ΛѲ͢Δ
σʔλϚοϐϯά • چεΩʔϚ͔Β৽εΩʔϚʹରԠ͢Δςʔϒϧ/ΧϥϜΛݟͭ ͚Δ • ৽εΩʔϚͰඞཁͳσʔλΛͯ͢ચ͍ग़͠ɺچεΩʔϚ ͔ΒରԠ͢ΔΧϥϜΛݟ͚ͭΔ • چγεςϜ͔ΒҠߦ͢Δඞཁ͕͋ΔσʔλͷҠߦઌͷςʔϒ ϧ/ΧϥϜ͕ଘࡏ͢Δ͔ચ͍ग़͢
Ҡߦରͷચ͍ग़͠ • Ҡߦ͢Δͷ / ͠ͳ͍ͷΛܾΊͯΛग़͢ • ྫʣୀձࡁΈϢʔβʔͱͦͷ࡞Ҡߦ͠ͳ͍ • Λग़ͯ͠ɺҠߦظؒͷݟੵΓʹར༻͢Δ
ྫ ࡞/ຊจͷҠߦ • ࡞λΠτϧຊจ৽γεςϜͷରԠ͢ΔΧϥϜʹϚοϐ ϯά͢Δ • ݪଇͱͯ͠ҠߦલޙͰʮมߋ͠ͳ͍ʯ • چεΩʔϚͷෳͷσʔλΛࢀর͠ͳ͍ͱܾఆͰ͖ͳ͍ͷ ͋Δ
• ެ։ϑϥάʢ࡞ɾখઆຊจʣ ষɾઅͷઃఆ • ϚοϐϯάҎ֎ʹมϩδοΫ͕ඞཁ
Ҡߦॲཧͷ࣮
Ҡߦॲཧͷ࣮ํ • Ҡߦରσʔλͷछྨ͕ଟ͍ͷͰɺ֤ॲཧΛผʑͷόονॲ ཧͱ࣮ͯ͢͠Δ • ෳͷछྨͷσʔλҠߦΛฒߦ࣮ͯ͠ߦͰ͖ΔΑ͏ʹ • ෳਓͰ࣮͍͢͠Α͏ʹ • ֤ॲཧΛγϯϓϧʹอͭΑ͏ʹ
• ֤ॲཧผͷΈͰ࿈݁͢Δ
Ҡߦॲཧͷ࣮ํ • ͍͖ͳΓ࡞Γࠐ·ͳ͍ • ࠷ॳͱʹ͔͘ಈ͔͢͜ͱΛඪʹ • ఆ͍ͯ͠ͳ͍σʔλଘࡏ͢Δલఏʹཱͪଓ͚Δ • ͋Δఔಈ͘Α͏ʹͳͬͨΒɺ࣮ࡍʹશ݅ʢ͋Δ͍ݱ࣮త ʹऴΘΔ͘Β͍ͷྔʣͰ࣮ࡍҠߦΛࢼ͍ͯ͘͠
• ఆ͠ͳ͍σʔλ͕͖ͨΒΤϥʔͰམͪΔΑ͏͢Δ
Ҡߦॲཧͷ࣮ํ • Ͱ͖Δ͚ͩಛผͳ͜ͱΛ͠ͳ͍ • Ϣʔβʔ͕࣮ࡍʹૢ࡞͢Δ߹ͱಉ͡Α͏ͳσʔλ͕࡞Β ΕΔΑ͏ʹ͢Δ • কདྷʹʮ໌Β͔ʹ͓͔͠ͳσʔλʹݟ͑ΔΜ͚ͩͲ͜Ε͍ ͭͲ͏ͬͯ࡞ΒΕͨΜͩΖ͏ʯͱͳΔͷΛආ͚͍ͨ •
DB্ͷσʔλͷมߋཤྺ͍ʹ͍͘
࣮ • ࠷ॳҠߦઌͷίʔυΛྲྀ༻͢ΔܗͰ֤ҠߦॲཧΛ࣮ • Ҡߦ࣌ʹ͓͔͠ͳσʔλ͕࡞ΒΕΔͷΛ͙ͷ͕ૂ͍ • WebଆͱͰ͖Δ͚ͩಉ͡ϩδοΫΛ͏͜ͱͰɺෆશͳ σʔλ͕࡞ΒΕͳ͍Α͏ʹ
ࣄલ࣮ߦ/վળ
࣌ؒΛݟੵΔ • ࣮σʔλͰࢼ̐͢ • શମͷྔ/Ұ݅͋ͨΓͷҠߦʹ͔͔Δ࣌ؒΛग़͢ • ϝϯςφϯεظؒͷݟੵΓ • શͯͷύλʔϯΛཏ͢Δඞཁͳ͍ •
ݟੵΓͳͷͰશ݅ࢼ͞ͳͯ͘Α͍ • ࣮ → ࣮ߦ → मਖ਼ͷαΠΫϧΛճ͍ͯ͘͠
ຐ๏ͷiΒΜͲͰͷ࣌ؒݟੵΓ • ಈ͘Α͏ʹͳͬͨ͘Β͍Ͱ͓ࢼ࣮͠ߦ • ૉʹ࣮ߦͯ͠ΈΔͱɺҰϲ݄Λͪΐͬͱ͑ͦ͏ͱ͍͏͜ ͱ͕Θ͔Δ • ͜ΕͩͱҰൃউෛʹͳͬͯ͠·͏ • λΠϜϦϛοτ͕2݄ޙʹͳΔ/ϝϯςφϯεظ͕ؒ͘
ͳΓ͗͢Δ • ॲཧࣗମͷվળͱฒྻ࣮ߦ͢ΔΈͷಋೖͰରԠ͢Δ
Ҡߦॲཧͦͷͷͷվળ • ҠߦॲཧࣗମΛ࠷దԽ͢Δ • ࠷ॳwebଆͱಉ͡ίʔυΛར༻͓ͯ͠ΓɺҰ݅ͣͭ INSERT͢ΔϩδοΫʹͳ͍ͬͯͨʢ͍ΘΏΔn+1ʣ • webଆͱಉ͡ίʔυΛͦͷ··ར༻͢ΔͷΛఘΊͯɺෳ ϨίʔυΛbulk insert͢Δίʔυʹม͍͑ͯ͘
• INSERT͕ϝΠϯͳͷͰେ෯վળ • UPDATEʹ͍ͭͯఘΊΔ
ฒྻ࣮ߦ
Ҡߦͷ࡞ઓݕ౼ Ͳ͏ͬͯૉૣ͘Ҡߦ͢Δʁ • ฒྻΠϯϙʔτ & ฒྻΛͰ͖Δ͚ͩ૿͢ • ྻʹͬͯ100͔͔ΔͳΒɺ୯७ܭࢉͰ100ฒྻͳ Β1ͰऴΘΔ •
ฒྻউखʹ্ݶ·Ͱ૿͑ͯཉ͍͠
Ͳ͏ͬͯฒྻ࣮ߦ͢Δʁ ϚωʔδυαʔϏεΛಋೖͰղܾΛਤΔ • AWS Batch + StepFunctions • BatchͰҠߦॲཧࣗମΛ࣮ߦ •
ґଘ͢ΔBatchॲཧΛStepFunctionsͰͭͳ͙ • StepFunctionsͰBatchͷδϣϒΛૹ৴ͭͭ͠ɺਐḿཧΛߦ ͏ΈΛͭ͘Δ
AWS Batch • ϑϧϚωʔδυͳόονॲཧ࣮ߦڥ • Ϧιʔεʹ༨༟͕͋ΔݶΓδϣϒΛฒྻ࣮ߦͯ͘͠ΕΔ • DockerΠϝʔδ͕͋Ε͑ΔͷͰɺٕज़બͷ෯͕͍ • Lambdaͱͷҧ͍͜͜
• ୯ମͰಈ͘όονॲཧͱͯ͠ಈ͘ͷΛࡌ࣮ͤͯߦ
AWS StepFunctions • AWSͷෳαʔϏεΛΈ߹ΘͤͯϫʔΫϑϩʔΛ࡞ • ϫʔΫϑϩʔεςοϓͷΈ߹ΘͤͰߏ͞ΕΔ • ֤εςοϓࣗಈతʹτϦΨʔ͞ΕɺτϨʔε͞ΕΔ • ෳͷॲཧΛͭͳ͛ͯҰ࿈ͷॲཧΛͭ͘Δ
• ׂ͞Ε֤ͨఔ͕εςοϓͱͳΔ
AWS StepFunctions • 2019/9ʹαϙʔτ͞ΕͨMap͕ڧྗ • ಈతฒྻॲཧΛ؆୯ʹॻ͚Δ • Ҡߦର͕ॻ͔ΕͨJSONͷS3ΩʔͷྻΛͯ͠ɺ֤ Ωʔ͝ͱʹBatchΛ࣮ߦ͢ΔɺΈ͍ͨͳ͜ͱ͕ॻ͚Δ গ͠ࢼͨ͠ͱ͜Ζɺ͏·͍͖ͦ͘͏ͳࢉஈ͕͍ͭͨͷͰ࠾༻
σʔλҠߦਐḿཧ
σʔλҠߦਐḿཧ • σʔλҠߦͦͷͷͷਐḿΛཧ͓ͯ͘͠ • Ҡߦલ/ॲཧޭ/ࣦഊͷঢ়ଶཧ • ࣦഊͨ͠σʔλ࠶ҠߦͰ͖ΔΑ͏ʹ • Ͳ͏ͬͯཧ͢Δ͔ •
ӬଓԽͰ͖ΕͲ͏͍͏ํ๏Ͱ͍͍
Savepoint • ࠓճҠߦରͷҠߦݩIDҰཡ͕هड़͞ΕͨJSONΛS3ʹஔ ͘ΓํΛ࠾༻ • JSONϑΝΠϧҰ͕࣮ͭߦ୯Ґʹͳ͍ͬͯͯɺͦΕͧΕ͕ ฒྻʹ࣮ߦՄೳ • ֤ఔͰͰ͖Δ͚ͩฒྻ࣮ߦͰ͖ΔΑ͏ʹ •
͍͍ͩͨಉ݅͡ʢbatch_sizeʣʹͳΔΑ͏ʹۉ͞Ε͍ͯΔ
Savepoint • S3ͷΩʔͰʮҠߦରͷछྨ/Ҡߦݩ/Ҡߦͷ൱ʯΛදݱ͢ Δ • ΩʔΛݟΔͱҠߦঢ়ଶ͕Θ͔Δ • ࣮ߦલ/ޭ/ࣦഊ • ࣦഊͨ͠άϧʔϓ࠶࣮ߦՄೳ
ॲཧ݅ΛۉҰʹ͢Δ ֤ॲཧͷॲཧ݅Λ͍͍ͩͨಉ͡ʹۉ͢ • Ϣʔβʔ100ਓ ͷάϧʔϓΛ͍͔ͭ͘࡞ͬͯฒྻ࣮ߦ͢Δͱ ͯ͠ • ͦΕͧΕ͕࣋ͭ࡞খઆຊจͷ߹ܭόϥόϥ • ͦΕͧΕͷఔΛྻͰॲཧ͢Δ߹ɺʹΑ࣮ͬͯߦ࣌
͕ؒมΘΔ • ͕࣌ؒಡΈʹ͘͘ͳΔ
ॲཧ݅ΛۉҰʹ͢Δ • ॲཧ݅ΛۉҰʹ͢Δ͜ͱͰ֤ॲཧ ͷ࣮ߦ࣌ؒΛ֓Ͷಉ͡ʹͰ͖Δ • savepointͷΦϒδΣΫτΛࢹ͢ Δ͜ͱͰେମͷਐḿΛࢹՄೳ • ࣮ߦલͷ݅/ޭ/ࣦഊ
ͨ͠εςʔτϚγϯ
ͦͷଞ
ը૾ͷҠߦ ը૾ͷҠߦʹS3 BatchOperationsΛར༻ • Ҡߦݩͷը૾ετϨʔδ͔ΒҰS3ͷҰ࣌ஔ͖ʹू͢Δ • Ұ࣌ஔ͖͔Β৴༻όέοτͷҠಈʹS3 BatchOperationsΛར༻ • LambdaΛڬΜͰը૾ΛϦωʔϜ
• େମ2࣌ؒఔ
Ҡߦ݁Ռͷݕূ • ࣄલʹ݅Λग़͓͍ͯͯ͠ɺҠߦ݅ͱൺֱ • ݕূରΛࣄલʹ͍͔ͭ͘ग़͓͍ͯͯ͠ɺҠߦલޙͰҧ͍͕ ͳ͍͔Λൺֱ • ݟͨʹؔ͢Δ෦࣮ࡍʹݟͯ֬ೝ • ͜͜վળͷ༨͕͋ͬͨ
݁Ռͱ·ͱΊ
݁Ռ • શ݅Ҡߦ͕εϜʔζʹऴΘΔͱ͍͍ͩͨ10~14h͘Β͍ • ۚમతίετͦΜͳʹ͔͔Βͳ͍ • BatchࣗಈͰඞཁͳαΠζͷEC2ΠϯελϯεΛཱͯΔ ͕ɺཱ͍ͬͯΔ͍࣌ؒ • খ͍͞ΠϯελϯεͰ࣌ؒΛ͔͚ΔΑΓଟগ͓͕͔ۚ
͔ͬͯߴʹऴΘΔํ͕ϦΧόϦ͍͢͠
·ͱΊ • ҠߦॲཧΛׂ͢Δ࡞ઓ͕Α͔ͬͨ • ίʔυ͕ѻ͍͍͢ɺಈ࡞֬ೝͷείʔϓΛݶఆͰ͖Δ • ϚωʔδυαʔϏεͷಋೖ • ࣮ߦڥͷ४උίετΛԼ͛ΒΕͨ •
ࣗಈͰεέʔϧΞτͯ͘͠ΕΔͷָ
·ͱΊ • ݴޠબఆ • ݁ՌతʹΫΤϦΛେ෯ʹॻ͖͑ͨͷͰWebଆͱಉ͡ݴޠ Λ࠾༻͢ΔࢫΈݮͬͨ • ҰํطଘͷॲཧΛਖ਼͘͠࠶࣮͢Δͷ͘͠ɺDBʹೖ ΕΔલ·Ͱಉ͡ॲཧ͕͑ͨͷྑ͔ͬͨ •
ແࣄʹҠߦͰ͖ͨ • ԿΑΓ͜Ε͕Ұ൪