AWS DMS を活用して MySQLからPostgreSQLへの移行とDBリファクタリングをやっている話/osc2018-kagawa-dms-replication

AWS DMS を活用して MySQLからPostgreSQLへの移行とDBリファクタリングをやっている話/osc2018-kagawa-dms-replication

2018年10月6日、 OSC2018 香川にてお話した
「AWS DMS を活用して MySQLからPostgreSQLへの移行とDBリファクタリングをやっている話」についてのスライドです。

現在、自社にて DBリファクタリングをやっています。

リファクタリング手法はAWS DMSを用いて MySQL(Aurora) から PostgreSQL への移行という形でリファクタリングを行っているのですがその内容をお話します。

F891bc57aad1b6bdbf344358e7fec3cc?s=128

Takahashi Ikki

October 04, 2018
Tweet

Transcript

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

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

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

    5. ·ͱΊ 3
  4. ࣗݾ঺հ • ߴڮ Ұٍ • ԬࢁͰWebΤϯδχΞ • ೔ຊPostgreSQLϢʔβʔձ தࠃࢧ෦௕ •

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

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

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

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

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

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

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

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

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

  14. ϦϑΝΫλϦϯάख๏ _2 • MySQL ͷࢦఆεΩʔϚͷςʔϒϧΛ AWS DMS Ͱ PostgreSQL΁Ҡ͢ɻ AWS

    DMS ͸ޙͰৄ͘͠આ໌͢Δ͕ɺ DMS͕ࣗಈͰPostgreSQLଆʹ MySQLଆͱಉ͡ߏ଄ͷςʔϒϧΛ ੜ੒ͯ͘͠ΕΔɻ 14
  15. ϦϑΝΫλϦϯάख๏ _3 • hoge εΩʔϚͷ ֤ςʔϒϧʹτϦΨʔΛઃఆ͢Δɻ • τϦΨʔͰσʔλΛՃ޻ͯ͠ ϦϑΝΫλϦϯά͞Εͨ ৽εΩʔϚͷ৽ςʔϒϧ΁

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

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

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

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

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

    DMS͕஗Ԇͨ࣌͠ͷߟྀ͕೉͍͠ɻ ※ ࠓͷॴɺக໋ই͸ͳ͍ɻ(ই͕ແ͍ͱ͸ݴͬͯͳ͍) 20
  21. 2. ϦϑΝΫλϦϯάख๏ ·ͱΊ • MySQL ͔Β AWS DMSʹΑͬͯPostgreSQLʹ ϨϓϦέʔγϣϯ͍ͯ͠Δɻ •

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

  23. AWS DMS ͱ͸ Database Migration Service ωοτϫʔΫӽ͠ʹ σʔλҠߦΛߦ͏ࣄ͕ग़དྷΔαʔϏε ※ ੍ݶ͕͋ͬͯɺίϐʔݩɾίϐʔઌͷ

    ͲͪΒ͔͕AWSͷΤϯυϙΠϯτͰແ ͍ͱɺϨϓϦέʔγϣϯΛ͢Δࣄ͕ग़དྷ ͳ͍ɻ 23
  24. AWS DMSͷΩʔϫʔυ • ιʔεΤϯυϙΠϯτ • σʔλͷίϐʔݩɻEC2onDB, RDS, ΦϯϓϨDB, S3 ͳͲɻ

    • λʔήοτΤϯυϙΠϯτ • σʔλͷίϐʔઌɻEC2onDB, RDS, ΦϯϓϨDB, S3, DynamoDB ͳͲɻ • ϨϓϦέʔγϣϯΠϯελϯε • ϨϓϦέʔγϣϯΛߦ͏Πϯελϯεɻ • λεΫ • ͲͷςʔϒϧΛͲͷΑ͏ʹҠߦ͢Δ͔ΛఆΊͨϧʔϧɻ 24
  25. ϨϓϦέʔγϣϯΠϯελϯεʹ͍ͭͯ • ΠϯελϯεΫϥε͸ T2, C4, R4ͷ̏छྨΛαϙʔτ. • T2: ։ൃɾݕূ༻ •

    C4: େྔͷԋࢉΛߦ͏৔߹ʹ໾ཱͭɻ (AWSతʹ͸ ҟछDBҠߦ͸͜ΕΛ͢͢Ί͍ͯΔ) • R4: ϝϞϦ૿ՃΠϯελϯεɻ (ҰճͷτϥϯβΫγϣϯ͕େ͖͍࣌͸͜Ε.) • ϚϧνAZʹରԠ͍ͯͯ͠ɺϑΣΠϧΦʔόʔΛαϙʔτ. • ࣮ࡍɺDMSͱ͓͕͔͔ͯۚ͠Δͷ͸͜ͷϨϓϦέʔγϣϯΠϯελϯεͷ ετϨʔδͷ෦෼͚ͩɻ 25
  26. ܧଓతͳϨϓϦέʔγϣϯλεΫʹ͍ͭͯ ओʹ2λΠϓ͋Δɻ • શϩʔυ+ܧଓతͳϨϓϦέʔγϣϯ(CDC). • ·ͣطଘͷσʔλΛϑϧϩʔυ͢Δɻ(PostgreSQLͩͱCOPYจ) ※ϑϧϩʔυͰ͸ಡΈࠐΈΛ࠷଎ʹ͢ΔҝʹϓϥΠϚϦΩʔ΍ΠϯσοΫε ͷੜ੒Λޙճ͠ʹ͢ΔΦϓγϣϯͱ͔͕͋Δɻ • ͦͷޙ͸τϥϯβΫγϣϯϩά͔ΒܧଓతʹϨϓϦέʔγϣϯΛߦ͏.

    ֤DBΤϯδϯຖʹઐ༻ͷػೳΛ࢖͏ɻ • ܧଓతͳϨϓϦέʔγϣϯ(CDC)ͷΈ 26
  27. λεΫʹ͍ͭͯ • ςʔϒϧ໊Λࢦఆͯ͠ϨϓϦέʔγϣϯΛ࣮ߦ͢Δɻ ςʔϒϧͷࢦఆํ๏͸̎छྨ • user: user ςʔϒϧͷΈΛର৅ͱ͢Δɻ • user_%:

    user_xxx ςʔϒϧʹ߹க͢ΔશͯͷςʔϒϧΛର৅ͱ͢ Δɻ • ֤λεΫຖʹιʔεσʔλͷϝλ৘ใΛอ͍࣋ͯ͠Δɻ • جຊతʹ͸λεΫ಺Ͱ͸ฒྻͰςʔϒϧ͕ϩʔυ͞ΕΔɻ(σϑΥϧτ8) 27
  28. λεΫʹ͍ͭͯ • ·ͨɺ֤ςʔϒϧʹରͯ͠ҠߦϧʔϧΛઃఆ͢Δࣄ͕ग़དྷ Δɻ • ྫ͑͹Ҡߦޙͷςʔϒϧ໊Λมߋͨ͠Γɻ • Ҡߦ͢Δର৅ͷσʔλʹ͍ͭͯ WHERE۟ͷΑ͏ʹϧʔϧΛઃఆͨ͠Γग़དྷΔɻ 28

  29. ݱࡏͷฐࣾͰͷλεΫઃఆ • user-replication-task • party-replication-task • reserve-replication-task etc... • λεΫઃఆํ਑

    ্هͷΑ͏ʹׂͱάϧʔϓ୯ҐͰ খ͘͞ϨϓϦέʔγϣϯλεΫΛઃఆͯ͠ ҠߦΛਐΊ͍ͯΔɻ • ཧ༝ Ҡߦ׬ྃͨ͠ςʔϒϧΑΓDMSͷλεΫΛ࡟আ͍ͯ͘͠ࣄΛ૝ఆ͍ͯ͠ΔͨΊɻ 29
  30. σϞಈը 30

  31. 31

  32. 3. AWS DMSʹ͍ͭͯ ·ͱΊ • DMS͸ωοτϫʔΫӽ͠ʹϨϓϦέʔγϣϯΛ࣮ݱ͢ΔαʔϏε. • σʔλͷίϐʔݩͱઌΛࢦఆͯ͠ҠߦϧʔϧͱͳΔλεΫΛ࡞੒͢ΔࣄͰ σʔλͷҠߦ͸શͯDMSͷ੹຿Ͱ࣮ݱͯ͘͠ΕΔɻ •

    λεΫͷཻ౓Λଟͨ͘͠Γখͨ͘͞͠Γ͢ΔࣄͰ શମͷϨϓϦέʔγϣϯͷཻ౓Λௐ੔ग़དྷΔɻ • DMS୯ମͱͯ͠͸ϨϓϦέʔγϣϯΠϯελϯεͷӡ༻අ͕͔͔Δఔ౓ͳͷͰ ҆ՁͰਐΊΔࣄ͕ग़དྷΔɻ • ฐࣾ͸Ҡߦޙফ͠΍͍͢Α͏ʹDMSͷཻ౓Λখ͘͢͞ΔࣄͰ ؅ཧΛ͍ͯ͠Δɻ 32
  33. 4. PostgreSQLΛҠߦઌʹબΜͩཧ༝ 33

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

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

  36. 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
  37. PostgreSQLτϦΨʔʹ͍ͭͯ • PostgreSQL͚ͩͷػೳ • UPDATE࣌ʹSETʹࢦఆΧϥϜ͕͋Δ৔߹ͷτϦΨʔΛఆٛग़དྷΔɻ • UPDATE࣌ʹࢦఆΧϥϜ͕࣮ࡍʹมߋ͞Εͨ৔߹ͷτϦΨʔΛఆٛग़དྷ Δɻ • ߦϨϕϧ͚ͩͰແͯ͘จϨϕϧͰτϦΨʔΛఆٛग़དྷΔɻ

    ※ ྫɿ DELETEͰ10ߦফ͑ͨͱͯ͠ɺߦϨϕϧ͸10֤݅ߦʹର࣮ͯ͠ߦ ͞ΕΔɻจϨϕϧ͸DELETEจʹର࣮ͯ͠ߦ͞ΕΔɻಛʹ TRUNCATEจ ʹରͯ͠༗ޮɻ 37
  38. PostgreSQLͷڧΈ(खଓ͖ܕݴޠ) ࣮ߦؔ਺ΛҎԼͷ֤ݴޠͰఆ͕ٛग़དྷΔɻ ໊শ ݴޠ ഑෍ํ๏ PL/pgSQL SQL جຊ഑෍ PL/Perl Perl

    جຊ഑෍ PL/Python Python جຊ഑෍ PL/Java Java ֦ு PL/v8 JavaScript ֦ு ※ ͦͷଞ 38
  39. PostgreSQLͷڧΈ(खଓ͖ܕݴޠ) • Amazon RDS͸ PL/Python Λαϙʔτͯ͠ͳ͍ɻɻ • PL/v8Λ࢖͍ͬͯΔɻ • PL/Python͕࢖͑ͳͯ͘

    ͦ΋ͦ΋ɺpgSQLͱv8͙Β͍͔͠બ୒ࢶ͕ແ͔ͬͨɻ ϕϯνϚʔΫͱͯ͠ pgSQLΑΓv8ͷํ͕਺ഒ଎͍ɺ ͱͷࣄͰpl/v8Λ࠾༻ɻ • ※ฐࣾͰ͸ϐϡΞJavaScriptΛ࢖͍ͬͯΔ͕ɺ CoffeeScript΍React.js΋࢖͑ΔΒ͍͠ɻ 39
  40. (ࢀߟ) PL/v8 ͷ༗ޮԽํ๏ جຊతʹ͸طʹplv8͸Πϯετʔϧ͞Ε͍ͯΔͷͰɺ extensionΛ༗ޮԽͯ͠΍Ε͹ok. # Extension͕ରԠͯ͠Δ͔νΣοΫ postgres=> show rds.extensions;

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

    JavaScript. 41
  42. 5. ·ͱΊ 42

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

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

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

  46. ࠂ஌ 46

  47. Πϕϯτࠂ஌ • ୈ25ճ தࠃ஍ํDBษڧձ in ௗऔ • 2018-12-01(౔) 13:00ʙ PostgreSQL

    11͸ੌ͍ͧʂ MySQL 8.0͸ੌ͍ͧʂ → ʮͲ͏΍ͬͯόʔδϣϯΞοϓ͢Δͷʁʯ ख๏Λ͓࿩ग़དྷΔߨࢣਞͷํΛ͓ট͖ͯ͠ ͝঺հ͠·͢ʂ 47
  48. Πϕϯτࠂ஌ • PostgreSQL Conference Japan 2018 ೔࣌ɿ 11݄22೔(໦) JPUG։࠵ͷPostgreSQLͷ૯߹ΧϯϑΝ ϨϯεΛ։࠵க͠·͢ɻ

    શ14ߨԋͷଞɺνϡʔτϦΞϧτϥο ΫͳͲ΋ઃ͚Δ༧ఆͰ͢ɻ 48
  49. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝· ͨ͠ʂʂ 49