# 概要
2019年08月17日に開催される JAWS-UG Okayama 2019 の発表スライドです。
https://jaws-ug-okayama.doorkeeper.jp/events/91487
株式会社オミカレ ( https://party-calendar.net/ ) で取り組んでいる DB・Webリファクタリングの手法についてご紹介させて頂きました。
AWS DMSΛར༻ͨ͠ࠓ෩DBϦϑΝΫλϦϯά2019-08-17JAWS-UG Okayama 20191
View Slide
͓͠ͳ͕͖1. ࣗݾհ2. DBϦϑΝΫλϦϯάΛΔཧ༝3. ͱ4. DMSΛͬͨϦϑΝΫλϦϯάख๏5. ·ͱΊ2
ҙࣄ߲• εϥΠυެ։͠·͢ɻ• ࣭ͱ͔͝ࢦఠͱ͔ॾʑͷϑΟʔυόοΫ͕͍͟͝·ͨ͠Β ͓ئ͍க͠·͢ɻ3
1. ࣗݾհ• ߴڮ Ұٍ• Ԭࢁࡏॅ• גࣜձࣾΦϛΧϨ WebΤϯδχΞ• ຊPostgreSQLϢʔβʔձதࠃࢧ෦• PostgreSQLྺ 14
גࣜձࣾΦϛΧϨ(ࣗࣾʹ͍ͭͯͪΐͬͱએ)શࠃ30,000݅ͷࠗ׆ύʔςΟΛܝࡌͨ͠ϙʔλϧαΠτ40ສਓͷձһͷํʑʹ͝ར༻͍͍ͯ·͢ɻࠗ׆ͱݴ͑ΦϛΧϨʂ\\͍͍݁ࠗͧʂʂ//5
6
αΠτͷϑϧϦχϡʔΞϧϑϩϯτΤϯυ• TypeScript+SCSSͰϑϧϦϓϨʔεɻόοΫΤϯυ• PHPɺPython(Django)ͰϑϧϦϓϨʔεɻ• طଘͷٕज़తෛ࠴Λվम7
αΠτͷϑϧϦχϡʔΞϧΠϯϑϥ• ECS(Fargate)ʹΑΔશίϯςφԽ• αΠτΛCDNͰ·ΔͬͱΩϟογϡͯ͠ߴԽ• σϓϩΠϑϩʔΛAnsible͔ΒTerraformΛͬͨͷʹϦϓϨʔε8
ΦϛΧϨͷจԽʢϚωʔδϟʔઢʣฐࣾCTO ીࠜ(@soudai1025) ͕PHPΧϯϑΝϨϯεͰ͓ͯ͠Γ·͢ɻڵຯ͕͋Δํͪ͜ΒΛͲ͏ͧɻhttps://speakerdeck.com/soudai/proper-problem9
ΦϛΧϨͷจԽʢϓϨΠϠʔઢʣߴڮ͕ PHPΧϯϑΝϨϯεઋͰ͓ͯ͠Γ·͢ɻڵຯ͕͋Δํͪ͜ΒΛͲ͏ͧɻhttps://speakerdeck.com/takahashiikki/phpconference-sendai2019-omicale10
2. DBϦϑΝΫλϦϯάΛΔཧ༝ͱͦͷख๏11
ΦϛΧϨʹ͍ͭͯ• αʔϏε։͔࢝Β͕̓ܦա͍ͯ͠Δɻ• ͜͜ఔͰ ։ൃਓһ͕ࣾһ1໊ + ֎ ͷମ੍͔Βࣾһ6໊ ͷମ੍ʹมֵɻ• ৭Μͳେਓͷࣄ͔ΒͦΕͳΓʹ͍ΘΏΔٕज़తෛ࠴ͱݺΕΔͷ͕͋Δɻ12
ྫ͑ɾɾʮσʔλϕʔεߏΛோΊΔձΖ͏ʂʯ13
ྫ͑ɾɾʮσʔλϕʔεߏΛோΊΔձΖ͏ʂʯʮ͜ͷςʔϒϧԿʹͬͯΔ͔୭͔ͬͯΔʁʯ14
ྫ͑ɾɾʮσʔλϕʔεߏΛோΊΔձΖ͏ʂʯʮ͜ͷςʔϒϧԿʹͬͯΔ͔୭͔ͬͯΔʁʯʮʮʮ͍͊ɻɻɻ!ʁʯʯʯ15
ྫ͑ɾɾʮσʔλϕʔεߏΛோΊΔձΖ͏ʂʯʮ͜ͷςʔϒϧԿʹͬͯΔ͔୭͔ͬͯΔʁʯʮʮʮ͍͊ɻɻɻ!ʁʯʯʯ୭Βͳ͍ςʔϒϧͷڪා...16
gender ΧϥϜఆ ࣮ࡍܕ intೖΔσʔλ 0, 1, 2σʔλͷҙຯ 0: ະఆٛ,1: உੑ,2: ঁੑ17
gender ΧϥϜఆ ࣮ࡍܕ int varcharೖΔσʔλ 0, 1, 2 0, 1, 2, உੑ, ঁੑσʔλͷҙຯ 0: ະఆٛ,1: உੑ,2: ঁੑ0: ະఆٛ,1: உੑ,2: ঁੑ18
ϓϯϓϯ͢Δɾɾʂ19
ϦϑΝΫλϦϯάΛԿނ͢Δͷ͔• ίʔυσʔλϕʔε͔Βඬ͏ ෆ٢ͳʹ͓͍ ͕͍ɻෆ٢ͳʹ͓͍ is ٕज़తෛ࠴• ʮٕज़తෛ࠴Λվम͢ΔҝʹϦϑΝΫλϦϯάΛߦ͏ʯ=> ։ൃͷ҆ఆԽɺอकੑͷ্ɾखΓΛগͳ͘͢Δ20
ͱ͍͍ͭͭɾɾʮϦϑΝΫλϦϯάΛ͢Δҝʹ3ϲ݄։ൃ͕ࢭ·Γ·͢ʯզʑελʔτΞοϓͳͷͰɺάϩʔεͷखΛࢭΊΔࣄग़དྷͳ͍ɻ21
͖߹͏ඞཁͷ͋Δ՝• ࠓޙͷࣄۀͷͷҝʹ։ൃͷεϐʔυײඞཁෆՄܽɻ• ݶΒΕͨϦιʔεશͯΛϦϑΝΫλϦϯάʹࢿग़དྷͳ͍ɻ22
ݕ౼ʹ͋ͨͬͯߟ͑ΔҰൠతͳϦϑΝΫλϦϯάख๏23
Ұൠతͳౕ໊ஶ ʰσʔλϕʔεɾϦϑΝΫλϦϯάʱ24
τϦΨʔΛͬͨϦϑΝΫλϦϯά• ৽ΧϥϜΛՃ͢Δ• τϦΨʔΛ༻͍ͯچΧϥϜ͕ߋ৽͞Εͨ߹ʹɺ৽ΧϥϜΛߋ৽͢ΔΑ͏ʹ͢Δ• ֤ߦͷ৽ΧϥϜʹچΧϥϜͷΛೖ͢Δ• ৽ΧϥϜ͔ΒಡΉΑ͏ʹίʔυΛมߋ͢Δ• ৽ΧϥϜॻ͖ࠐΉΑ͏ʹίʔυΛมߋ͢Δ• چΧϥϜͱτϦΨʔΛআ͢Δ25
σϝϦοτ• SQLͰτϦΨʔॻ͔ͳ͍ͱ͍͚ͳ͍ɻ26
SQLͰτϦΨʔΛॻ͔ͳ͍ͱ͍͚ͳ͍ɻ• Java ͰΞϓϦέʔγϣϯΛॻ͍ͨࣄ͋Δਓ ʁ• Python ͰΞϓϦέʔγϣϯΛॻ͍ͨࣄ͋Δਓ ʁ• JavaScript ͰΞϓϦέʔγϣϯΛॻ͍ͨࣄ͋Δਓ ʁ• Perl ͰΞϓϦέʔγϣϯΛॻ͍ͨࣄ͋Δਓ ʁ27
SQLͰτϦΨʔΛॻ͔ͳ͍ͱ͍͚ͳ͍ɻPostgreSQLͳΒ{ Java | Python | JavaScript | Perl | SQL } ͰτϦΨʔ͕ॻ͚·͢ʂ28
PostgreSQLͷखଓ͖ܕݴޠτϦΨʔͷ࣮ߦؔΛҎԼͷ֤ݴޠͰఆ͕ٛग़དྷΔɻ໊শ ݴޠ ํ๏PL/pgSQL SQL جຊPL/Perl Perl جຊPL/Python Python جຊPL/Java Java ֦ுPL/v8 JavaScript ֦ு※ ͦͷଞ29
(ࢀߟ) PL/v8 ͷ༗ޮԽํ๏RDS for PostgreSQLʹσϑΥϧτͰplv8͕Πϯετʔϧ͞Ε͍ͯΔͷͰɺextensionΛ༗ޮԽͯ͠Εok. .+!&*$'&('*+")!**#'-) *!.+!&*$'&*('*+")!*)!+!!.+!&*$'&(%,30
ฐࣾɺMySQLͳΜͰ͕͢ɾɾʢʣ31
҆৺͍ͯͩ͘͠͞ฐࣾMySQLͰ͢32
ͱ͍͏ࣄͰɻɻ• τϦΨʔΛָʹ͍ͨ͠͠ɺPostgreSQL͖͔ͩΒMySQLͷσʔλΛPostgreSQLʹҠߦͭͭ͠τϦΨʔ͕ൃಈ͢ΔΑ͏ͳΞʔΩςΫνϟ͕ྑ͍ɻ• খ͍͞ॴ͔Βண࣮ʹखΛਐΊ͍ͨɻ• ্هΛ৬ਓͷख͡Όͳָͯ͘ʹӡ༻͍ͨ͠ɻ্هΛશ෦ຬͨͨ͠ͷ͕ཉ͍͠33
ͦΕશ෦ AWS DMS Ͱग़དྷ·͢ʂ34
3. ͱ35
ωοτϫʔΫӽ͠ʹσʔλҠߦΛߦ͏ࣄ͕ग़དྷΔαʔϏε಄จࣈΛऔͬͯɺͱݺΕΔɻ※ ੍ݶ͕͋ͬͯɺίϐʔݩɾίϐʔઌͷͲͪΒ͔͕AWSͷΤϯυϙΠϯτͰແ͍ͱɺϨϓϦέʔγϣϯΛ͢Δࣄ͕ग़དྷͳ͍ɻ36
ͷ͝հ• AWS DMS ͰΘΕΔΩʔϫʔυ• ϨϓϦέʔγϣϯΠϯελϯεʹ͍ͭͯ• λεΫͷৼΔ͍ʹ͍ͭͯ• λεΫͷઃఆํ๏ʹ͍ͭͯ37
AWS DMS ͰΘΕΔΩʔϫʔυ• ιʔεΤϯυϙΠϯτ• σʔλͷίϐʔݩɻ , , , ͳͲɻ• λʔήοτΤϯυϙΠϯτ• σʔλͷίϐʔઌɻ , , , , ͳͲɻ• ϨϓϦέʔγϣϯΠϯελϯε• ίϐʔݩ͔ΒίϐʔઌσʔλͷϨϓϦέʔγϣϯΛߦ͏Πϯελϯεɻ• λεΫ• ͲͷςʔϒϧΛͲͷΑ͏ʹҠߦ͢Δ͔ΛఆΊͨϧʔϧɻ38
ϨϓϦέʔγϣϯΠϯελϯεʹ͍ͭͯ• ΠϯελϯεΫϥε T2, C4, R4ͷ̏छྨΛαϙʔτ.• T2: ։ൃɾݕূ༻• C4: େྔͷԋࢉΛߦ͏߹ʹཱͭɻ(AWSతʹ ҟछDBҠߦ͜ΕΛ͢͢Ί͍ͯΔ)• R4: ϝϞϦ૿ՃΠϯελϯεɻ(ҰճͷτϥϯβΫγϣϯ͕େ͖͍࣌͜Ε.)• ϚϧνAZʹରԠ͍ͯͯ͠ɺϑΣΠϧΦʔόʔΛαϙʔτ.• ࣮ࡍɺDMSͱ͓͕͔͔ͯۚ͠ΔͷΠϯελϯεར༻ྉͱετϨʔδ͚ͩɻ39
λεΫͷৼΔ͍ͷछྨʹ͍ͭͯλεΫͷৼΔ͍ओʹ3λΠϓ͋Δɻ• શϩʔυ+ܧଓతͳϨϓϦέʔγϣϯ(CDC).• ΦϛΧϨͰར༻͍ͯ͠ΔλΠϓɻ• طଘͷσʔλΛϑϧϩʔυͨ͠ޙɺτϥϯβΫγϣϯϩά͔ΒܧଓతʹϨϓϦέʔγϣϯΛߦ͏.• ܧଓతͳϨϓϦέʔγϣϯ(CDC)ͷΈ• શϩʔυͷΈ40
λεΫͷઃఆํ๏ʹ͍ͭͯ• ϨϓϦέʔγϣϯΛߦ͏ςʔϒϧͷࢦఆํ๏̎छྨ• userɿ จࣈྻҰகͰ ςʔϒϧͷΈΛରͱ͢Δɻ• user_%ɿ ਖ਼نදݱͰ ςʔϒϧʹ߹க͢ΔશͯͷςʔϒϧΛରͱ͢Δɻ• ਖ਼نදݱͳͲͰෳࢦఆͨ͠߹λεΫͰฒྻͰςʔϒϧ͕ϩʔυ͞ΕΔɻ(σϑΥϧτͰ8ςʔϒϧ)41
λεΫͷઃఆํ๏ʹ͍ͭͯ• ֤ςʔϒϧʹରͯ͠ҠߦϧʔϧΛઃఆ͢Δࣄ͕ग़དྷΔɻ• ྫ͑Ҡߦޙͷςʔϒϧ໊/ΧϥϜ໊Λมߋͨ͠ΓରͷσʔλΛϧʔϧͰߜΓࠐΜͩΓग़དྷΔɻ• ͭ·ΓɺΧϥϜ໊ͷมߋͱ͔͚ͩͳΒͦͦτϦΨʔ͢ΒཁΒͳ͍ɻ42
λεΫӡ༻ͷάϧʔϓ୯ҐͰখ͘͞ϨϓϦέʔγϣϯλεΫΛઃఆͯ͠ҠߦΛਐΊΔɻྫɿ ϢʔβʔҠߦλεΫ, σʔλҠߦλεΫ, ߪೖཤྺҠߦλεΫ, ...• ཧ༝Ҡߦྃͨ͠ςʔϒϧΑΓDMSͷλεΫΛআ͍ͯ͘͠ࣄΛఆ͍ͯ͠ΔͨΊɻӡ༻Λͯ͠ؾ͍͕ͨɺখ͘͞λεΫΛׂ͓ͯ͘͠ࣄͰҰݸͷςʔϒϧҠߦ͕ࣦഊͨ࣌͠ʹαʔϏεશମͷোʹͳΒͳ͍ɻ43
ͦͷଞDMSͷओͳ׆༻ࣄྫ• ΦϯϓϨͷDB͔ΒAWSͷRDSσʔλΛҠߦ͢Δɻ• ਂϑϧόοΫΞοϓΛऔͬͯAWSʹసૹͯ͠෮ݩ͢Δ࡞ۀͱ͔ཁΒͳ͍()• RDS → DynamoDB ʹܧଓతʹϨϓϦέʔγϣϯΛͯ͠Lambda͕ଓ͢ΔDynamoDBΛ࡞Δɻ• RDS → S3ʹcsvΛput͢Δɻ44
·ͱΊ• DMSωοτϫʔΫӽ͠ʹϨϓϦέʔγϣϯΛ࣮ݱ͢ΔαʔϏε.• σʔλͷίϐʔݩͱઌΛࢦఆͯ͠ҠߦϧʔϧͱͳΔλεΫΛ࡞͢ΔࣄͰσʔλͷҠߦશͯDMSͷͰ࣮ݱͯ͘͠ΕΔɻ• λεΫͷཻΛଟͨ͘͠Γখͨ͘͞͠Γ͢ΔࣄͰશମͷϨϓϦέʔγϣϯͷཻΛௐग़དྷΔɻ• DMS୯ମͱͯ͠ϨϓϦέʔγϣϯΠϯελϯεͷӡ༻අ͕͔͔ΔఔͰ҆ՁͰਐΊΔࣄ͕ग़དྷΔɻ45
4. DMSΛͬͨϦϑΝΫλϦϯάख๏46
ݱঢ়ͷΞʔΩςΫνϟ47
ݱঢ়ͷΞʔΩςΫνϟෳͷαʔϏε͕ӡ༻͞Ε͓ͯΓ୯ҰͷMySQLͷhogeεΩʔϚ͔ΒσʔλΛࢀর͍ͯ͠Δɻݱঢ়ͷ՝• DB͔Βෆ٢ͳ͍͕ඬͬͯΔɻ• Web͔Βෆ٢ͳ͍͕ඬͬͯΔɻ48
DBͷϦϑΝΫλϦϯάํ๏• ผͷΠϯελϯεΛ༻ҙ͠ɺAWS Database Migration ServiceΛ༻ͯ͠ϨϓϦέʔγϣϯ͢Δɻ• ϨϓϦέʔγϣϯ͞ΕͨλΠϛϯάͰDBͷτϦΨʔΛൃಈͤ͞Δɻ• τϦΨʔͰچσʔλΛՃ͠ϦϑΝΫλϦϯάͨ͠ςʔϒϧͷܗࣜʹ߹͏Α͏ʹొ͢Δɻ• ࠓޙNEWεΩʔϚΛࢀর͢Δɻ49
WebͷϦϑΝΫλϦϯάํ๏APIαʔϏε Λ৽͘͠࡞ΓɺWebଆΛAPIܦ༝ʹॻ͖͍͑ͯ͘ɻͦͷࡍʹɺWebଆͷίʔυΛϦϑΝΫλϦϯά͍ͯ͘͠ɻྫ͑• ձһొ/ࢀরAPI• ࠗ׆ύʔςΟʔΛݕࡧ͢Δػೳ• ࠗ׆ύʔςΟʔʹ༧͢ΔAPI·ͨɺ͜ͷAPIΞϓϦ։ൃͷ࣌ʹಉ͡Λ͔ͭ͏ɻ50
ϦϑΝΫλϦϯάख๏• Webগͮͭ͠APIܦ༝Ͱࢀরɾॻࠐ͢ΔΑ͏ʹมߋ͢Δɻ• APIॻࠐMySQLଆߦ͍ɺಡࠐPostgreSQLଆ͔Βߦ͏ɻ• WebଆΛશͯAPIܦ༝ʹग़དྷͨΒAPIͷॻࠐPostgreSQLଆมߋ͢Δɻ51
52
͜ͷϦϑΝΫλϦϯάํ๏ͷϝϦοτ• ߋ৽APIMySQLॻࠐΛ͢ΔͷͰগͮͭ͠APIܦ༝ʹͯ͠طଘαʔϏεͷςʔϒϧͷࢀরՕॴʹӨڹ͕ແ͍ɻ• ҰՕॴAPIܦ༝ʹͯ͠ΈΔ → ͕͋Εௐ͢Δɻˠ ...ͳͲͷΑ͏ʹ ΧφϦΞϦϦʔε ܗࣜͰগͮͭ͠վળΛਐΊ͍͚ͯΔɻ• σʔλͷಡࠐPostgreSQL͔Βߦ͏ͷͰॻࠐAPIΛݺͿଆͲͪΒʹॻ͖ࠐΜͰ͍Δ͔Λؾʹ͠ͳͯ͘ྑ͍ɻ• WebͱΞϓϦͰಉ͡APIΛ͏ͷͰWebଆͰ࡞ͬͨͷΛΞϓϦʹΈࠐΉࡍɺΞϓϦଆͷରԠΛ͑Δࣄ͕Ͱ͖Δɻʢ։ൃͷखΛࢭΊͳ͍ɻʣ53
͜ͷϦϑΝΫλϦϯάํ๏ͷσϝϦοτ• ϩʔΧϧͷ։ൃڥΛ࡞͢Δࣄ͕ग़དྷͳ͍ɻ※ ࠓɺׂͱҰ൪·͍͠ॴɻ• DMS͕ࢭ·ͬͨ࣌ʹࢀরAPI͕ίέΔɻ※ τϦΨʔΤϥʔͰDMS͕ࢭ·ΔͱαʔϏε͕ࢭ·Δɻ• DMS͕Ԇͨ࣌͠ͷߟྀ͕͍͠ɻ※ ࠓͷॴɺக໋ইͳ͍ɻ(ই͕ແ͍ͱݴͬͯͳ͍)• ίϯϑϦΫτ͢Δࣄ͕ݒ೦͞ΕΔͷͰϦʔυϨϓϦΧʹτϦΨʔΛషͬͯͳ͍ͷͰϦʔυϨϓϦΧ͕Ϛελʔʹঢ֨͢ΔͱαʔϏε͕ࢭ·Δɻ54
DMSΛͬͨϦϑΝΫλϦϯάͷख๏·ͱΊ• AWS DMSͰ MySQL͔ΒPostgreSQLʹϨϓϦέʔγϣϯ͍ͯ͠Δɻ• DMS͕Ҡߦͨ͠λΠϛϯάͰઃఆͨ͠τϦΨʔ͕ൃಈͯ͠ϦϑΝΫλϦϯά͞ΕͨςʔϒϧʹॻࠐΛ͢Δɻ• ߋ৽ɾࢀরΛAPIܦ༝ʹ͢ΔࣄͰطଘͷ։ൃΛਐΊͭͭϦϑΝΫλϦϯάͨ͠DBʹࢀরΛΓସ͍͚͍͑ͯͯΔɻ• ϩʔΧϧͷڥߏங͕͍͠ͷͱɺDMS͕ࢭ·ͬͨ࣌ʹࢀরAPI͕ίέΔͷͰߟྀ͕͍͠ɻ55
ҠߦࣦഊͷࢹΛͲ͏͍ͯ͠Δ͔56
ҠߦࣦഊͷࢹΛͲ͏͍ͯ͠Δ͔ࠓ·Ͱ͓͖ͯͨ͠௨ΓɺDMSඇৗʹศརͳαʔϏεɻ͕ɺτϦΨʔσʔλҠߦλεΫ͕ίέΔͱͪʹγεςϜোʹͳΔσϝϦοτ͋Δɻ=> ͳΔૣ ͰDMS͕ࣦഊ͍ͯ͠Δࣄʹؾͮ͘Έ͕ඞཁ.57
ҠߦࣦഊͷࢹΛͲ͏͍ͯ͠Δ͔ୈ25ճதࠃํDBษڧձʹͯʰDBͷোΛͳΔૣͰݕ͢Δٕज़ʱͰൃදͯ͠·͢ɻ58
3ߦͰ• Ϋϥϝι͞ΜͷϒϩάͰհ͞Εٕͯͨज़ΛಡΜͰ• ͪΐͪ͜ΐͬ͜ͱԠ༻ͨ݁͠Ռ• MackerelͰࢹग़དྷΔΑ͏ʹͳͬͨɻ59
5. ·ͱΊ60
ࠓճͷDMSϦϑΝΫλϦϯάͷ࠷େͷϝϦοτຊདྷലେͳֻ͕͔Δ(͘͠ಡΊͳ͍)ͣͷDBϦϑΝΫλϦϯάͷॲཧΛDMSλεΫ(Ҡߦ୯Ґ)Λখͨ͘͞͠ࣄͰগͮͭ͠खΛೖΕΔࣄ͕ग़དྷΔɻͦͷ݁ՌɺӨڹൣғಡΈ͘͢վળΛਐΊΔࣄ͕ग़དྷͨɻ61
ݱࡏ• ӡ༻ͯ͠1ɻக໋ইແ͍͚ͲԿͱ͔ਐΜͰ͖ͨɻ(ই͕ແ͍ͱݴ͍ͬͯͳ͍)62
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂʂ63