2018-11-22 に行われた PostgreSQL Conference Japan 2018 のスライドです!
MySQL ͔Β PostgreSQL ͷҠߦͱDBϦϑΝΫλϦϯά2018-11-22PostgreSQL Conference Japan 2018ຊPostgreSQLϢʔβʔձ தࠃํࢧ෦ߴڮ Ұٍ1
View Slide
͓͠ͳ͕͖1. ࣗݾհ2. DBϦϑΝΫλϦϯάΛΔཧ༝ͱͦͷख๏3. MySQL͔ΒPostgreSQLΛҠߦઌʹબΜͩཧ༝4. AWS Database Migration Serviceͱ5. ҠߦࣦഊͷࢹΛͲͷΑ͏ʹ͍ͬͯΔ͔6. ·ͱΊ2
ҙࣄ߲• εϥΠυެ։͠·͢ɻ• ࣭ͱ͔͝ࢦఠͱ͔ॾʑͷϑΟʔυόοΫ͕͍͟͝·ͨ͠Β#pgcon18j ͓ئ͍க͠·͢ɻ• EC2 RDS ͳͲͱ͍ͬͨAWSͷαʔϏεͷࣄલ͕ࣝඞཁͰ͢ɻ• EC2: AWS͕ఏڙ͢ΔԾαʔόʔ• RDS: AWS͕ఏڙ͢ΔϚωʔδυRDBαʔϏε3
1. ࣗݾհ• ߴڮ Ұٍ• Ԭࢁࡏॅ• גࣜձࣾΦϛΧϨ WebΤϯδχΞ• ຊPostgreSQLϢʔβʔձதࠃࢧ෦• PostgreSQLྺ 4ϲ݄!4
גࣜձࣾΦϛΧϨ(ࣗࣾʹ͍ͭͯͪΐͬͱએ)શࠃ35,000݅ͷࠗ׆ύʔςΟΛܝࡌͨ͠ϙʔλϧαΠτ25ສਓڧͷձһͷํʑʹ͝ར༻͍͍ͯ·͢ɻࠗ׆ͱݴ͑ΦϛΧϨʂ\\͍͍݁ࠗͧʂʂ//5
ʮMySQL͔ΒPostgreSQLͷҠߦͱDBϦϑΝΫλϦϯάʯΦϛΧϨͰݱࡏਐߦதͷϓϩδΣΫτɻ• ԿނDBϦϑΝΫλϦϯάΛΔͷ͔ɻ• ԿނMySQL͔ΒPostgreSQLͳͷ͔ɻ• ΤϥʔͷࢹͲ͏͍ͬͯΔͷ͔ɻ• ͲΜͳࣄͰΜͩͷ͔ɻ6
2. DBϦϑΝΫλϦϯάΛΔཧ༝ͱͦͷख๏7
ΦϛΧϨʹ͍ͭͯ• αʔϏε։͔࢝Β͕̓ܦա͍ͯ͠Δɻ• ͜͜ఔͰ ։ൃਓһ͕ࣾһ1໊ + ֎ ͷମ੍͔Βࣾһ6໊ ͷମ੍ʹมֵɻ• ৭Μͳେਓͷࣄ͔ΒͦΕͳΓʹ͍ΘΏΔٕज़తෛ࠴ͱݺΕΔͷ͕͋Δɻ8
ྫ͑ɾɾʮσʔλϕʔεߏΛோΊΔձΖ͏ʂʯ9
ྫ͑ɾɾʮσʔλϕʔεߏΛோΊΔձΖ͏ʂʯʮ͜ͷςʔϒϧԿʹͬͯΔ͔୭͔ͬͯΔʁʯ10
ྫ͑ɾɾʮσʔλϕʔεߏΛோΊΔձΖ͏ʂʯʮ͜ͷςʔϒϧԿʹͬͯΔ͔୭͔ͬͯΔʁʯʮʮʮ͍͊ɻɻɻ!ʁʯʯʯ11
ྫ͑ɾɾʮσʔλϕʔεߏΛோΊΔձΖ͏ʂʯʮ͜ͷςʔϒϧԿʹͬͯΔ͔୭͔ͬͯΔʁʯʮʮʮ͍͊ɻɻɻ!ʁʯʯʯ୭Βͳ͍ςʔϒϧͷڪා...12
gender ΧϥϜఆ ࣮ࡍܕ intೖΔσʔλ 0, 1, 2σʔλͷҙຯ 0: ະఆٛ,1: உੑ,2: ঁੑ13
gender ΧϥϜఆ ࣮ࡍܕ int varcharೖΔσʔλ 0, 1, 2 0, 1, 2, உੑ, ঁੑσʔλͷҙຯ 0: ະఆٛ,1: உੑ,2: ঁੑ0: ະఆٛ,1: உੑ,2: ঁੑ14
ݱঢ়ͷ՝• ࠓޙͷࣄۀͷͷҝʹεϐʔυײ͕ඞཁෆՄܽɻ• WebʹRDBʹϦϑΝΫλϦϯάͷ՝͕͋Δɻ• ݶΒΕͨϦιʔεΛશͯϦϑΝΫλϦϯάʹׂ͘ࣄग़དྷͳ͍ɻ• ͳΔ͘ແఀࢭͰ͔ͭԁʹ։ൃΛਐΊΔͨΊʹߟ͑ͨRDBϦϑΝΫλϦϯάͷํ๏Λ͝հ͖ͤͯ͞·͢ʂʂ15
ݱঢ়ͷ՝• ࠓޙͷࣄۀͷͷҝʹεϐʔυײ͕ඞཁෆՄܽɻ• WebʹRDBʹϦϑΝΫλϦϯάͷ՝͕͋Δɻ• ݶΒΕͨϦιʔεΛશͯϦϑΝΫλϦϯάʹׂ͘ࣄग़དྷͳ͍ɻ• ͳΔ͘ແఀࢭͰ͔ͭԁʹ։ൃΛਐΊΔͨΊʹฐࣾCTOͦʔ͍ͩ(@soudai1025)͞Μ͕ߟ͑ͨRDBϦϑΝΫλϦϯάͷํ๏Λ͝հ͖ͤͯ͞·͢ʂʂ16
ϦϑΝΫλϦϯάख๏17
ݱঢ়ͷΞʔΩςΫνϟෳͷαʔϏε͕ӡ༻͞Ε͓ͯΓ୯ҰͷMySQLͷhogeεΩʔϚ͔ΒσʔλΛࢀর͍ͯ͠Δɻ՝• ͕ݶΒΕ͍ͯΔҝɺϦϑΝΫλϦϯάͨ͠ޙɺશαʔϏεͷࢀরՕॴͷमਖ਼Λ͍ͯ͘͠ͷ͍͠ɻ• Өڹൣғ͕ಡΊͳ͍ɻ18
WebͷϦϑΝΫλϦϯάํ๏APIαʔϏεΛ৽͘͠࡞Γɺ֤ػೳΛݸผͷAPIͱͯ͠࡞͢ΔɻAPIΛ࡞͢Δஈ֊Ͱ֤αʔϏεͰෆཁʹͳ͍ͬͯΔॲཧͳͲΛআͯ͠ϦϑΝΫλϦϯά͢Δɻ·ͨɺAPIܦ༝ʹมߋΛ͢ΔλΠϛϯάͰWebଆͷίʔυϦϑΝΫλϦϯά͢Δɻྫ͑• ΦϛΧϨձһొ/ࢀরAPI• ࠗ׆ύʔςΟΛݕࡧ͢Δػೳ• ࠗ׆ύʔςΟͷ༧͢ΔAPI19
DBͷϦϑΝΫλϦϯάํ๏• ผͷΠϯελϯεΛ༻ҙ͠ɺAWS Database Migration ServiceΛ༻ͯ͠ϨϓϦέʔγϣϯ͢Δɻ• ϨϓϦέʔγϣϯ͞ΕͨλΠϛϯάͰDBͷτϦΨʔΛൃಈͤ͞Δɻ• τϦΨʔͰچσʔλΛՃ͠ϦϑΝΫλϦϯάͨ͠ςʔϒϧͷܗࣜʹ߹͏Α͏ʹొ͢Δɻ• ࠓޙNEWεΩʔϚΛࢀর͢Δɻ20
ϦϑΝΫλϦϯάख๏• Webগͮͭ͠APIܦ༝Ͱࢀরɾॻࠐ͢ΔΑ͏ʹมߋΛਐΊΔɻ(WebͷϦϑΝΫλϦϯά)• APIॻࠐMySQLଆߦ͍ɺಡࠐPostgreSQLଆ͔Βߦ͏ɻ(DBͷϦϑΝΫλϦϯά)• WebଆΛશͯAPIܦ༝ʹग़དྷͨΒAPIͷॻࠐPostgreSQLଆมߋ͢Δɻ21
22
͜ͷϦϑΝΫλϦϯάํ๏ͷϝϦοτ• ߋ৽APIMySQLॻࠐΛ͢ΔͷͰগͮͭ͠APIܦ༝ʹͯ͠طଘαʔϏεͷςʔϒϧͷࢀরՕॴʹӨڹ͕ແ͍ɻ• ҰՕॴAPIܦ༝ʹͯ͠ΈΔ → ͕͋Εௐ͢Δɻˠ ...ͳͲͷΑ͏ʹ ΧφϦΞϦϦʔε ܗࣜͰগͮͭ͠վળΛਐΊ͍͚ͯΔɻ• σʔλͷಡࠐPostgreSQL͔Βߦ͏ͷͰॻࠐAPIΛݺͿଆͲͪΒʹॻ͖ࠐΜͰ͍Δ͔Λؾʹ͠ͳͯ͘ྑ͍ɻ23
͜ͷϦϑΝΫλϦϯάํ๏ͷσϝϦοτ• ϩʔΧϧͷ։ൃڥΛ࡞͢Δࣄ͕ग़དྷͳ͍ɻ※ ࠓɺׂͱҰ൪·͍͠ॴɻ• DMS͕ࢭ·ͬͨ࣌ʹࢀরAPI͕ίέΔɻ※ τϦΨʔΤϥʔͰDMS͕ࢭ·ΔͱαʔϏε͕ࢭ·Δɻ• DMS͕Ԇͨ࣌͠ͷߟྀ͕͍͠ɻ※ ࠓͷॴɺக໋ইͳ͍ɻ(ই͕ແ͍ͱݴͬͯͳ͍)• ίϯϑϦΫτ͢Δࣄ͕ݒ೦͞ΕΔͷͰϦʔυϨϓϦΧʹ·ͰτϦΨʔΛషΕͳ͍͕ϦʔυϨϓϦΧ͕Ϛελʔʹঢ֨͢ΔͱαʔϏε͕ࢭ·Δɻ24
2. DBϦϑΝΫλϦϯάΛΔཧ༝ͱͦͷख๏·ͱΊ• AWS DMSͰ MySQL͔ΒPostgreSQLʹϨϓϦέʔγϣϯ͍ͯ͠Δɻ• DMS͕Ҡߦͨ͠λΠϛϯάͰઃఆͨ͠τϦΨʔ͕ൃಈͯ͠ϦϑΝΫλϦϯά͞ΕͨςʔϒϧʹॻࠐΛ͢Δɻ• ߋ৽ɾࢀরΛAPIܦ༝ʹ͢ΔࣄͰطଘͷ։ൃΛਐΊͭͭϦϑΝΫλϦϯάͨ͠DBʹࢀরΛΓସ͍͚͍͑ͯͯΔɻ• ϩʔΧϧͷڥߏங͕͍͠ͷͱɺDMS͕ࢭ·ͬͨ࣌ʹࢀরAPI͕ίέΔͷͰߟྀ͕͍͠ɻ25
3. MySQL͔ΒPostgreSQLΛҠߦઌʹબΜͩཧ༝26
ͦΓΌɺ(JPUGཧࣄ͕ೋਓډΔΜ͔Β) ͦ͏Ζɻ27
ͱ͍͏ͷຊԻɺͰͳ͍Ͱ͕͢ɻ28
PostgreSQLͷํ͕MySQLΑΓ༏Ε͍ͯΔ(ͱࢥͬͨ)229
1ɿ PostgreSQLτϦΨʔͷಛ (Ұ෦)------------------------------------------------------------CREATE TRIGGER 'τϦΨʔ໊' trigger_time trigger_eventON 'ςʔϒϧ໊' FOR EACH ROW '࣮ߦؔ'------------------------------------------------------------MySQL PostgreSQLtrigger_time BEFORE, AFTER ͷͲͪΒ͔ BEFORE, AFTER ͷͲͪΒ͔trigger_event INSERT, UPDATE, DELETE͔ΒҰͭͷΈબINSERT, UPDATE, DELETE͔ΒෳબෳτϦΨʔ ֤Πϕϯτຖʹ1ͭͣͭ(※ v5.6·Ͱ)ෳࢦఆՄೳෳτϦΨʔࢦఆ࣌ͷॱং ίϚϯυͰࢦఆ ໊લॱ30
1ɿ PostgreSQLτϦΨʔʹ͍ͭͯ• PostgreSQL͚ͩͷػೳ• UPDATE࣌ʹSETʹࢦఆΧϥϜ͕͋Δ߹ͷτϦΨʔΛఆٛग़དྷΔɻ• UPDATE࣌ʹࢦఆΧϥϜ͕࣮ࡍʹมߋ͞Εͨ߹ͷτϦΨʔΛఆٛग़དྷΔɻ• ߦϨϕϧ͚ͩͰແͯ͘จϨϕϧͰτϦΨʔΛఆٛग़དྷΔɻ※ ྫɿ DELETEͰ10ߦফ͑ͨͱͯ͠ɺߦϨϕϧ10֤݅ߦʹର࣮ͯ͠ߦ͞ΕΔɻจϨϕϧDELETEจʹର࣮ͯ͠ߦ͞ΕΔɻಛʹ TRUNCATEจʹରͯ͠༗ޮɻ31
2ɿ PostgreSQLͷڧΈ(खଓ͖ܕݴޠ)τϦΨʔͷ࣮ߦؔΛҎԼͷ֤ݴޠͰఆ͕ٛग़དྷΔɻ໊শ ݴޠ ํ๏PL/pgSQL SQL جຊPL/Perl Perl جຊPL/Python Python جຊPL/Java Java ֦ுPL/v8 JavaScript ֦ு※ ͦͷଞ32
PostgreSQLͷڧΈ(खଓ͖ܕݴޠ)• ※ୠ͠ɺAmazon RDS PL/Python Λαϙʔτͯ͠ͳ͍ɻɻ• ΦϛΧϨͰ PL/v8Λར༻͍ͯ͠Δɻ• ࠾ཧ༝ɿܦݧͷ͋Δݴޠͷ͔ؔΒpgSQLͱv8͙Β͍͔͠બࢶ͕ແ͔ͬͨɻϕϯνϚʔΫͱͯ͠ pgSQLΑΓv8ͷํ͕ഒ͍ɺͱͷࣄͰpl/v8Λ࠾༻ɻ(PL/PythonΛ͍͔ͨͬͨͳɾɾ)• ※ΦϛΧϨͰϐϡΞJavaScriptΛ͍ͬͯΔ͕ɺCoffeeScriptReact.js͑ΔΒ͍͠ɻ33
(ࢀߟ) PL/v8 ͷ༗ޮԽํ๏RDS for PostgreSQLʹσϑΥϧτͰplv8͕Πϯετʔϧ͞Ε͍ͯΔͷͰɺextensionΛ༗ޮԽͯ͠Εok.------------------------------------------------# Extension͕ରԠͯ͠Δ͔νΣοΫpostgres=> show rds.extensions;postgres=> create extension plv8;CREATE EXTENSION------------------------------------------------34
3. MySQL͔ΒPostgreSQLΛҠߦઌʹબΜͩཧ༝·ͱΊ• PostgreSQLͰτϦΨʔΛॊೈʹఆٛ͢Δࣄ͕ग़དྷΔɻ• ·ͨPostgreSQLͰτϦΨʔʹࢦఆ͢ΔϢʔβʔఆٛؔͷ༻ݴޠͱͯ͠ෳͷݴޠΛαϙʔτ͍ͯ͠Δɻ• ݱࡏɺΦϛΧϨͰ࠾༻͍ͯ͠Δͷ JavaScript.35
4. AWS Database Migration Serviceͱ36
AWS Database Migration ServiceωοτϫʔΫӽ͠ʹσʔλҠߦΛߦ͏ࣄ͕ग़དྷΔαʔϏε಄จࣈΛऔͬͯɺDMSͱݺΕΔɻ※ ੍ݶ͕͋ͬͯɺίϐʔݩɾίϐʔઌͷͲͪΒ͔͕AWSͷΤϯυϙΠϯτͰແ͍ͱɺϨϓϦέʔγϣϯΛ͢Δࣄ͕ग़དྷͳ͍ɻ37
AWS Database Migration Serviceͷ͝հ• AWS DMS ͰΘΕΔΩʔϫʔυ• ϨϓϦέʔγϣϯΠϯελϯεʹ͍ͭͯ• λεΫͷৼΔ͍ʹ͍ͭͯ• λεΫͷઃఆํ๏ʹ͍ͭͯ• ҟछDBؒҠߦͷࡍͷΧϥϜͷܕมʹ͍ͭͯ38
AWS DMS ͰΘΕΔΩʔϫʔυ• ιʔεΤϯυϙΠϯτ• σʔλͷίϐʔݩɻEC2onDB, RDS, ΦϯϓϨDB, S3 ͳͲɻ• λʔήοτΤϯυϙΠϯτ• σʔλͷίϐʔઌɻEC2onDB, RDS, ΦϯϓϨDB, S3, DynamoDB ͳͲɻ• ϨϓϦέʔγϣϯΠϯελϯε• ίϐʔݩ͔ΒίϐʔઌσʔλͷϨϓϦέʔγϣϯΛߦ͏Πϯελϯεɻ• λεΫ• ͲͷςʔϒϧΛͲͷΑ͏ʹҠߦ͢Δ͔ΛఆΊͨϧʔϧɻ39
40
ϨϓϦέʔγϣϯΠϯελϯεʹ͍ͭͯ• ΠϯελϯεΫϥε T2, C4, R4ͷ̏छྨΛαϙʔτ.• T2: ։ൃɾݕূ༻• C4: େྔͷԋࢉΛߦ͏߹ʹཱͭɻ(AWSతʹ ҟछDBҠߦ͜ΕΛ͢͢Ί͍ͯΔ)• R4: ϝϞϦ૿ՃΠϯελϯεɻ(ҰճͷτϥϯβΫγϣϯ͕େ͖͍࣌͜Ε.)• ϚϧνAZʹରԠ͍ͯͯ͠ɺϑΣΠϧΦʔόʔΛαϙʔτ.• ࣮ࡍɺDMSͱ͓͕͔͔ͯۚ͠ΔͷΠϯελϯεར༻ྉͱετϨʔδ͚ͩɻ41
λεΫͷৼΔ͍ͷछྨʹ͍ͭͯλεΫͷৼΔ͍ओʹ3λΠϓ͋Δɻ• શϩʔυ+ܧଓతͳϨϓϦέʔγϣϯ(CDC).• ΦϛΧϨͰར༻͍ͯ͠ΔλΠϓɻ• طଘͷσʔλΛϑϧϩʔυͨ͠ޙ(PostgreSQLͩͱCOPYจͰߦ͏.)ͦͷޙτϥϯβΫγϣϯϩά͔ΒܧଓతʹϨϓϦέʔγϣϯΛߦ͏.֤DBΤϯδϯຖʹઐ༻ͷػೳΛ͏ɻ(PostgreSQLͰtest_decodingϓϥάΠϯͰ)• ܧଓతͳϨϓϦέʔγϣϯ(CDC)ͷΈ• શϩʔυͷΈ42
λεΫͷઃఆํ๏ʹ͍ͭͯ• ϨϓϦέʔγϣϯΛߦ͏ςʔϒϧͷࢦఆํ๏̎छྨ• userɿ จࣈྻҰகͰ user ςʔϒϧͷΈΛରͱ͢Δɻ• user_%ɿ ਖ਼نදݱͰ user_xxx ςʔϒϧʹ߹க͢ΔશͯͷςʔϒϧΛରͱ͢Δɻ• ਖ਼نදݱͳͲͰෳࢦఆͨ͠߹λεΫͰฒྻͰςʔϒϧ͕ϩʔυ͞ΕΔɻ(σϑΥϧτͰ8ςʔϒϧ)43
λεΫͷઃఆํ๏ʹ͍ͭͯ• ·ͨɺ֤ςʔϒϧʹରͯ͠ҠߦϧʔϧΛઃఆ͢Δࣄ͕ग़དྷΔɻ• ྫ͑Ҡߦޙͷςʔϒϧ໊/ΧϥϜ໊Λมߋͨ͠ΓରͷσʔλΛWHERE۟ͷΑ͏ʹϧʔϧͰߜΓࠐΜͩΓग़དྷΔɻ44
ΦϛΧϨͷλεΫӡ༻ํάϧʔϓ୯ҐͰখ͘͞ϨϓϦέʔγϣϯλεΫΛઃఆͯ͠ҠߦΛਐΊ͍ͯΔɻྫɿ ϢʔβʔҠߦλεΫ, ύʔςΟҠߦλεΫ, ༧ҠߦλεΫ, ...• ཧ༝Ҡߦྃͨ͠ςʔϒϧΑΓDMSͷλεΫΛআ͍ͯ͘͠ࣄΛఆ͍ͯ͠ΔͨΊɻӡ༻Λͯ͠ؾ͍͕ͨɺখ͘͞λεΫΛׂ͓ͯ͘͠ࣄͰҰݸͷςʔϒϧҠߦ͕ࣦഊͨ࣌͠ʹαʔϏεશମͷোʹͳΒͳ͍ɻ45
ҟछDBҠߦͷࡍͷΧϥϜͷܕมʹ͍ͭͯ• ιʔεͷܕ → DMSઐ༻ͷܕʹΩϟετ → λʔήοτͷܕʹΩϟετ ͱม͢ΔɻDMSͷܕ ༰STRING จࣈྻDATE DATETIME λΠϜελϯϓINT1 1όΠτɺූ߸͖ (INT2, INT4, INT8͕͋Δ)BOOLEAN ϒʔϧBLOB όΠφϦϥʔδΦϒδΣΫτ※ ͦͷଞ46
ͦͷଞDMSͷओͳ׆༻ࣄྫ• ΦϯϓϨͷDB͔ΒAWSͷRDSσʔλΛҠߦ͢Δɻ• ͔ͷߴڮগɾɾҎલਂϑϧόοΫΞοϓΛऔͬͯAWSʹసૹͯ͠෮ݩ͢Δ࡞ۀΛ͍ͯͨ͠ɻɻ• Lambda+RDSಉ࣌ଓͷ͔Βਪ͞Ε͍ͯͳ͍ͷͰɺRDS → DynamoDB ʹܧଓతʹϨϓϦέʔγϣϯΛͯ͠Lambda͕ଓ͢ΔDynamoDBΛ࡞Δɻ47
4. AWS DMSʹ͍ͭͯ ·ͱΊ• DMSωοτϫʔΫӽ͠ʹϨϓϦέʔγϣϯΛ࣮ݱ͢ΔαʔϏε.• σʔλͷίϐʔݩͱઌΛࢦఆͯ͠ҠߦϧʔϧͱͳΔλεΫΛ࡞͢ΔࣄͰσʔλͷҠߦશͯDMSͷͰ࣮ݱͯ͘͠ΕΔɻ• λεΫͷཻΛଟͨ͘͠Γখͨ͘͞͠Γ͢ΔࣄͰશମͷϨϓϦέʔγϣϯͷཻΛௐग़དྷΔɻ• DMS୯ମͱͯ͠ϨϓϦέʔγϣϯΠϯελϯεͷӡ༻අ͕͔͔ΔఔͰ҆ՁͰਐΊΔࣄ͕ग़དྷΔɻ48
5. ҠߦࣦഊͷࢹΛͲ͏͍ͯ͠Δ͔49
ҠߦࣦഊͷࢹΛͲ͏͍ͯ͠Δ͔ࠓ·Ͱ͓͖ͯͨ͠௨ΓɺDMSඇৗʹศརͳαʔϏεͰΦϛΧϨͷαʔϏεΛࢧ͑Δ্ͰඇৗʹॏཁͰ͋Δɻ͕ɺτϦΨʔσʔλҠߦλεΫ͕ίέΔͱͪʹγεςϜোʹͳΔσϝϦοτ͋Δɻ=> ͳΔૣ ͰDMS͕ࣦഊ͍ͯ͠Δࣄʹؾͮ͘Έ͕ඞཁ.50
ҠߦࣦഊͷࢹͷΈMackerelͷνΣοΫϓϥάΠϯΛͬͯRDSͷϩάࢹΛ࣮ࢪ͢ΔPHPͷϓϩάϥϜΛఆظతʹୟ͍ͯࢹ͍ͯ͠ΔɻMackerel ...RDSͷϩάࢹΛ࣮ࢪ͢ΔPHPͷϓϩάϥϜ ...51
Mackerel ͱαʔόʔཧΛߦ͏αʔϏεɻϦιʔεͷঢ়گΛάϥϑԽͯ͠ՄࢹԽ͞ΕͨΓɺ·ͨোൃੜ࣌ͳͲʹଟ༷ͳπʔϧΞϥʔτΛ௨ग़དྷΔɻ52
νΣοΫࢹ߲------------------------------------------------[plugin.checks.rds_log]command = "php /path/to/rds_log.php"check_interval = 5memo = "RDS Τϥʔϩάࢹ"------------------------------------------------• mackerelͷઃఆϑΝΠϧʹ্هΛهड़͢Δͱ 5͓͖ʹࢦఆͨ͠ίϚϯυΛ࣮ߦͯ͘͠ΕΔ.53
PHPͷதʹ͍ͭͯAWS SDK for PHP Ͱ downloadDBLogFilePortionؔΛ࣮ߦ.ʢDBͷϩάΛ ࢦఆҐஔ͔Βμϯϩʔυ͢Δɻʣ• :ERROR: ͳͲͷΩʔϫʔυΛरͬͯɺΩʔϫʔυ͕͋Ε ͦͷจࣈྻΛechoͯ͠exit(1) Ͱऴྃ͢Δ.• MackerelͷcheckϓϥάΠϯexit(0) : ਖ਼ৗexit(1) : ҟৗ(WARNING)exit(2) : ۓٸ(CRITICAL)• MackerelͷઃఆͰWARNINGΞϥʔτ্͕͕ͬͨ࣌ͷ௨ઌΛઃఆ͢Δɻ54
ಋೖޙͷঢ়گ• ൃݟ͕ඇৗʹૣ͍ͷͰোલʹਝʹରԠ͕ग़དྷΔɻΤϥʔͷ༁• ύʔςΟͷ։࠵ͱऴ͕ྃٯసͯ͠Δɻ• ҠߦޙͰൣғܕΛ͍ͬͯΔҝམͪΔɻ• ຊདྷɺඞਢͰ͋Δͣͷ߲͕nullͰͬͯ͘Δɻ• ֎෦ࢀর੍ͰམͪΔɻ55
࠷େͷϝϦοτ• WebαʔϏεଆͷطଘόά(͜ΜͳσʔλೖΒͳ͍)ʹؾ͘ࣄ͕ग़དྷΔɻʢ..ඞਢ߲ͳΜͰ NOT NULL͡Όͳ͍ͷʁͬͯɾɾʣ• τϦΨʔͰ ϩάʹ :ERROR: ͬͯจࣈΛؚΊΔࣄͰ௨ΛϋοΫग़དྷΔɻʮ͜ͷݱআϑϥά͕1͔Β0ʹΒͳ͍ͱى͜Γ͑ͳ͍ʯͬͯʹରͯ͠ UPDATEͷτϦΨʔͰআϑϥά͕ͬͯͨΒ:ERROR:ͱϩάΛు͘ॲཧΛࠐΉࣄͰࣄ͕ൃੜ͍ͯ͠Δࣄʹؾ͚Δɻʢ࣮ࡍͬͯͨɻɻɻʣ56
࣮ࡍʹಈ͔ͯ͠Έͯൃੜͨ͠• ੑผσʔλ int͡Όͳ͍ͷʁ.• Zero Date• with timezone• etc...57
Zero DateMySQLͰ 0000-00-00 ΛDatetimeܕͷΧϥϜʹొ͢Δࣄ͕ग़དྷΔɻPostgreSQLͰ 0000-00-00 ΛʹΩϟετ͢Δࣄવग़དྷͳ͍ɻ• DMSͰϨϓϦέʔγϣϯ͠Α͏ͱͨ࣌͠ͰίέΔɻ• hoge_date NOT NULL DEFAULT '0000-00-00' ͷڪා...58
Zero Dateͷରॲ• ·ͣɺจࣈྻͰड͚ͱΔɻALTER TABLE hogeALTER 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
with timezoneMySQLͷJSTͰདྷΔ(͕ɺTimezoneͷใͳ͍)ɻPostgreSQLͰͦͷ··Insert͢Δɻ(UTCͱͯ͠ѻΘΕΔ)↓ʮύʔςΟͷ։࠵͕ਂͷ1͔࣌Β2࣌ͬͯͳͬͯ·͢ΑʁʯJSTΛUTCʹมͨ͠ঢ়ଶͰೖΕΔɻ60
with timezoneͪͳΈʹ RDSͩͱ SELECT NOW(); ͕ UTCʹͳΔɻίʔυͷόάͰ NOW() ͰσʔλΛೖΕͯΔ࣌ɾɾԿͱ18࣌ؒͣΕΔɻɻ61
5. ·ͱΊ• MackerelͷνΣοΫϓϥάΠϯΛར༻͍ͯ͠Δɻ• νΣοΫϓϥάΠϯͰ͖ͳίϚϯυΛୟ͘ࣄ͕ग़དྷΔɻ• DBϩάͷࢹΤϥʔͷࢹͱϦϑΝΫλϦϯάͷ྆ํʹޮ͘ɻ• ࢥͬͯΔΑΓఆ֎ͷσʔλೖΔɻ62
6. ·ͱΊ63
ࠓճͷDMSϦϑΝΫλϦϯάͷ࠷େͷϝϦοτຊདྷലେͳֻ͕͔Δ(͘͠ಡΊͳ͍)ͣͷDBϦϑΝΫλϦϯάͷॲཧΛDMSλεΫ(Ҡߦ୯Ґ)Λখͨ͘͞͠ࣄͰগͮͭ͠खΛೖΕΔࣄ͕ग़དྷΔɻͦͷ݁ՌɺӨڹൣғಡΈ͘͢վળΛਐΊΔࣄ͕ग़དྷͨɻ64
ݱࡏ• ·ͩ·ͩӡ༻ͱͯ͠3ϲ݄ͰΓ࢝Ί͔ͨΓɻࠓͷॴɺக໋ইແ͍ɻ(ই͕ແ͍ͱݴ͍ͬͯͳ͍)• ͜Ε͔Β͍ͬͯ͘தͰ৭ΜͳࠈΛݟ͍ͯ͘ͱࢥ͏ɻΞτϓοτ͍͖͍ͯͨ͠ͷͰָ͓͠Έʹʂʂ65
ࠂ66
Πϕϯτࠂ• ୈ25ճ தࠃํDBษڧձ in ௗऔ• 2018-12-01() 13:00ʙPostgreSQL 11ੌ͍ͧʂMySQL 8.0ੌ͍ͧʂ→ ʮͲ͏ͬͯόʔδϣϯΞοϓ͢Δͷʁʯख๏Λ͓ग़དྷΔߨࢣਞͷํΛ͓ট͖ͯ͠͝հ͠·͢ʂ67
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂʂ68