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
2.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
2.8k
ちょっぴりDiveDeepするAWSの時間 AWS Dev Day 2023 Tokyo 延長戦 実践データ移行 〜はてなダイアリーや魔法のiらんどの事例と共に〜
tkzwtks
1
170
はてなスターにおける静的ファイル配信の話
tkzwtks
0
160
YAPC::Kyoto 2023 LT Perlブートキャンプご紹介
tkzwtks
0
1.3k
レガシーシステムからのデータマイグレーションあれこれ
tkzwtks
4
1.7k
hatena-engineer-seminar-10
tkzwtks
0
2.4k
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
Unsuck your backbone
ammeep
671
58k
Build your cross-platform service in a week with App Engine
jlugia
231
18k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
How to Ace a Technical Interview
jacobian
278
23k
Building Applications with DynamoDB
mza
95
6.5k
Facilitating Awesome Meetings
lara
54
6.4k
Statistics for Hackers
jakevdp
799
220k
Why You Should Never Use an ORM
jnunemaker
PRO
58
9.4k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Why Our Code Smells
bkeepers
PRO
336
57k
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ʹೖ ΕΔલ·Ͱಉ͡ॲཧ͕͑ͨͷྑ͔ͬͨ •
ແࣄʹҠߦͰ͖ͨ • ԿΑΓ͜Ε͕Ұ൪