Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

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

Takahashi Ikki

November 22, 2018
Tweet

More Decks by Takahashi Ikki

Other Decks in Programming

Transcript

  1. MySQL ͔Β PostgreSQL ΁ͷҠߦͱ
    DBϦϑΝΫλϦϯά
    2018-11-22
    PostgreSQL Conference Japan 2018
    ೔ຊPostgreSQLϢʔβʔձ தࠃ஍ํࢧ෦௕
    ߴڮ Ұٍ
    1

    View Slide

  2. ͓͠ͳ͕͖
    1. ࣗݾ঺հ
    2. DBϦϑΝΫλϦϯάΛ΍Δཧ༝ͱͦͷख๏
    3. MySQL͔ΒPostgreSQLΛҠߦઌʹબΜͩཧ༝
    4. AWS Database Migration Serviceͱ͸
    5. Ҡߦࣦഊͷ؂ࢹΛͲͷΑ͏ʹ΍͍ͬͯΔ͔
    6. ·ͱΊ
    2

    View Slide

  3. ஫ҙࣄ߲
    • εϥΠυ͸ެ։͠·͢ɻ
    • ࣭໰ͱ͔͝ࢦఠͱ͔ॾʑͷϑΟʔυόοΫ͕͍͟͝·ͨ͠Β
    #pgcon18j ΁ ͓ئ͍க͠·͢ɻ
    • EC2 ΍ RDS ͳͲͱ͍ͬͨAWSͷαʔϏεͷࣄલ஌͕ࣝඞཁͰ͢ɻ
    • EC2: AWS͕ఏڙ͢ΔԾ૝αʔόʔ
    • RDS: AWS͕ఏڙ͢ΔϚωʔδυRDBαʔϏε
    3

    View Slide

  4. 1. ࣗݾ঺հ
    • ߴڮ Ұٍ
    • Ԭࢁࡏॅ
    • גࣜձࣾΦϛΧϨ WebΤϯδχΞ
    • ೔ຊPostgreSQLϢʔβʔձ
    தࠃࢧ෦௕
    • PostgreSQLྺ 4ϲ݄
    !
    4

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  8. ΦϛΧϨʹ͍ͭͯ
    • αʔϏε։͔࢝Β໿̓೥͕ܦա͍ͯ͠Δɻ
    • ͜͜൒೥ఔͰ ։ൃਓһ͕ࣾһ1໊ + ֎஫ ͷମ੍͔Β
    ࣾһ6໊ ͷମ੍ʹมֵɻ
    • ৭Μͳେਓͷࣄ৘͔ΒͦΕͳΓʹ͍ΘΏΔٕज़తෛ࠴ͱݺ͹
    ΕΔ΋ͷ͕͋Δɻ
    8

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  17. ϦϑΝΫλϦϯάख๏
    17

    View Slide

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

    View Slide

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

    View Slide

  20. DBͷϦϑΝΫλϦϯάํ๏
    • ผͷΠϯελϯεΛ༻ҙ͠ɺ
    AWS Database Migration ServiceΛ
    ࢖༻ͯ͠ϨϓϦέʔγϣϯ͢Δɻ
    • ϨϓϦέʔγϣϯ͞ΕͨλΠϛϯάͰ
    DBͷτϦΨʔΛൃಈͤ͞Δɻ
    • τϦΨʔ಺ͰچσʔλΛՃ޻͠
    ϦϑΝΫλϦϯάͨ͠ςʔϒϧͷ
    ܗࣜʹ߹͏Α͏ʹొ࿥͢Δɻ
    • ࠓޙ͸NEWεΩʔϚΛࢀর͢Δɻ
    20

    View Slide

  21. ϦϑΝΫλϦϯάख๏
    • Web͸গͮͭ͠APIܦ༝Ͱ
    ࢀরɾॻࠐ͢ΔΑ͏ʹมߋΛ
    ਐΊΔɻ
    (WebͷϦϑΝΫλϦϯά)
    • API͸ॻࠐ͸MySQLଆ΁ߦ͍ɺ
    ಡࠐ͸PostgreSQLଆ͔Βߦ͏ɻ
    (DBͷϦϑΝΫλϦϯά)
    • WebଆΛશͯAPIܦ༝ʹग़དྷͨΒ
    APIͷॻࠐ΋PostgreSQLଆ΁
    มߋ͢Δɻ
    21

    View Slide

  22. 22

    View Slide

  23. ͜ͷϦϑΝΫλϦϯάํ๏ͷϝϦοτ
    • ߋ৽API͸MySQL΁ॻࠐΛ͢ΔͷͰগͮͭ͠APIܦ༝ʹͯ͠΋
    طଘαʔϏεͷςʔϒϧͷࢀরՕॴʹӨڹ͕ແ͍ɻ
    • ҰՕॴAPIܦ༝ʹͯ͠ΈΔ → ໰୊͕͋Ε͹ௐ੔͢Δɻˠ ...
    ͳͲͷΑ͏ʹ ΧφϦΞϦϦʔε ܗࣜͰ
    গͮͭ͠վળΛਐΊ͍͚ͯΔɻ
    • σʔλͷಡࠐ͸PostgreSQL͔Βߦ͏ͷͰ
    ॻࠐAPIΛݺͿଆ͸ͲͪΒʹॻ͖ࠐΜͰ͍Δ͔Λ
    ؾʹ͠ͳͯ͘΋ྑ͍ɻ
    23

    View Slide

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

    View Slide

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

    View Slide

  26. 3. MySQL͔ΒPostgreSQLΛ
    ҠߦઌʹબΜͩཧ༝
    26

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  33. PostgreSQLͷڧΈ(खଓ͖ܕݴޠ)
    • ※ୠ͠ɺAmazon RDS ͸ PL/Python Λαϙʔτͯ͠ͳ͍ɻɻ
    • ΦϛΧϨͰ͸ PL/v8Λར༻͍ͯ͠Δɻ
    • ࠾୒ཧ༝ɿ
    ܦݧͷ͋Δݴޠͷؔ܎͔ΒpgSQLͱv8͙Β͍͔͠બ୒ࢶ͕ແ͔ͬͨɻ
    ϕϯνϚʔΫͱͯ͠ pgSQLΑΓv8ͷํ͕਺ഒ଎͍ɺͱͷࣄͰpl/v8Λ࠾༻ɻ
    (PL/PythonΛ࢖͍͔ͨͬͨͳɾɾ)
    • ※ΦϛΧϨͰ͸ϐϡΞJavaScriptΛ࢖͍ͬͯΔ͕ɺ
    CoffeeScript΍React.js΋࢖͑ΔΒ͍͠ɻ
    33

    View Slide

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

    View Slide

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

    View Slide

  36. 4. AWS Database Migration Service
    ͱ͸
    36

    View Slide

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

    View Slide

  38. AWS Database Migration Serviceͷ͝঺հ
    • AWS DMS Ͱ࢖ΘΕΔΩʔϫʔυ
    • ϨϓϦέʔγϣϯΠϯελϯεʹ͍ͭͯ
    • λεΫͷৼΔ෣͍ʹ͍ͭͯ
    • λεΫͷઃఆํ๏ʹ͍ͭͯ
    • ҟछDBؒҠߦͷࡍͷΧϥϜͷܕม׵ʹ͍ͭͯ
    38

    View Slide

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

    View Slide

  40. 40

    View Slide

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

    View Slide

  42. λεΫͷৼΔ෣͍ͷछྨʹ͍ͭͯ
    λεΫͷৼΔ෣͍͸ओʹ3λΠϓ͋Δɻ
    • શϩʔυ+ܧଓతͳϨϓϦέʔγϣϯ(CDC).
    • ΦϛΧϨͰར༻͍ͯ͠ΔλΠϓɻ
    • طଘͷσʔλΛϑϧϩʔυͨ͠ޙ(PostgreSQLͩͱCOPYจͰߦ͏.)
    ͦͷޙ͸τϥϯβΫγϣϯϩά͔ΒܧଓతʹϨϓϦέʔγϣϯΛߦ͏.
    ֤DBΤϯδϯຖʹઐ༻ͷػೳΛ࢖͏ɻ(PostgreSQLͰ͸test_decodingϓϥάΠϯͰ)
    • ܧଓతͳϨϓϦέʔγϣϯ(CDC)ͷΈ
    • શϩʔυͷΈ
    42

    View Slide

  43. λεΫͷઃఆํ๏ʹ͍ͭͯ
    • ϨϓϦέʔγϣϯΛߦ͏ςʔϒϧͷࢦఆํ๏͸̎छྨ
    • userɿ จࣈྻҰகͰ user ςʔϒϧͷΈΛର৅ͱ͢Δɻ
    • user_%ɿ ਖ਼نදݱͰ user_xxx ςʔϒϧʹ߹க͢Δશͯͷ
    ςʔϒϧΛର৅ͱ͢Δɻ
    • ਖ਼نදݱͳͲͰෳ਺ࢦఆͨ͠৔߹͸λεΫ಺ͰฒྻͰςʔϒϧ͕
    ϩʔυ͞ΕΔɻ
    (σϑΥϧτͰ͸8ςʔϒϧ)
    43

    View Slide

  44. λεΫͷઃఆํ๏ʹ͍ͭͯ
    • ·ͨɺ֤ςʔϒϧʹରͯ͠ҠߦϧʔϧΛઃఆ͢Δࣄ͕ग़དྷ
    Δɻ
    • ྫ͑͹Ҡߦޙͷςʔϒϧ໊/ΧϥϜ໊Λมߋͨ͠Γ
    ର৅ͷσʔλΛWHERE۟ͷΑ͏ʹϧʔϧͰߜΓࠐΜͩΓ
    ग़དྷΔɻ
    44

    View Slide

  45. ΦϛΧϨͷλεΫӡ༻ํ਑
    άϧʔϓ୯ҐͰখ͘͞ϨϓϦέʔγϣϯλεΫΛઃఆͯ͠
    ҠߦΛਐΊ͍ͯΔɻ
    ྫɿ ϢʔβʔҠߦλεΫ, ύʔςΟҠߦλεΫ, ༧໿ҠߦλεΫ, ...
    • ཧ༝
    Ҡߦ׬ྃͨ͠ςʔϒϧΑΓDMSͷλεΫΛ࡟আ͍ͯ͘͠ࣄΛ
    ૝ఆ͍ͯ͠ΔͨΊɻ
    ӡ༻Λͯ͠ؾ෇͍͕ͨɺখ͘͞λεΫΛ෼ׂ͓ͯ͘͠ࣄͰҰݸͷςʔϒϧҠ
    ߦ͕
    ࣦഊͨ࣌͠ʹαʔϏεશମͷো֐ʹͳΒͳ͍ɻ
    45

    View Slide

  46. ҟछDBҠߦͷࡍͷΧϥϜͷܕม׵ʹ͍ͭͯ
    • ιʔεͷܕ → DMSઐ༻ͷܕʹΩϟετ → λʔήοτͷܕʹΩϟετ ͱม׵͢Δɻ
    DMSͷܕ ಺༰
    STRING จࣈྻ
    DATE ೔෇஋
    DATETIME λΠϜελϯϓ஋
    INT1 1όΠτɺූ߸෇͖੔਺ (INT2, INT4, INT8͕͋Δ)
    BOOLEAN ϒʔϧ஋
    BLOB όΠφϦϥʔδΦϒδΣΫτ
    ※ ͦͷଞ
    46

    View Slide

  47. ͦͷଞDMSͷओͳ׆༻ࣄྫ
    • ΦϯϓϨͷDB͔ΒAWSͷRDS΁σʔλΛҠߦ͢Δɻ
    • ͔ͷߴڮগ೥͸ɾɾҎલਂ໷ϑϧόοΫΞοϓΛऔͬͯ
    AWSʹసૹͯ͠෮ݩ͢Δ࡞ۀΛ͍ͯͨ͠ɻɻ
    • Lambda+RDS͸ಉ࣌઀ଓͷ໰୊͔Βਪ঑͞Ε͍ͯͳ͍ͷͰɺ
    RDS → DynamoDB ʹܧଓతʹϨϓϦέʔγϣϯΛͯ͠
    Lambda͕઀ଓ͢ΔDynamoDBΛ࡞Δɻ
    47

    View Slide

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

    View Slide

  49. 5. Ҡߦࣦഊͷ؂ࢹΛͲ͏͍ͯ͠Δ͔
    49

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  53. νΣοΫ؂ࢹ߲໨
    ------------------------------------------------
    [plugin.checks.rds_log]
    command = "php /path/to/rds_log.php"
    check_interval = 5
    memo = "RDS Τϥʔϩά؂ࢹ"
    ------------------------------------------------
    • mackerelͷઃఆϑΝΠϧʹ্هΛهड़͢Δͱ 5෼͓͖ʹ
    ࢦఆͨ͠ίϚϯυΛ࣮ߦͯ͘͠ΕΔ.
    53

    View Slide

  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

    View Slide

  55. ಋೖޙͷঢ়گ
    • ൃݟ͕ඇৗʹૣ͍ͷͰো֐લʹਝ଎ʹରԠ͕ग़དྷΔɻ
    Τϥʔͷ಺༁
    • ύʔςΟͷ։࠵೔ͱऴྃ೔͕ٯసͯ͠Δɻ
    • ҠߦޙͰ͸ൣғܕΛ࢖͍ͬͯΔҝམͪΔɻ
    • ຊདྷɺඞਢͰ͋Δ͸ͣͷ߲໨͕nullͰ౉ͬͯ͘Δɻ
    • ֎෦ࢀর੍໿ͰམͪΔɻ
    55

    View Slide

  56. ࠷େͷϝϦοτ
    • WebαʔϏεଆͷطଘόά(͜Μͳσʔλ͸ೖΒͳ͍)ʹ
    ؾ෇͘ࣄ͕ग़དྷΔɻ
    ʢ..ඞਢ߲໨ͳΜͰ NOT NULL͡Όͳ͍ͷʁͬͯ࿩͸ɾɾʣ
    • τϦΨʔ಺Ͱ ϩάʹ :ERROR: ͬͯจࣈΛؚΊΔࣄͰ௨஌ΛϋοΫग़དྷΔɻ
    ʮ͜ͷݱ৅͸࡟আϑϥά͕1͔Β0ʹ໭Βͳ͍ͱى͜Γ͑ͳ͍ʯ
    ͬͯ໰୊ʹରͯ͠ UPDATEͷτϦΨʔͰ࡟আϑϥά͕໭ͬͯͨΒ
    :ERROR:ͱϩάΛు͘ॲཧΛ࢓ࠐΉࣄͰࣄ৅͕ൃੜ͍ͯ͠Δࣄʹؾ෇͚Δɻ
    ʢ࣮ࡍ໭ͬͯͨɻɻɻʣ
    56

    View Slide

  57. ࣮ࡍʹಈ͔ͯ͠Έͯൃੜͨ͠໰୊
    • ੑผσʔλ int͡Όͳ͍ͷʁ໰୊.
    • Zero Date໰୊
    • with timezone໰୊
    • etc...
    57

    View Slide

  58. Zero Date໰୊
    MySQLͰ͸ 0000-00-00 Λ
    DatetimeܕͷΧϥϜʹొ࿥͢Δࣄ͕ग़དྷΔɻ
    PostgreSQLͰ͸ 0000-00-00 Λ
    ೔෇ʹΩϟετ͢Δࣄ͸౰વग़དྷͳ͍ɻ
    • DMSͰϨϓϦέʔγϣϯ͠Α͏ͱͨ࣌͠఺ͰίέΔɻ
    • hoge_date NOT NULL DEFAULT '0000-00-00' ͷڪා...
    58

    View Slide

  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

    View Slide

  60. with timezone໰୊
    MySQLͷ೔෇͸JSTͰདྷΔ(͕ɺTimezoneͷ৘ใ͸ͳ͍)ɻ
    PostgreSQLͰͦͷ··Insert͢Δɻ(UTCͱͯ͠ѻΘΕΔ)

    ʮύʔςΟͷ։࠵೔͕ਂ໷ͷ1͔࣌Β2࣌ͬͯͳͬͯ·͢Αʁʯ
    JSTΛUTCʹม׵ͨ͠ঢ়ଶͰೖΕΔɻ
    60

    View Slide

  61. with timezone໰୊
    ͪͳΈʹ RDSͩͱ SELECT NOW(); ͕ UTCʹͳΔɻ
    ίʔυͷόάͰ NOW() ͰσʔλΛೖΕͯΔ࣌͸ɾɾ
    Կͱ18࣌ؒͣΕΔɻɻ
    61

    View Slide

  62. 5. ·ͱΊ
    • MackerelͷνΣοΫϓϥάΠϯΛར༻͍ͯ͠Δɻ
    • νΣοΫϓϥάΠϯͰ͸޷͖ͳίϚϯυΛୟ͘ࣄ͕ग़དྷΔɻ
    • DBϩάͷ؂ࢹ͸Τϥʔͷ؂ࢹͱϦϑΝΫλϦϯάͷ྆ํʹޮ
    ͘ɻ
    • ࢥͬͯΔΑΓ΋૝ఆ֎ͷσʔλ͸ೖΔɻ
    62

    View Slide

  63. 6. ·ͱΊ
    63

    View Slide

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

    View Slide

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

    View Slide

  66. ࠂ஌
    66

    View Slide

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

    View Slide

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

    View Slide