Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
MySQLからPostgreSQLへの移行とDBリファクタリング/postgresqlJapa...
Search
Takahashi Ikki
November 22, 2018
Programming
5
7.5k
MySQLからPostgreSQLへの移行とDBリファクタリング/postgresqlJapan2018
2018-11-22 に行われた PostgreSQL Conference Japan 2018 のスライドです!
Takahashi Ikki
November 22, 2018
Tweet
Share
More Decks by Takahashi Ikki
See All by Takahashi Ikki
のびしろを広げる巻き込まれ力:偶然を活かすキャリアの作り方/oso2024
takahashiikki
1
510
ビジネスを止めずにシステムリプレースを進める為のCDCという選択肢/osc24ng-2-b
takahashiikki
0
29
アプリケーションエンジニアから見たPostgreSQL16 の新機能/postgresql16-new-information
takahashiikki
0
190
システムリプレースの中でCDCを取り入れている話/chugokudb32-cdc
takahashiikki
1
430
DBリファクタリングのデータリモデリング勘所/stafesstudy-db-modling
takahashiikki
4
1.9k
アプリケーションエンジニアから見たPostgreSQL15 の新機能/postgresql15-new-information
takahashiikki
7
2.8k
HowDoYouLikePostgreSQl12/Chugokudb28-1
takahashiikki
1
1.1k
SQLチューニング_理論と改善の実例_/pgcon19j_t4
takahashiikki
10
3.5k
SQLチューニング 理論と実践/osc19ni
takahashiikki
0
740
Other Decks in Programming
See All in Programming
今年のアップデートで振り返るCDKセキュリティのシフトレフト/2024-cdk-security-shift-left
tomoki10
0
200
フロントエンドのディレクトリ構成どうしてる? Feature-Sliced Design 導入体験談
osakatechlab
8
4.1k
Scalaから始めるOpenFeature入門 / Scalaわいわい勉強会 #4
arthur1
1
330
たのしいparse.y
ydah
3
120
KMP와 kotlinx.rpc로 서버와 클라이언트 동기화
kwakeuijin
0
140
Amazon S3 NYJavaSIG 2024-12-12
sullis
0
100
testcontainers のススメ
sgash708
1
120
PHPで学ぶプログラミングの教訓 / Lessons in Programming Learned through PHP
nrslib
2
260
php-conference-japan-2024
tasuku43
0
290
短期間での新規プロダクト開発における「コスパの良い」Goのテスト戦略」 / kamakura.go
n3xem
2
170
「とりあえず動く」コードはよい、「読みやすい」コードはもっとよい / Code that 'just works' is good, but code that is 'readable' is even better.
mkmk884
3
390
Kaigi on Railsに初参加したら、その日にLT登壇が決定した件について
tama50505
0
100
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
29
2k
How to Think Like a Performance Engineer
csswizardry
22
1.2k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
111
49k
Reflections from 52 weeks, 52 projects
jeffersonlam
347
20k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
Facilitating Awesome Meetings
lara
50
6.1k
Rails Girls Zürich Keynote
gr2m
94
13k
Navigating Team Friction
lara
183
15k
Why Our Code Smells
bkeepers
PRO
335
57k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
95
17k
Bash Introduction
62gerente
608
210k
Transcript
MySQL ͔Β PostgreSQL ͷҠߦͱ DBϦϑΝΫλϦϯά 2018-11-22 PostgreSQL Conference Japan 2018
ຊPostgreSQLϢʔβʔձ தࠃํࢧ෦ ߴڮ Ұٍ 1
͓͠ͳ͕͖ 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
• ࠗ׆ύʔςΟΛݕࡧ͢Δػೳ • ࠗ׆ύʔςΟͷ༧͢ΔAPI 19
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ΑΓ༏Ε͍ͯΔ(ͱࢥͬͨ)2 29
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
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 = 5
memo = "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 Date MySQLͰ 0000-00-00 Λ DatetimeܕͷΧϥϜʹొ͢Δࣄ͕ग़དྷΔɻ PostgreSQLͰ 0000-00-00 Λ ʹΩϟετ͢Δࣄવग़དྷͳ͍ɻ
• DMSͰϨϓϦέʔγϣϯ͠Α͏ͱͨ࣌͠ͰίέΔɻ • hoge_date NOT NULL DEFAULT '0000-00-00' ͷڪා... 58
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
with timezone MySQLͷ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