MySQLからPostgreSQLへの移行とDBリファクタリング/postgresqlJapan2018

 MySQLからPostgreSQLへの移行とDBリファクタリング/postgresqlJapan2018

2018-11-22 に行われた PostgreSQL Conference Japan 2018 のスライドです!

F891bc57aad1b6bdbf344358e7fec3cc?s=128

Takahashi Ikki

November 22, 2018
Tweet

Transcript

  1. MySQL ͔Β PostgreSQL ΁ͷҠߦͱ DBϦϑΝΫλϦϯά 2018-11-22 PostgreSQL Conference Japan 2018

    ೔ຊPostgreSQLϢʔβʔձ தࠃ஍ํࢧ෦௕ ߴڮ Ұٍ 1
  2. ͓͠ͳ͕͖ 1. ࣗݾ঺հ 2. DBϦϑΝΫλϦϯάΛ΍Δཧ༝ͱͦͷख๏ 3. MySQL͔ΒPostgreSQLΛҠߦઌʹબΜͩཧ༝ 4. AWS Database

    Migration Serviceͱ͸ 5. Ҡߦࣦഊͷ؂ࢹΛͲͷΑ͏ʹ΍͍ͬͯΔ͔ 6. ·ͱΊ 2
  3. ஫ҙࣄ߲ • εϥΠυ͸ެ։͠·͢ɻ • ࣭໰ͱ͔͝ࢦఠͱ͔ॾʑͷϑΟʔυόοΫ͕͍͟͝·ͨ͠Β #pgcon18j ΁ ͓ئ͍க͠·͢ɻ • EC2

    ΍ RDS ͳͲͱ͍ͬͨAWSͷαʔϏεͷࣄલ஌͕ࣝඞཁͰ͢ɻ • EC2: AWS͕ఏڙ͢ΔԾ૝αʔόʔ • RDS: AWS͕ఏڙ͢ΔϚωʔδυRDBαʔϏε 3
  4. 1. ࣗݾ঺հ • ߴڮ Ұٍ • Ԭࢁࡏॅ • גࣜձࣾΦϛΧϨ WebΤϯδχΞ

    • ೔ຊPostgreSQLϢʔβʔձ தࠃࢧ෦௕ • PostgreSQLྺ 4ϲ݄ ! 4
  5. גࣜձࣾΦϛΧϨ (ࣗࣾʹ͍ͭͯͪΐͬͱએ఻) શࠃ35,000݅ͷࠗ׆ύʔςΟΛ ܝࡌͨ͠ϙʔλϧαΠτ 25ສਓڧͷձһͷํʑʹ͝ར༻௖͍͍ͯ· ͢ɻ ࠗ׆ͱݴ͑͹ΦϛΧϨʂ \\݁ࠗ͸͍͍ͧʂʂ// 5

  6. ʮMySQL͔ΒPostgreSQL΁ͷҠߦͱDBϦϑΝΫλϦϯάʯ ΦϛΧϨͰݱࡏਐߦதͷϓϩδΣΫτɻ • ԿނDBϦϑΝΫλϦϯάΛ΍Δͷ͔ɻ • ԿނMySQL͔ΒPostgreSQLͳͷ͔ɻ • Τϥʔͷ؂ࢹ͸Ͳ͏΍͍ͬͯΔͷ͔ɻ • ͲΜͳࣄͰ೰Μͩͷ͔ɻ

    6
  7. 2. DBϦϑΝΫλϦϯάΛ΍Δཧ༝ͱ ͦͷख๏ 7

  8. ΦϛΧϨʹ͍ͭͯ • αʔϏε։͔࢝Β໿̓೥͕ܦա͍ͯ͠Δɻ • ͜͜൒೥ఔͰ ։ൃਓһ͕ࣾһ1໊ + ֎஫ ͷମ੍͔Β ࣾһ6໊

    ͷମ੍ʹมֵɻ • ৭Μͳେਓͷࣄ৘͔ΒͦΕͳΓʹ͍ΘΏΔٕज़తෛ࠴ͱݺ͹ ΕΔ΋ͷ͕͋Δɻ 8
  9. ྫ͑͹ɾɾ ʮσʔλϕʔεߏ଄ΛோΊΔձ΍Ζ͏ʂʯ 9

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

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

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

  13. gender ΧϥϜ ૝ఆ ࣮ࡍ ܕ int ೖΔσʔλ 0, 1, 2

    σʔλͷҙຯ 0: ະఆٛ, 1: உੑ, 2: ঁੑ 13
  14. gender ΧϥϜ ૝ఆ ࣮ࡍ ܕ int varchar ೖΔσʔλ 0, 1,

    2 0, 1, 2, உੑ, ঁੑ σʔλͷҙຯ 0: ະఆٛ, 1: உੑ, 2: ঁੑ 0: ະఆٛ, 1: உੑ, 2: ঁੑ 14
  15. ݱঢ়ͷ՝୊ • ࠓޙͷࣄۀͷ੒௕ͷҝʹ͸εϐʔυײ͕ඞཁෆՄܽɻ • Webʹ΋RDBʹ΋ϦϑΝΫλϦϯάͷ՝୊͕͋Δɻ • ݶΒΕͨϦιʔεΛશͯϦϑΝΫλϦϯάʹׂ͘ࣄ͸ग़དྷͳ͍ɻ • ͳΔ΂͘ແఀࢭͰ͔ͭԁ׈ʹ։ൃΛਐΊΔͨΊʹ ߟ͑ͨRDBϦϑΝΫλϦϯάͷํ๏Λ

    ͝঺հͤͯ͞௖͖·͢ʂʂ 15
  16. ݱঢ়ͷ՝୊ • ࠓޙͷࣄۀͷ੒௕ͷҝʹ͸εϐʔυײ͕ඞཁෆՄܽɻ • Webʹ΋RDBʹ΋ϦϑΝΫλϦϯάͷ՝୊͕͋Δɻ • ݶΒΕͨϦιʔεΛશͯϦϑΝΫλϦϯάʹׂ͘ࣄ͸ग़དྷͳ͍ɻ • ͳΔ΂͘ແఀࢭͰ͔ͭԁ׈ʹ։ൃΛਐΊΔͨΊʹ ฐࣾCTOͦʔ͍ͩ(@soudai1025)͞Μ͕

    ߟ͑ͨRDBϦϑΝΫλϦϯάͷํ๏Λ ͝঺հͤͯ͞௖͖·͢ʂʂ 16
  17. ϦϑΝΫλϦϯάख๏ 17

  18. ݱঢ়ͷΞʔΩςΫνϟ ෳ਺ͷαʔϏε͕ӡ༻͞Ε͓ͯΓ ୯ҰͷMySQLͷhogeεΩʔϚ͔Β σʔλΛࢀর͍ͯ͠Δɻ ՝୊ • ޻਺͕ݶΒΕ͍ͯΔҝɺ ϦϑΝΫλϦϯάͨ͠ޙɺશαʔϏεͷ ࢀরՕॴͷमਖ਼Λ͍ͯ͘͠ͷ͸೉͍͠ɻ •

    Өڹൣғ͕ಡΊͳ͍ɻ 18
  19. WebͷϦϑΝΫλϦϯάํ๏ APIαʔϏεΛ৽͘͠࡞Γɺ ֤ػೳΛݸผͷAPIͱͯ͠࡞੒͢Δɻ APIΛ࡞੒͢Δஈ֊Ͱ֤αʔϏεͰෆཁʹͳͬͯ ͍ΔॲཧͳͲΛ࡟আͯ͠ϦϑΝΫλϦϯά͢Δɻ ·ͨɺAPIܦ༝ʹมߋΛ͢ΔλΠϛϯάͰWebଆ ͷίʔυ΋ϦϑΝΫλϦϯά͢Δɻ ྫ͑͹ • ΦϛΧϨձһొ࿥/ࢀরAPI

    • ࠗ׆ύʔςΟΛݕࡧ͢Δػೳ • ࠗ׆ύʔςΟͷ༧໿͢ΔAPI 19
  20. DBͷϦϑΝΫλϦϯάํ๏ • ผͷΠϯελϯεΛ༻ҙ͠ɺ AWS Database Migration ServiceΛ ࢖༻ͯ͠ϨϓϦέʔγϣϯ͢Δɻ • ϨϓϦέʔγϣϯ͞ΕͨλΠϛϯάͰ

    DBͷτϦΨʔΛൃಈͤ͞Δɻ • τϦΨʔ಺ͰچσʔλΛՃ޻͠ ϦϑΝΫλϦϯάͨ͠ςʔϒϧͷ ܗࣜʹ߹͏Α͏ʹొ࿥͢Δɻ • ࠓޙ͸NEWεΩʔϚΛࢀর͢Δɻ 20
  21. ϦϑΝΫλϦϯάख๏ • Web͸গͮͭ͠APIܦ༝Ͱ ࢀরɾॻࠐ͢ΔΑ͏ʹมߋΛ ਐΊΔɻ (WebͷϦϑΝΫλϦϯά) • API͸ॻࠐ͸MySQLଆ΁ߦ͍ɺ ಡࠐ͸PostgreSQLଆ͔Βߦ͏ɻ (DBͷϦϑΝΫλϦϯά)

    • WebଆΛશͯAPIܦ༝ʹग़དྷͨΒ APIͷॻࠐ΋PostgreSQLଆ΁ มߋ͢Δɻ 21
  22. 22

  23. ͜ͷϦϑΝΫλϦϯάํ๏ͷϝϦοτ • ߋ৽API͸MySQL΁ॻࠐΛ͢ΔͷͰগͮͭ͠APIܦ༝ʹͯ͠΋ طଘαʔϏεͷςʔϒϧͷࢀরՕॴʹӨڹ͕ແ͍ɻ • ҰՕॴAPIܦ༝ʹͯ͠ΈΔ → ໰୊͕͋Ε͹ௐ੔͢Δɻˠ ... ͳͲͷΑ͏ʹ

    ΧφϦΞϦϦʔε ܗࣜͰ গͮͭ͠վળΛਐΊ͍͚ͯΔɻ • σʔλͷಡࠐ͸PostgreSQL͔Βߦ͏ͷͰ ॻࠐAPIΛݺͿଆ͸ͲͪΒʹॻ͖ࠐΜͰ͍Δ͔Λ ؾʹ͠ͳͯ͘΋ྑ͍ɻ 23
  24. ͜ͷϦϑΝΫλϦϯάํ๏ͷσϝϦοτ • ϩʔΧϧͷ։ൃ؀ڥΛ࡞੒͢Δࣄ͕ग़དྷͳ͍ɻ ※ ࠓɺׂͱҰ൪೰·͍͠ॴɻ • DMS͕ࢭ·ͬͨ࣌ʹࢀরAPI͕ίέΔɻ ※ τϦΨʔΤϥʔ౳ͰDMS͕ࢭ·ΔͱαʔϏε͕ࢭ·Δɻ •

    DMS͕஗Ԇͨ࣌͠ͷߟྀ͕೉͍͠ɻ ※ ࠓͷॴɺக໋ই͸ͳ͍ɻ(ই͕ແ͍ͱ͸ݴͬͯͳ͍) • ίϯϑϦΫτ͢Δࣄ͕ݒ೦͞ΕΔͷͰϦʔυϨϓϦΧʹ·ͰτϦΨʔΛషΕͳ͍͕ ϦʔυϨϓϦΧ͕Ϛελʔʹঢ֨͢ΔͱαʔϏε͕ࢭ·Δɻ 24
  25. 2. DBϦϑΝΫλϦϯάΛ΍Δཧ༝ͱͦͷख๏ ·ͱΊ • AWS DMSͰ MySQL͔ΒPostgreSQLʹ ϨϓϦέʔγϣϯ͍ͯ͠Δɻ • DMS͕Ҡߦͨ͠λΠϛϯάͰઃఆͨ͠τϦΨʔ͕ൃಈͯ͠

    ϦϑΝΫλϦϯά͞ΕͨςʔϒϧʹॻࠐΛ͢Δɻ • ߋ৽ɾࢀরΛAPIܦ༝ʹ͢ΔࣄͰطଘͷ։ൃΛਐΊͭͭ ϦϑΝΫλϦϯάͨ͠DBʹࢀরΛ੾Γସ͍͚͍͑ͯͯΔɻ • ϩʔΧϧͷ؀ڥߏங͕೉͍͠ͷͱɺDMS͕ࢭ·ͬͨ࣌ʹ ࢀরAPI͕ίέΔͷͰߟྀ͕೉͍͠ɻ 25
  26. 3. MySQL͔ΒPostgreSQLΛ ҠߦઌʹબΜͩཧ༝ 26

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

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

  29. PostgreSQLͷํ͕MySQLΑΓ༏Ε͍ͯΔ(ͱࢥͬͨ)2఺ 29

  30. 1ɿ 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·Ͱ) ෳ਺ࢦఆՄೳ ෳ਺τϦΨʔࢦఆ࣌ͷॱং ίϚϯυͰࢦఆ ໊લॱ 30
  31. 1ɿ PostgreSQLτϦΨʔʹ͍ͭͯ • PostgreSQL͚ͩͷػೳ • UPDATE࣌ʹSETʹࢦఆΧϥϜ͕͋Δ৔߹ͷτϦΨʔΛఆٛग़དྷΔɻ • UPDATE࣌ʹࢦఆΧϥϜ͕࣮ࡍʹมߋ͞Εͨ৔߹ͷτϦΨʔΛఆٛग़དྷ Δɻ •

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

    Perl جຊ഑෍ PL/Python Python جຊ഑෍ PL/Java Java ֦ு PL/v8 JavaScript ֦ு ※ ͦͷଞ 32
  33. PostgreSQLͷڧΈ(खଓ͖ܕݴޠ) • ※ୠ͠ɺAmazon RDS ͸ PL/Python Λαϙʔτͯ͠ͳ͍ɻɻ • ΦϛΧϨͰ͸ PL/v8Λར༻͍ͯ͠Δɻ

    • ࠾୒ཧ༝ɿ ܦݧͷ͋Δݴޠͷؔ܎͔ΒpgSQLͱv8͙Β͍͔͠બ୒ࢶ͕ແ͔ͬͨɻ ϕϯνϚʔΫͱͯ͠ pgSQLΑΓv8ͷํ͕਺ഒ଎͍ɺͱͷࣄͰpl/v8Λ࠾༻ɻ (PL/PythonΛ࢖͍͔ͨͬͨͳɾɾ) • ※ΦϛΧϨͰ͸ϐϡΞJavaScriptΛ࢖͍ͬͯΔ͕ɺ CoffeeScript΍React.js΋࢖͑ΔΒ͍͠ɻ 33
  34. (ࢀߟ) PL/v8 ͷ༗ޮԽํ๏ RDS for PostgreSQLʹ͸σϑΥϧτͰ plv8͕Πϯετʔϧ͞Ε͍ͯΔͷͰɺextensionΛ༗ޮԽͯ͠΍Ε͹ok. ------------------------------------------------ # Extension͕ରԠͯ͠Δ͔νΣοΫ

    postgres=> show rds.extensions; postgres=> create extension plv8; CREATE EXTENSION ------------------------------------------------ 34
  35. 3. MySQL͔ΒPostgreSQLΛҠߦઌʹબΜͩཧ༝ ·ͱΊ • PostgreSQLͰ͸τϦΨʔΛॊೈʹఆٛ͢Δࣄ͕ग़དྷΔɻ • ·ͨPostgreSQLͰ͸τϦΨʔʹࢦఆ͢ΔϢʔβʔఆٛؔ਺ͷ ࢖༻ݴޠͱͯ͠ෳ਺ͷݴޠΛαϙʔτ͍ͯ͠Δɻ • ݱࡏɺΦϛΧϨͰ࠾༻͍ͯ͠Δͷ͸

    JavaScript. 35
  36. 4. AWS Database Migration Service ͱ͸ 36

  37. AWS Database Migration Service ωοτϫʔΫӽ͠ʹ σʔλҠߦΛߦ͏ࣄ͕ग़དྷΔαʔϏε ಄จࣈΛऔͬͯɺDMSͱݺ͹ΕΔɻ ※ ੍ݶ͕͋ͬͯɺίϐʔݩɾίϐʔઌͷ ͲͪΒ͔͕AWSͷΤϯυϙΠϯτͰແ

    ͍ͱɺϨϓϦέʔγϣϯΛ͢Δࣄ͕ग़དྷ ͳ͍ɻ 37
  38. AWS Database Migration Serviceͷ͝঺հ • AWS DMS Ͱ࢖ΘΕΔΩʔϫʔυ • ϨϓϦέʔγϣϯΠϯελϯεʹ͍ͭͯ

    • λεΫͷৼΔ෣͍ʹ͍ͭͯ • λεΫͷઃఆํ๏ʹ͍ͭͯ • ҟछDBؒҠߦͷࡍͷΧϥϜͷܕม׵ʹ͍ͭͯ 38
  39. AWS DMS Ͱ࢖ΘΕΔΩʔϫʔυ • ιʔεΤϯυϙΠϯτ • σʔλͷίϐʔݩɻEC2onDB, RDS, ΦϯϓϨDB, S3

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

  41. ϨϓϦέʔγϣϯΠϯελϯεʹ͍ͭͯ • ΠϯελϯεΫϥε͸ T2, C4, R4ͷ̏छྨΛαϙʔτ. • T2: ։ൃɾݕূ༻ •

    C4: େྔͷԋࢉΛߦ͏৔߹ʹ໾ཱͭɻ (AWSతʹ͸ ҟछDBҠߦ͸͜ΕΛ͢͢Ί͍ͯΔ) • R4: ϝϞϦ૿ՃΠϯελϯεɻ (ҰճͷτϥϯβΫγϣϯ͕େ͖͍࣌͸͜Ε.) • ϚϧνAZʹରԠ͍ͯͯ͠ɺϑΣΠϧΦʔόʔΛαϙʔτ. • ࣮ࡍɺDMSͱ͓͕͔͔ͯۚ͠Δͷ͸Πϯελϯεར༻ྉͱετϨʔδ͚ͩɻ 41
  42. λεΫͷৼΔ෣͍ͷछྨʹ͍ͭͯ λεΫͷৼΔ෣͍͸ओʹ3λΠϓ͋Δɻ • શϩʔυ+ܧଓతͳϨϓϦέʔγϣϯ(CDC). • ΦϛΧϨͰར༻͍ͯ͠ΔλΠϓɻ • طଘͷσʔλΛϑϧϩʔυͨ͠ޙ(PostgreSQLͩͱCOPYจͰߦ͏.) ͦͷޙ͸τϥϯβΫγϣϯϩά͔ΒܧଓతʹϨϓϦέʔγϣϯΛߦ͏. ֤DBΤϯδϯຖʹઐ༻ͷػೳΛ࢖͏ɻ(PostgreSQLͰ͸test_decodingϓϥάΠϯͰ)

    • ܧଓతͳϨϓϦέʔγϣϯ(CDC)ͷΈ • શϩʔυͷΈ 42
  43. λεΫͷઃఆํ๏ʹ͍ͭͯ • ϨϓϦέʔγϣϯΛߦ͏ςʔϒϧͷࢦఆํ๏͸̎छྨ • userɿ จࣈྻҰகͰ user ςʔϒϧͷΈΛର৅ͱ͢Δɻ • user_%ɿ

    ਖ਼نදݱͰ user_xxx ςʔϒϧʹ߹க͢Δશͯͷ ςʔϒϧΛର৅ͱ͢Δɻ • ਖ਼نදݱͳͲͰෳ਺ࢦఆͨ͠৔߹͸λεΫ಺ͰฒྻͰςʔϒϧ͕ ϩʔυ͞ΕΔɻ (σϑΥϧτͰ͸8ςʔϒϧ) 43
  44. λεΫͷઃఆํ๏ʹ͍ͭͯ • ·ͨɺ֤ςʔϒϧʹରͯ͠ҠߦϧʔϧΛઃఆ͢Δࣄ͕ग़དྷ Δɻ • ྫ͑͹Ҡߦޙͷςʔϒϧ໊/ΧϥϜ໊Λมߋͨ͠Γ ର৅ͷσʔλΛWHERE۟ͷΑ͏ʹϧʔϧͰߜΓࠐΜͩΓ ग़དྷΔɻ 44

  45. ΦϛΧϨͷλεΫӡ༻ํ਑ άϧʔϓ୯ҐͰখ͘͞ϨϓϦέʔγϣϯλεΫΛઃఆͯ͠ ҠߦΛਐΊ͍ͯΔɻ ྫɿ ϢʔβʔҠߦλεΫ, ύʔςΟҠߦλεΫ, ༧໿ҠߦλεΫ, ... • ཧ༝

    Ҡߦ׬ྃͨ͠ςʔϒϧΑΓDMSͷλεΫΛ࡟আ͍ͯ͘͠ࣄΛ ૝ఆ͍ͯ͠ΔͨΊɻ ӡ༻Λͯ͠ؾ෇͍͕ͨɺখ͘͞λεΫΛ෼ׂ͓ͯ͘͠ࣄͰҰݸͷςʔϒϧҠ ߦ͕ ࣦഊͨ࣌͠ʹαʔϏεશମͷো֐ʹͳΒͳ͍ɻ 45
  46. ҟछDBҠߦͷࡍͷΧϥϜͷܕม׵ʹ͍ͭͯ • ιʔεͷܕ → DMSઐ༻ͷܕʹΩϟετ → λʔήοτͷܕʹΩϟετ ͱม׵͢Δɻ DMSͷܕ ಺༰

    STRING จࣈྻ DATE ೔෇஋ DATETIME λΠϜελϯϓ஋ INT1 1όΠτɺූ߸෇͖੔਺ (INT2, INT4, INT8͕͋Δ) BOOLEAN ϒʔϧ஋ BLOB όΠφϦϥʔδΦϒδΣΫτ ※ ͦͷଞ 46
  47. ͦͷଞDMSͷओͳ׆༻ࣄྫ • ΦϯϓϨͷDB͔ΒAWSͷRDS΁σʔλΛҠߦ͢Δɻ • ͔ͷߴڮগ೥͸ɾɾҎલਂ໷ϑϧόοΫΞοϓΛऔͬͯ AWSʹసૹͯ͠෮ݩ͢Δ࡞ۀΛ͍ͯͨ͠ɻɻ • Lambda+RDS͸ಉ࣌઀ଓͷ໰୊͔Βਪ঑͞Ε͍ͯͳ͍ͷͰɺ RDS →

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

    λεΫͷཻ౓Λଟͨ͘͠Γখͨ͘͞͠Γ͢ΔࣄͰ શମͷϨϓϦέʔγϣϯͷཻ౓Λௐ੔ग़དྷΔɻ • DMS୯ମͱͯ͠͸ϨϓϦέʔγϣϯΠϯελϯεͷӡ༻අ͕͔͔Δఔ౓Ͱ ҆ՁͰਐΊΔࣄ͕ग़དྷΔɻ 48
  49. 5. Ҡߦࣦഊͷ؂ࢹΛͲ͏͍ͯ͠Δ͔ 49

  50. Ҡߦࣦഊͷ؂ࢹΛͲ͏͍ͯ͠Δ͔ ࠓ·Ͱ͓࿩͖ͯͨ͠௨ΓɺDMS͸ඇৗʹศརͳαʔϏεͰ ΦϛΧϨͷαʔϏεΛࢧ͑Δ্ͰඇৗʹॏཁͰ͋Δɻ ͕ɺτϦΨʔ΍σʔλҠߦλεΫ͕ίέΔͱ௚ͪʹ γεςϜো֐ʹͳΔσϝϦοτ΋͋Δɻ => ͳΔૣ ͰDMS͕ࣦഊ͍ͯ͠Δࣄʹؾͮ͘࢓૊Έ͕ඞཁ. 50

  51. Ҡߦࣦഊͷ؂ࢹͷ࢓૊Έ MackerelͷνΣοΫϓϥάΠϯΛ࢖ͬͯ RDSͷϩά؂ࢹΛ࣮ࢪ͢ΔPHPͷϓϩάϥϜΛఆظతʹୟ͍ͯ ؂ࢹ͍ͯ͠Δɻ Mackerel ... RDSͷϩά؂ࢹΛ࣮ࢪ͢ΔPHPͷϓϩάϥϜ ... 51

  52. Mackerel ͱ͸ αʔόʔ؅ཧΛߦ͏αʔϏεɻ Ϧιʔεͷঢ়گΛάϥϑԽͯ͠ՄࢹԽ͞ΕͨΓɺ ·ͨো֐ൃੜ࣌ͳͲʹଟ༷ͳπʔϧ΁ΞϥʔτΛ௨஌ग़དྷΔɻ 52

  53. νΣοΫ؂ࢹ߲໨ ------------------------------------------------ [plugin.checks.rds_log] command = "php /path/to/rds_log.php" check_interval = 5

    memo = "RDS Τϥʔϩά؂ࢹ" ------------------------------------------------ • mackerelͷઃఆϑΝΠϧʹ্هΛهड़͢Δͱ 5෼͓͖ʹ ࢦఆͨ͠ίϚϯυΛ࣮ߦͯ͘͠ΕΔ. 53
  54. PHPͷத਎ʹ͍ͭͯ AWS SDK for PHP Ͱ downloadDBLogFilePortionؔ਺Λ࣮ߦ. ʢDBͷϩάΛ ࢦఆҐஔ͔Βμ΢ϯϩʔυ͢Δɻʣ •

    :ERROR: ͳͲͷΩʔϫʔυΛरͬͯɺ Ωʔϫʔυ͕͋Ε͹ ͦͷจࣈྻΛechoͯ͠exit(1) Ͱऴྃ͢Δ. • MackerelͷcheckϓϥάΠϯ exit(0) : ਖ਼ৗ exit(1) : ҟৗ(WARNING) exit(2) : ۓٸ(CRITICAL) • MackerelͷઃఆͰWARNINGΞϥʔτ্͕͕ͬͨ࣌ͷ௨஌ઌΛઃఆ͢Δɻ 54
  55. ಋೖޙͷঢ়گ • ൃݟ͕ඇৗʹૣ͍ͷͰো֐લʹਝ଎ʹରԠ͕ग़དྷΔɻ Τϥʔͷ಺༁ • ύʔςΟͷ։࠵೔ͱऴྃ೔͕ٯసͯ͠Δɻ • ҠߦޙͰ͸ൣғܕΛ࢖͍ͬͯΔҝམͪΔɻ • ຊདྷɺඞਢͰ͋Δ͸ͣͷ߲໨͕nullͰ౉ͬͯ͘Δɻ

    • ֎෦ࢀর੍໿ͰམͪΔɻ 55
  56. ࠷େͷϝϦοτ • WebαʔϏεଆͷطଘόά(͜Μͳσʔλ͸ೖΒͳ͍)ʹ ؾ෇͘ࣄ͕ग़དྷΔɻ ʢ..ඞਢ߲໨ͳΜͰ NOT NULL͡Όͳ͍ͷʁͬͯ࿩͸ɾɾʣ • τϦΨʔ಺Ͱ ϩάʹ

    :ERROR: ͬͯจࣈΛؚΊΔࣄͰ௨஌ΛϋοΫग़དྷΔɻ ʮ͜ͷݱ৅͸࡟আϑϥά͕1͔Β0ʹ໭Βͳ͍ͱى͜Γ͑ͳ͍ʯ ͬͯ໰୊ʹରͯ͠ UPDATEͷτϦΨʔͰ࡟আϑϥά͕໭ͬͯͨΒ :ERROR:ͱϩάΛు͘ॲཧΛ࢓ࠐΉࣄͰࣄ৅͕ൃੜ͍ͯ͠Δࣄʹؾ෇͚Δɻ ʢ࣮ࡍ໭ͬͯͨɻɻɻʣ 56
  57. ࣮ࡍʹಈ͔ͯ͠Έͯൃੜͨ͠໰୊ • ੑผσʔλ int͡Όͳ͍ͷʁ໰୊. • Zero Date໰୊ • with timezone໰୊

    • etc... 57
  58. Zero Date໰୊ MySQLͰ͸ 0000-00-00 Λ DatetimeܕͷΧϥϜʹొ࿥͢Δࣄ͕ग़དྷΔɻ PostgreSQLͰ͸ 0000-00-00 Λ ೔෇ʹΩϟετ͢Δࣄ͸౰વग़དྷͳ͍ɻ

    • DMSͰϨϓϦέʔγϣϯ͠Α͏ͱͨ࣌͠఺ͰίέΔɻ • hoge_date NOT NULL DEFAULT '0000-00-00' ͷڪා... 58
  59. Zero Date໰୊ͷରॲ • ·ͣɺจࣈྻͰड͚ͱΔɻ ALTER TABLE hoge ALTER COLUMN hoge_date

    TYPE VARCHAR(35); - BEFORE τϦΨʔͰ จࣈྻҰகͰஔ׵͢Δɻ if (NEW.hoge_date === '0000-00-00 00:00:00') { NEW.hoge_date = '0001-01-01 00:00:00'; } 59
  60. with timezone໰୊ MySQLͷ೔෇͸JSTͰདྷΔ(͕ɺTimezoneͷ৘ใ͸ͳ͍)ɻ PostgreSQLͰͦͷ··Insert͢Δɻ(UTCͱͯ͠ѻΘΕΔ) ↓ ʮύʔςΟͷ։࠵೔͕ਂ໷ͷ1͔࣌Β2࣌ͬͯͳͬͯ·͢Αʁʯ JSTΛUTCʹม׵ͨ͠ঢ়ଶͰೖΕΔɻ 60

  61. with timezone໰୊ ͪͳΈʹ RDSͩͱ SELECT NOW(); ͕ UTCʹͳΔɻ ίʔυͷόάͰ NOW()

    ͰσʔλΛೖΕͯΔ࣌͸ɾɾ Կͱ18࣌ؒͣΕΔɻɻ 61
  62. 5. ·ͱΊ • MackerelͷνΣοΫϓϥάΠϯΛར༻͍ͯ͠Δɻ • νΣοΫϓϥάΠϯͰ͸޷͖ͳίϚϯυΛୟ͘ࣄ͕ग़དྷΔɻ • DBϩάͷ؂ࢹ͸Τϥʔͷ؂ࢹͱϦϑΝΫλϦϯάͷ྆ํʹޮ ͘ɻ •

    ࢥͬͯΔΑΓ΋૝ఆ֎ͷσʔλ͸ೖΔɻ 62
  63. 6. ·ͱΊ 63

  64. ࠓճͷDMSϦϑΝΫλϦϯάͷ ࠷େͷϝϦοτ ຊདྷലେͳ޻਺ֻ͕͔Δ(΋͘͠͸ಡΊͳ͍)͸ͣͷ DBϦϑΝΫλϦϯάͷॲཧΛDMSλεΫ(Ҡߦ୯Ґ)Λ খͨ͘͞͠ࣄͰগͮͭ͠खΛೖΕΔࣄ͕ग़དྷΔɻ ͦͷ݁ՌɺӨڹൣғ΋ಡΈ΍͘͢վળΛਐΊΔࣄ͕ग़དྷͨɻ 64

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

  66. ࠂ஌ 66

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

    11͸ੌ͍ͧʂ MySQL 8.0͸ੌ͍ͧʂ → ʮͲ͏΍ͬͯόʔδϣϯΞοϓ͢Δͷʁʯ ख๏Λ͓࿩ग़དྷΔߨࢣਞͷํΛ͓ট͖ͯ͠͝঺հ͠·͢ʂ 67
  68. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝· ͨ͠ʂʂ 68