Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

ϦϑΝΫλϦϯάख๏ 17

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

22

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

4. AWS Database Migration Service ͱ͸ 36

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

40

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

PHPͷத਎ʹ͍ͭͯ AWS SDK for PHP Ͱ downloadDBLogFilePortionؔ਺Λ࣮ߦ. ʢDBͷϩάΛ ࢦఆҐஔ͔Βμ΢ϯϩʔυ͢Δɻʣ • :ERROR: ͳͲͷΩʔϫʔυΛरͬͯɺ Ωʔϫʔυ͕͋Ε͹ ͦͷจࣈྻΛechoͯ͠exit(1) Ͱऴྃ͢Δ. • MackerelͷcheckϓϥάΠϯ exit(0) : ਖ਼ৗ exit(1) : ҟৗ(WARNING) exit(2) : ۓٸ(CRITICAL) • MackerelͷઃఆͰWARNINGΞϥʔτ্͕͕ͬͨ࣌ͷ௨஌ઌΛઃఆ͢Δɻ 54

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

with timezone໰୊ MySQLͷ೔෇͸JSTͰདྷΔ(͕ɺTimezoneͷ৘ใ͸ͳ͍)ɻ PostgreSQLͰͦͷ··Insert͢Δɻ(UTCͱͯ͠ѻΘΕΔ) ↓ ʮύʔςΟͷ։࠵೔͕ਂ໷ͷ1͔࣌Β2࣌ͬͯͳͬͯ·͢Αʁʯ JSTΛUTCʹม׵ͨ͠ঢ়ଶͰೖΕΔɻ 60

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

6. ·ͱΊ 63

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

ࠂ஌ 66

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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