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
450
ビジネスを止めずにシステムリプレースを進める為のCDCという選択肢/osc24ng-2-b
takahashiikki
0
26
アプリケーションエンジニアから見たPostgreSQL16 の新機能/postgresql16-new-information
takahashiikki
0
180
システムリプレースの中でCDCを取り入れている話/chugokudb32-cdc
takahashiikki
1
420
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
730
Other Decks in Programming
See All in Programming
RubyLSPのマルチバイト文字対応
notfounds
0
120
イベント駆動で成長して委員会
happymana
1
320
A Journey of Contribution and Collaboration in Open Source
ivargrimstad
0
900
3rd party scriptでもReactを使いたい! Preact + Reactのハイブリッド開発
righttouch
PRO
1
600
Remix on Hono on Cloudflare Workers
yusukebe
1
290
Macとオーディオ再生 2024/11/02
yusukeito
0
370
Generative AI Use Cases JP (略称:GenU)奮闘記
hideg
1
290
PHP でアセンブリ言語のように書く技術
memory1994
PRO
1
170
.NET のための通信フレームワーク MagicOnion 入門 / Introduction to MagicOnion
mayuki
1
1.5k
Tauriでネイティブアプリを作りたい
tsucchinoko
0
370
CSC509 Lecture 12
javiergs
PRO
0
160
型付き API リクエストを実現するいくつかの手法とその選択 / Typed API Request
euxn23
8
2.2k
Featured
See All Featured
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.5k
Speed Design
sergeychernyshev
24
610
Site-Speed That Sticks
csswizardry
0
23
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Building Better People: How to give real-time feedback that sticks.
wjessup
364
19k
We Have a Design System, Now What?
morganepeng
50
7.2k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.2k
Ruby is Unlike a Banana
tanoku
97
11k
A better future with KSS
kneath
238
17k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
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