Slide 1

Slide 1 text

AWS DMS Λ׆༻ͯ͠ MySQL͔ΒPostgreSQL΁ͷҠߦͱ DBϦϑΝΫλϦϯάΛ΍͍ͬͯΔ࿩ 2018-10-06 OSC2018 ߳઒ JPUG தࠃࢧ෦௕ ߴڮ Ұٍ 1

Slide 2

Slide 2 text

஫ҙࣄ߲ • εϥΠυ͸ެ։͠·͢ɻ • ࣭໰ͱ͔͝ࢦఠͱ͔͋Ε͹ #osc18kg ΁ ͓ئ͍க͠·͢ɻ 2

Slide 3

Slide 3 text

͓͠ͳ͕͖ 1. ࣗݾ঺հ 2. ϦϑΝΫλϦϯάख๏ 3. AWS DMSͱ͸ 4. PostgreSQLΛҠߦઌʹબΜͩཧ༝ 5. ·ͱΊ 3

Slide 4

Slide 4 text

ࣗݾ঺հ • ߴڮ Ұٍ • ԬࢁͰWebΤϯδχΞ • ೔ຊPostgreSQLϢʔβʔձ தࠃࢧ෦௕ • PostgreSQLྺ 3ϲ݄ ! • ϋϦωζϛͱωζϛͷҧ͍ʹ͍ͭͯ ஌ݟ͋Γ·͢ɻ 4

Slide 5

Slide 5 text

ࠓ೔ͷ֓ཁ • ʮMySQL͔ΒPostgreSQL΁ͷҠߦͱDBϦϑΝΫλϦϯάʯ • ๻͕ಇ͍ͯΔ৬৔Ͱࠓ·͞ʹಈ͍͍ͯΔϓϩδΣΫτ • ࠓͷ৬৔ͷαʔϏε... ϩʔϯν͔Β໿̓೥ɺ৭Μͳେਓͷࣄ৘͔Β ͦΕͳΓʹ͍ΘΏΔٕज़తෛ࠴ͱݺ͹ΕΔ΋ͷ͕͋Δɻ 5

Slide 6

Slide 6 text

ྫ͑͹ɾɾ ʮσʔλϕʔεߏ଄ΛோΊΔձ΍Ζ͏ʂʯ 6

Slide 7

Slide 7 text

ྫ͑͹ɾɾ ʮσʔλϕʔεߏ଄ΛோΊΔձ΍Ζ͏ʂʯ ʮ͜ͷςʔϒϧԿͷͨΊͷ΋ͷ͔୭͔஌ͬͯΔʁʯ 7

Slide 8

Slide 8 text

ྫ͑͹ɾɾ ʮσʔλϕʔεߏ଄ΛோΊΔձ΍Ζ͏ʂʯ ʮ͜ͷςʔϒϧԿͷͨΊͷ΋ͷ͔୭͔஌ͬͯΔʁʯ ʮʮʮ͍΍͊ɻɻɻ ! ʁʯʯʯ 8

Slide 9

Slide 9 text

ྫ͑͹ɾɾ ʮσʔλϕʔεߏ଄ΛோΊΔձ΍Ζ͏ʂʯ ʮ͜ͷςʔϒϧԿͷͨΊͷ΋ͷ͔୭͔஌ͬͯΔʁʯ ʮʮʮ͍΍͊ɻɻɻ ! ʁʯʯʯ ୭΋஌Βͳ͍ςʔϒϧͷڪා... 9

Slide 10

Slide 10 text

՝୊ • ࠓޙͷࣄۀͷ੒௕ͳͲ΋ݟӽͯ͠ WebϖʔδͷϦϑΝΫλϦϯά΋ඞཁͩ͠ɺ RDBͷϦϑΝΫλϦϯά΋ඞཁ. • ͳΔ΂͘ແఀࢭͰ͔ͭԁ׈ʹ։ൃΛਐΊΔͨΊʹ ߟ͑ͨRDBϦϑΝΫλϦϯάͷํ๏Λ͝঺հͤͯ͞௖͖· ͢ʂʂ 10

Slide 11

Slide 11 text

՝୊ • ࠓޙͷࣄۀͷ੒௕ͳͲ΋ݟӽͯ͠ WebϖʔδͷϦϑΝΫλϦϯά΋ඞཁͩ͠ɺ RDBͷϦϑΝΫλϦϯά΋ඞཁ. • ͳΔ΂͘ແఀࢭͰ͔ͭԁ׈ʹ։ൃΛਐΊΔͨΊʹ ฐࣾCTOͦʔ͍ͩ(@soudai1025)͞Μ͕ ߟ͑ͨRDBϦϑΝΫλϦϯάͷํ๏ Λ͝঺հͤͯ͞௖͖·͢ʂʂ 11

Slide 12

Slide 12 text

2. ϦϑΝΫλϦϯάख๏ 12

Slide 13

Slide 13 text

ϦϑΝΫλϦϯάख๏ _1 ӡ༻͍ͯ͠Δෳ਺ͷαʔϏε͕MySQL ͷσʔλϕʔεΛࢀর͍ͯ͠Δɻ ՝୊ ޻਺͕ݶΒΕ͍ͯΔҝɺϦϑΝΫλϦϯ άͯ̐ͭ͠ͷαʔϏεʹखΛೖΕ͍ͯ͘ ࣄ͸೉͍͠ɻ 13

Slide 14

Slide 14 text

ϦϑΝΫλϦϯάख๏ _2 • MySQL ͷࢦఆεΩʔϚͷςʔϒϧΛ AWS DMS Ͱ PostgreSQL΁Ҡ͢ɻ AWS DMS ͸ޙͰৄ͘͠આ໌͢Δ͕ɺ DMS͕ࣗಈͰPostgreSQLଆʹ MySQLଆͱಉ͡ߏ଄ͷςʔϒϧΛ ੜ੒ͯ͘͠ΕΔɻ 14

Slide 15

Slide 15 text

ϦϑΝΫλϦϯάख๏ _3 • hoge εΩʔϚͷ ֤ςʔϒϧʹτϦΨʔΛઃఆ͢Δɻ • τϦΨʔͰσʔλΛՃ޻ͯ͠ ϦϑΝΫλϦϯά͞Εͨ ৽εΩʔϚͷ৽ςʔϒϧ΁ ొ࿥͢Δɻ 15

Slide 16

Slide 16 text

ϦϑΝΫλϦϯάख๏ 1. MySQLΛDMSͰPostgreSQL΁Ҡ͢ɻ 2. DMSͰॻ͖ࠐ·ΕΔPostgreSQLͷ ֤ςʔϒϧʹτϦΨʔΛఆٛͯ͠ ৽ςʔϒϧ΁ొ࿥͢Δɻ 3. ֤αʔϏεͰ৽ςʔϒϧΛࢀর͢Δ Α͏ʹ੾Γସ͍͑ͯ͘ɻ 16

Slide 17

Slide 17 text

ࢀরͷ੾Γସ͑ํ๏ ՝୊ • ςʔϒϧͷࢀরΛ৽PostgreSQL΁Ұؾʹ੾Γସ͑Δͱ ݱࡏՔಇதͷαʔϏεͷιʔεͰ֘౰ςʔϒϧࢀরՕॴΛ શͯચ͍ग़͠Λͯ͠मਖ਼Λߦ͏ඞཁ͕͋Δɻ • ޻਺͕ಡΈͮΒ͍͠શͯͷ৔ॴͷमਖ਼Λߦ͏ඞཁ͕͋Δҝɺ όάͷةݥੑΛ͸ΒΜͰ͠·͏ɻ 17

Slide 18

Slide 18 text

ࢀরͷ੾Γସ͑ํ๏ ೋछྨͷAPIΛ࡞ͬͯAPIܦ༝Ͱߋ৽ͱࢀরΛ΍͍ͬͯΔɻ • ߋ৽API • MySQLɺPostgreSQLͷͲͪΒʹॻ͖ࠐΉ͔ΛϑϥάͰ͍࣋ͬͯͯ ݱࡏ͸MySQLͷํʹॻ͖ࠐΜͰ͍Δɻ • શͯͷ੾Γସ͕͑ऴΘͬͨλΠϛϯάͰPostgreSQLͷํΛॻࠐ͢ΔΑ͏ʹ੾ Γସ͍͑ͯ͘ɻ • ࢀরAPI • PostgreSQLͷσʔλͷΈࢀর͢Δɻ 18

Slide 19

Slide 19 text

͜ͷϦϑΝΫλϦϯάํ๏ͷϝϦοτ • ߋ৽API͸MySQL΁ॻࠐΛ͢ΔͷͰগͮͭ͠APIܦ༝ʹͯ͠΋ ςʔϒϧͷࢀরՕॴʹӨڹ͕ແ͍ɻ • ͍ΘΏΔ ΧφϦΞϦϦʔε ͷΑ͏ʹ গͮͭ͠վળΛਐΊ͍͚ͯΔɻ 19

Slide 20

Slide 20 text

͜ͷϦϑΝΫλϦϯάํ๏ͷσϝϦοτ • ϩʔΧϧͷ։ൃ؀ڥΛ࡞੒͢Δࣄ͕ग़དྷͳ͍ɻ ※ ࠓɺׂͱҰ൪೰·͍͠ॴɻ • DMS͕ࢭ·ͬͨ࣌ʹࢀরAPI͕ίέΔɻ ※ τϦΨʔΤϥʔ౳ͰDMS͕ࢭ·ΔͱγεςϜ͕ࢭ·Δɻ • DMS͕஗Ԇͨ࣌͠ͷߟྀ͕೉͍͠ɻ ※ ࠓͷॴɺக໋ই͸ͳ͍ɻ(ই͕ແ͍ͱ͸ݴͬͯͳ͍) 20

Slide 21

Slide 21 text

2. ϦϑΝΫλϦϯάख๏ ·ͱΊ • MySQL ͔Β AWS DMSʹΑͬͯPostgreSQLʹ ϨϓϦέʔγϣϯ͍ͯ͠Δɻ • DMS͕ॻ͖ࠐΜͩλΠϛϯάͰઃఆͨ͠τϦΨʔ͕ൃಈͯ͠ ϦϑΝΫλϦϯά͞ΕͨςʔϒϧʹॻࠐΛ͢Δɻ • ߋ৽ɾࢀরΛAPIܦ༝ʹ͢ΔࣄͰطଘͷ։ൃΛਐΊͭͭ ϦϑΝΫλϦϯάͨ͠DBʹࢀরΛ੾Γସ͍͚͍͑ͯͯΔɻ • ϩʔΧϧͷ؀ڥߏங͕೉͍͠ͷͱɺDMS͕ࢭ·ͬͨ࣌ʹ ࢀরAPI͕ίέΔͷͰߟྀ͕೉͍͠ɻ 21

Slide 22

Slide 22 text

3. AWS DMS ͱ͸ 22

Slide 23

Slide 23 text

AWS DMS ͱ͸ Database Migration Service ωοτϫʔΫӽ͠ʹ σʔλҠߦΛߦ͏ࣄ͕ग़དྷΔαʔϏε ※ ੍ݶ͕͋ͬͯɺίϐʔݩɾίϐʔઌͷ ͲͪΒ͔͕AWSͷΤϯυϙΠϯτͰແ ͍ͱɺϨϓϦέʔγϣϯΛ͢Δࣄ͕ग़དྷ ͳ͍ɻ 23

Slide 24

Slide 24 text

AWS DMSͷΩʔϫʔυ • ιʔεΤϯυϙΠϯτ • σʔλͷίϐʔݩɻEC2onDB, RDS, ΦϯϓϨDB, S3 ͳͲɻ • λʔήοτΤϯυϙΠϯτ • σʔλͷίϐʔઌɻEC2onDB, RDS, ΦϯϓϨDB, S3, DynamoDB ͳͲɻ • ϨϓϦέʔγϣϯΠϯελϯε • ϨϓϦέʔγϣϯΛߦ͏Πϯελϯεɻ • λεΫ • ͲͷςʔϒϧΛͲͷΑ͏ʹҠߦ͢Δ͔ΛఆΊͨϧʔϧɻ 24

Slide 25

Slide 25 text

ϨϓϦέʔγϣϯΠϯελϯεʹ͍ͭͯ • ΠϯελϯεΫϥε͸ T2, C4, R4ͷ̏छྨΛαϙʔτ. • T2: ։ൃɾݕূ༻ • C4: େྔͷԋࢉΛߦ͏৔߹ʹ໾ཱͭɻ (AWSతʹ͸ ҟछDBҠߦ͸͜ΕΛ͢͢Ί͍ͯΔ) • R4: ϝϞϦ૿ՃΠϯελϯεɻ (ҰճͷτϥϯβΫγϣϯ͕େ͖͍࣌͸͜Ε.) • ϚϧνAZʹରԠ͍ͯͯ͠ɺϑΣΠϧΦʔόʔΛαϙʔτ. • ࣮ࡍɺDMSͱ͓͕͔͔ͯۚ͠Δͷ͸͜ͷϨϓϦέʔγϣϯΠϯελϯεͷ ετϨʔδͷ෦෼͚ͩɻ 25

Slide 26

Slide 26 text

ܧଓతͳϨϓϦέʔγϣϯλεΫʹ͍ͭͯ ओʹ2λΠϓ͋Δɻ • શϩʔυ+ܧଓతͳϨϓϦέʔγϣϯ(CDC). • ·ͣطଘͷσʔλΛϑϧϩʔυ͢Δɻ(PostgreSQLͩͱCOPYจ) ※ϑϧϩʔυͰ͸ಡΈࠐΈΛ࠷଎ʹ͢ΔҝʹϓϥΠϚϦΩʔ΍ΠϯσοΫε ͷੜ੒Λޙճ͠ʹ͢ΔΦϓγϣϯͱ͔͕͋Δɻ • ͦͷޙ͸τϥϯβΫγϣϯϩά͔ΒܧଓతʹϨϓϦέʔγϣϯΛߦ͏. ֤DBΤϯδϯຖʹઐ༻ͷػೳΛ࢖͏ɻ • ܧଓతͳϨϓϦέʔγϣϯ(CDC)ͷΈ 26

Slide 27

Slide 27 text

λεΫʹ͍ͭͯ • ςʔϒϧ໊Λࢦఆͯ͠ϨϓϦέʔγϣϯΛ࣮ߦ͢Δɻ ςʔϒϧͷࢦఆํ๏͸̎छྨ • user: user ςʔϒϧͷΈΛର৅ͱ͢Δɻ • user_%: user_xxx ςʔϒϧʹ߹க͢ΔશͯͷςʔϒϧΛର৅ͱ͢ Δɻ • ֤λεΫຖʹιʔεσʔλͷϝλ৘ใΛอ͍࣋ͯ͠Δɻ • جຊతʹ͸λεΫ಺Ͱ͸ฒྻͰςʔϒϧ͕ϩʔυ͞ΕΔɻ(σϑΥϧτ8) 27

Slide 28

Slide 28 text

λεΫʹ͍ͭͯ • ·ͨɺ֤ςʔϒϧʹରͯ͠ҠߦϧʔϧΛઃఆ͢Δࣄ͕ग़དྷ Δɻ • ྫ͑͹Ҡߦޙͷςʔϒϧ໊Λมߋͨ͠Γɻ • Ҡߦ͢Δର৅ͷσʔλʹ͍ͭͯ WHERE۟ͷΑ͏ʹϧʔϧΛઃఆͨ͠Γग़དྷΔɻ 28

Slide 29

Slide 29 text

ݱࡏͷฐࣾͰͷλεΫઃఆ • user-replication-task • party-replication-task • reserve-replication-task etc... • λεΫઃఆํ਑ ্هͷΑ͏ʹׂͱάϧʔϓ୯ҐͰ খ͘͞ϨϓϦέʔγϣϯλεΫΛઃఆͯ͠ ҠߦΛਐΊ͍ͯΔɻ • ཧ༝ Ҡߦ׬ྃͨ͠ςʔϒϧΑΓDMSͷλεΫΛ࡟আ͍ͯ͘͠ࣄΛ૝ఆ͍ͯ͠ΔͨΊɻ 29

Slide 30

Slide 30 text

σϞಈը 30

Slide 31

Slide 31 text

31

Slide 32

Slide 32 text

3. AWS DMSʹ͍ͭͯ ·ͱΊ • DMS͸ωοτϫʔΫӽ͠ʹϨϓϦέʔγϣϯΛ࣮ݱ͢ΔαʔϏε. • σʔλͷίϐʔݩͱઌΛࢦఆͯ͠ҠߦϧʔϧͱͳΔλεΫΛ࡞੒͢ΔࣄͰ σʔλͷҠߦ͸શͯDMSͷ੹຿Ͱ࣮ݱͯ͘͠ΕΔɻ • λεΫͷཻ౓Λଟͨ͘͠Γখͨ͘͞͠Γ͢ΔࣄͰ શମͷϨϓϦέʔγϣϯͷཻ౓Λௐ੔ग़དྷΔɻ • DMS୯ମͱͯ͠͸ϨϓϦέʔγϣϯΠϯελϯεͷӡ༻අ͕͔͔Δఔ౓ͳͷͰ ҆ՁͰਐΊΔࣄ͕ग़དྷΔɻ • ฐࣾ͸Ҡߦޙফ͠΍͍͢Α͏ʹDMSͷཻ౓Λখ͘͢͞ΔࣄͰ ؅ཧΛ͍ͯ͠Δɻ 32

Slide 33

Slide 33 text

4. PostgreSQLΛҠߦઌʹબΜͩཧ༝ 33

Slide 34

Slide 34 text

ͦΓΌɺ(JPUGཧࣄ͕ೋਓ΋ډΔΜ΍͔Β) ͦ͏΍Ζɻ 34

Slide 35

Slide 35 text

ͱ͍͏ͷ͸ຊԻɺͰ͸ͳ͍Ͱ͕͢ɻ 35

Slide 36

Slide 36 text

PostgreSQLτϦΨʔʹ͍ͭͯ CREATE TRIGGER 'τϦΨʔ໊' trigger_time trigger_event ON 'ςʔϒϧ໊' FOR EACH ROW '࣮ߦؔ਺' MySQL PostgreSQL trigger_time BEFORE, AFTER BEFORE, AFTER trigger_event INSERT,UPDATE,DELETE ͔ΒҰͭͷΈબ୒ INSERT,UPDATE,DELETE ͔Βෳ਺બ୒ ෳ਺τϦΨʔ ֤Πϕϯτຖʹ1ͭͣͭ (※ v5.6·Ͱ) ෳ਺ࢦఆՄೳ 36

Slide 37

Slide 37 text

PostgreSQLτϦΨʔʹ͍ͭͯ • PostgreSQL͚ͩͷػೳ • UPDATE࣌ʹSETʹࢦఆΧϥϜ͕͋Δ৔߹ͷτϦΨʔΛఆٛग़དྷΔɻ • UPDATE࣌ʹࢦఆΧϥϜ͕࣮ࡍʹมߋ͞Εͨ৔߹ͷτϦΨʔΛఆٛग़དྷ Δɻ • ߦϨϕϧ͚ͩͰແͯ͘จϨϕϧͰτϦΨʔΛఆٛग़དྷΔɻ ※ ྫɿ DELETEͰ10ߦফ͑ͨͱͯ͠ɺߦϨϕϧ͸10֤݅ߦʹର࣮ͯ͠ߦ ͞ΕΔɻจϨϕϧ͸DELETEจʹର࣮ͯ͠ߦ͞ΕΔɻಛʹ TRUNCATEจ ʹରͯ͠༗ޮɻ 37

Slide 38

Slide 38 text

PostgreSQLͷڧΈ(खଓ͖ܕݴޠ) ࣮ߦؔ਺ΛҎԼͷ֤ݴޠͰఆ͕ٛग़དྷΔɻ ໊শ ݴޠ ഑෍ํ๏ PL/pgSQL SQL جຊ഑෍ PL/Perl Perl جຊ഑෍ PL/Python Python جຊ഑෍ PL/Java Java ֦ு PL/v8 JavaScript ֦ு ※ ͦͷଞ 38

Slide 39

Slide 39 text

PostgreSQLͷڧΈ(खଓ͖ܕݴޠ) • Amazon RDS͸ PL/Python Λαϙʔτͯ͠ͳ͍ɻɻ • PL/v8Λ࢖͍ͬͯΔɻ • PL/Python͕࢖͑ͳͯ͘ ͦ΋ͦ΋ɺpgSQLͱv8͙Β͍͔͠બ୒ࢶ͕ແ͔ͬͨɻ ϕϯνϚʔΫͱͯ͠ pgSQLΑΓv8ͷํ͕਺ഒ଎͍ɺ ͱͷࣄͰpl/v8Λ࠾༻ɻ • ※ฐࣾͰ͸ϐϡΞJavaScriptΛ࢖͍ͬͯΔ͕ɺ CoffeeScript΍React.js΋࢖͑ΔΒ͍͠ɻ 39

Slide 40

Slide 40 text

(ࢀߟ) PL/v8 ͷ༗ޮԽํ๏ جຊతʹ͸طʹplv8͸Πϯετʔϧ͞Ε͍ͯΔͷͰɺ extensionΛ༗ޮԽͯ͠΍Ε͹ok. # Extension͕ରԠͯ͠Δ͔νΣοΫ postgres=> show rds.extensions; postgres=> create extension plv8; CREATE EXTENSION 40

Slide 41

Slide 41 text

4. PostgreSQLΛҠߦઌʹબΜͩཧ༝ ·ͱΊ • PostgreSQLͰ͸τϦΨʔΛॊೈʹఆٛ͢Δࣄ͕ग़དྷΔɻ • ·ͨPostgreSQLͰ͸τϦΨʔʹࢦఆ͢ΔϢʔβʔఆٛؔ਺ͷ ࢖༻ݴޠͱͯ͠ෳ਺ͷݴޠΛαϙʔτ͍ͯ͠Δɻ • ݱࡏɺ࠾༻͍ͯ͠Δͷ͸ JavaScript. 41

Slide 42

Slide 42 text

5. ·ͱΊ 42

Slide 43

Slide 43 text

AWS DMS͸҆ͯ͘खܰʹࢼͤͯ Ҡߦπʔϧͱͯ͠࢖͍΍͍͢ɻ 43

Slide 44

Slide 44 text

ࠓճͷDMSϦϑΝΫλϦϯάͷ ࠷େͷϝϦοτ ຊདྷലେͳ޻਺ֻ͕͔Δ(΋͘͠͸ಡΊͳ͍) DBϦϑΝΫλϦϯάͷॲཧΛDMSλεΫΛখ͘͞ ·ͨɺҠߦ୯ҐΛখ͍ͯ͘͘͞͠ࣄͰมߋΛڪΕͣ ͲΜͲΜվળ͍͚ͯ͠Δ෦෼ʹ͋Δͱࢥ͏ɻ 44

Slide 45

Slide 45 text

ݱࡏ • ·ͩ·ͩ૸Γ࢝Ίͨ͹͔ΓͰக໋ই͸ແ͍ɻ (ই͕ແ͍ͱ͸ݴ͍ͬͯͳ͍) • ͜Ε͔Β΋૸͍ͬͯ͘தͰ৭Μͳ஍ࠈΛݟ͍ͯ͘ͱࢥ͏ɻ ౎౓Ξ΢τϓοτ͍ͯ͘͠ͷͰָ͓͠Έʹʂʂ 45

Slide 46

Slide 46 text

ࠂ஌ 46

Slide 47

Slide 47 text

Πϕϯτࠂ஌ • ୈ25ճ தࠃ஍ํDBษڧձ in ௗऔ • 2018-12-01(౔) 13:00ʙ PostgreSQL 11͸ੌ͍ͧʂ MySQL 8.0͸ੌ͍ͧʂ → ʮͲ͏΍ͬͯόʔδϣϯΞοϓ͢Δͷʁʯ ख๏Λ͓࿩ग़དྷΔߨࢣਞͷํΛ͓ট͖ͯ͠ ͝঺հ͠·͢ʂ 47

Slide 48

Slide 48 text

Πϕϯτࠂ஌ • PostgreSQL Conference Japan 2018 ೔࣌ɿ 11݄22೔(໦) JPUG։࠵ͷPostgreSQLͷ૯߹ΧϯϑΝ ϨϯεΛ։࠵க͠·͢ɻ શ14ߨԋͷଞɺνϡʔτϦΞϧτϥο ΫͳͲ΋ઃ͚Δ༧ఆͰ͢ɻ 48

Slide 49

Slide 49 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝· ͨ͠ʂʂ 49