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
システムリプレースの中でCDCを取り入れている話/chugokudb32-cdc
Search
Takahashi Ikki
October 06, 2023
Programming
1
460
システムリプレースの中でCDCを取り入れている話/chugokudb32-cdc
第32回 中国地方DB勉強会 において、発表させてもらいました。
Change Data Capture についての紹介です。
Takahashi Ikki
October 06, 2023
Tweet
Share
More Decks by Takahashi Ikki
See All by Takahashi Ikki
のびしろを広げる巻き込まれ力:偶然を活かすキャリアの作り方/oso2024
takahashiikki
1
590
ビジネスを止めずにシステムリプレースを進める為のCDCという選択肢/osc24ng-2-b
takahashiikki
0
43
アプリケーションエンジニアから見たPostgreSQL16 の新機能/postgresql16-new-information
takahashiikki
0
220
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
750
AWS DMSを利用した今風DBリファクタリング/jawsug_okayama_2019
takahashiikki
1
850
Other Decks in Programming
See All in Programming
GoとPHPのインターフェイスの違い
shimabox
2
190
Multi Step Form, Decentralized Autonomous Organization
pumpkiinbell
1
740
チームリードになって変わったこと
isaka1022
0
200
ARA Ansible for the teams
kksat
0
150
Pulsar2 を雰囲気で使ってみよう
anoken
0
240
XStateを用いた堅牢なReact Components設計~複雑なClient Stateをシンプルに~ @React Tokyo ミートアップ #2
kfurusho
1
900
密集、ドキュメントのコロケーション with AWS Lambda
satoshi256kbyte
0
190
CDK開発におけるコーディング規約の運用
yamanashi_ren01
2
120
2024年のkintone API振り返りと2025年 / kintone API look back in 2024
tasshi
0
220
Amazon S3 TablesとAmazon S3 Metadataを触ってみた / 20250201-jawsug-tochigi-s3tables-s3metadata
kasacchiful
0
160
WebDriver BiDiとは何なのか
yotahada3
1
140
もう僕は OpenAPI を書きたくない
sgash708
5
1.6k
Featured
See All Featured
BBQ
matthewcrist
87
9.5k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
Thoughts on Productivity
jonyablonski
69
4.5k
A Tale of Four Properties
chriscoyier
158
23k
Done Done
chrislema
182
16k
Large-scale JavaScript Application Architecture
addyosmani
511
110k
Facilitating Awesome Meetings
lara
52
6.2k
Docker and Python
trallard
44
3.3k
Agile that works and the tools we love
rasmusluckow
328
21k
Designing on Purpose - Digital PM Summit 2013
jponch
117
7.1k
Why Our Code Smells
bkeepers
PRO
336
57k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.2k
Transcript
γεςϜϦϓϨʔεͷதͰ CDCΛऔΓೖΕͯΔ 2023-10-07 தࠃํDBษڧձ ຊPostgreSQLϢʔβʔձ ߴڮ Ұٍ
ࣗݾհ • ߴڮ Ұٍ (@ikkitang) • ελʔϑΣεςΟόϧגࣜձࣾ Tech Product Manager
• TypeScriptͱGo • ຊPostgreSQLϢʔβʔձ தࠃࢧ෦
͓͠ͳ͕͖ • CDC࠾༻ͷഎܠ • CDCͱʁ • Debeziumͷಛ
ҙࣄ߲ • εϥΠυެ։ࡁΈͰ͢ • ࣭ͱ͔͋Ε #ChugokuDB Λ͝׆༻͍ͩ͘͞ʂ • ͷ࣠ͱͯ͠"γεςϜϦϓϨʔε"͕ग़ͯ͘ΔͷͰ ՝ײͷڞײͷҙਤΛࠐΊͯ
ॴଐͷձࣾͷΛଟ͘͠·͕͢࠾༻త͡Όͳ͍Ͱ͢ • ※ CDC࠾༻ͷഎܠ͕݁ߏϘϦϡʔϜΛ͠Ίͯ͠·͍·ͨ͠
CDC࠾༻ͷഎܠ
CDC࠾༻ͷഎܠ ελʔϑΣεςΟόϧגࣜձࣾ • 20097݄7ۀʢ15ظʣ • BtoB(C) ͚ͷϏδωεϞσϧΛల։ • ҿ৯ళ༷ͷECࢀೖɾӡ༻Λτʔλϧࢧ ԉ
• ECαΠτ্Ͱจɾܾࡁड • ͷडऔ • ͷ͓ಧ͚
CDC࠾༻ͷഎܠ ελʔϑΣεςΟόϧגࣜձࣾͷϓϩμΫτͷ՝ײ • 3छྨͷΞΫλʔ • ύʔτφʔ, ૹύʔτφʔ, ٤৯ऀ༷ • 15ظͷϏδωεΛࢧ͑ͨෳࡶͳۀϑϩʔʢిʣ
• ͦΕΒΛશ෦ࢧ͑Δ "தԝूݖͷΞϓϦέʔγϣϯ" • ʮγεςϜͷ߹Ͱ...͝ڠྗΛ͓ئ͍͍ͨ͠·͢ʯ
CDC࠾༻ͷഎܠ γεςϜϦϓϨʔεΛΔ • γεςϜϦϑΝΫλϦϯάͰͳͯ͘ɺϦϓϨʔε. • ϦϑΝΫλϦϯά֎෦తͳৼΔ͍Λม͑ͳ͍ࣄ͕ఆٛ • ৼΔ͍ม͑ͳ͍ͱɺ՝ղܾʹͳΒͳ͍ͷͰม͍͑ͯ͘ • ٕज़తʹ͖Ε͍ʹͳ͚ͬͨͩͷچγεςϜͭ͘Βͳ͍
CDC࠾༻ͷഎܠ ϦϞσϦϯάΛΔ • ϢʔβʔͷߦಈಈػΛੳͯ͠ ײతͳυϝΠϯʢ༻ޠɾUIʣͱͯ͠࠶ఆٛ͢Δ • ϦϞσϦϯάͨ͠ϞσϧΛѻ͏৽γεςϜΛఏڙ͢Δ
CDC࠾༻ͷഎܠ Ϟσϧ͕ίϯςΩετΛ·͙ͨ • ҰํͰɺҰਓͷΞΫλʔ͔ΒݟͨײతͳυϝΠϯɺผͷΞΫλʔ͔ΒݟΔͱײత͡Ό ͳ͍ࣄ͕͋Δ • ʮΞΫλʔ͕มΘΔͱؔ৺͕มΘΔʯΛແࢹͯ͠৽γεςϜͰѻ͍ͬͯ͘ͱ·ͨಉ͡ ͕ൃੜ͢Δ • ͏·͘ίϯςΩετΛ·͍ͨͰ͍͘Έ͕ඞཁ
=> ΠϕϯτۦಈܕΞʔΩςΫνϟΛ࠾༻ • ྫɿ ύʔτφʔ͕"Λొ"ͨ࣌͠ɺͦͷαϙʔτνʔϜͷ "৹ࠪͪ"ϦετʹฒͿ
CDC࠾༻ͷഎܠ·Ͱ͏গ͠Ͱ͢
CDC࠾༻ͷഎܠ ΠϕϯτۦಈܕΞʔΩςΫνϟ • ΞϓϦέʔγϣϯΛߏ͢Δίϯϙʔωϯτ͕Πϕϯτʹج͍ͮͯಈ࡞͢Δઃܭύλʔϯ • ಛఆͷΠϕϯτ͕ൃੜͨ࣌͠ʹదʹΞΫγϣϯΛى͜͢ࣄΛత • × Λొͯ͠ʂ •
̋ ͕ొ͞Ε·ͨ͠ʂ • εέʔϥϏϦςΟ, ॊೈੑ͕ߴ·Δ • Apache Kafka ͱ͍͏ϛυϧΣΞͷγΣΞ͕ଟ͍
CDC࠾༻ͷഎܠ Apache Ka)aΛ༻͍ͨ ΠϕϯτۦಈܕΞʔΩςΫ νϟ • ύʔτφʔ༻ͷΞϓϦέʔγϣϯ • SoEʢྑ͍UXΛఏڙ͍ͨ͠!ʣ •
͚ࣾཧը໘ͷΞϓϦέʔγϣϯ • SoRʢ͍ͭ୭͕ͲΜͳࢦࣔͷجͰ࣮ߦ͔ͨ͠. ཤྺʹ ॏ͖Λஔ͘ʣ • ΞΫλʔΞϓϦέʔγϣϯͷੑ࣭ͷҧ͍Λka-aΛ ഊࢭͱͯ͠औΓೖΕΔࣄͰંΓ߹͍͚ͭͯΔ
ҰํͰ..!
ແࢹͰ͖ͳ͍چγεςϜ • ݱঢ়Ϗδωεಈ͍͍ͯͯͯɺಉ࣌ӡ༻ආ͚ΒΕͳ͍ • ઌఔઃܭͨ͠ka$aͷϝοηʔδͷૹ৴ΛچγεςϜʹରͯ͠ खΛೖΕΔࣄ͍͠ • ͳΜͱ͔ɺچγεςϜͱ͏·͘࿈ܞΛऔΔࣄ͕ग़དྷͳ͍͔ʁ
CDCΛ࠾༻͢Δͧʂʂ
CDC ͱ
CDCͱ • Change Data Capture • σʔλϕʔεͷมߋʢInsert,Update,DeleteʣΠϕϯτΛݕ͠ ผͷΞϓϦέʔγϣϯʹୡ͢ΔͨΊͷٕज़ख๏ • ࠾༻ࣄྫ
• ৯ϩά͞Μɿ Elas5cSearch IndexͷϦΞϧλΠϜߋ৽ • Chatwork͞Μɿ CQRSϞσϧͷߋ৽(ಡΈࠐΈϞσϧͷߋ৽) • ΦϛΧϨ͞Μɿ σʔλϕʔεϦϑΝΫλϦϯά • Debezium ౕ͕ͬͯྑ͍Β͍͠
Debeziumͷಛ
Debezium ͷಛ • Apache Ka*a Connect ʹ४ڌͯ͠࡞ΒΕͨ CDCͷπʔϧηοτ • Debeziumࣗମ
DBͷมߋΠϕϯτΛKa*aͷϝοηʔδͱͯ͠ ൃՐ͢Δ • DB͝ͱʹConnectorΛͬͯมߋΠϕϯτͷݕΛ࣮ݱ͢Δ • MySQL, PostgreSQL, SQL Server, Oracle, MongoDB, Cloud Spanner, ...
༻ྫ ͜ΜͳJSONΛ࡞Δ. { "name": "connector໊", "config": { "connector.class": "io.debezium.connector.mysql.MySqlConnector", "ུ":
"ུ", "database.hostname": "{mysql}", "database.port": "{port}", "database.user": "{user}", "database.password": "{password}", "database.include.list": "{schema}", "table.include.list": "{schema.table1,...}", "snapshot.mode": "initial" } } ͜Μͳσʔλ͕ಘΒΕΔ // Insert { "before": null, "after": { "id": 1, "name": "init name" } } // Update { "before": { "id": 1, "name": "before name" }, "after": { "id": 1, "name": "after name" } } // Delete { "before": { "id": 1, "name": "after name" }, "after": null }
ӡ༻ʹ͓͍ͯؾΛ͚ͭΔࣄ Debezium • ConnectorͰಡΈࠐΉςʔϒϧΛՃ͢Δ࣌ ৬ਓ͕ܳඞཁ ʢΫισΧίωΫλʔ໊Λ͚ͭͳ͍ʂ 1ഊʣ MySQL • ίωΫλఆٛ࣌ͷσϑΥϧτͷڍಈͱͯ͠
ςʔϒϧͷશϨίʔυΛಡΈऔΔʢεφοϓγϣοτʣ • ಡऔதʹಉ͡Ϩίʔυ͕ಡΊΔΑ͏ʹϩοΫऔΔ ʢάϩʔόϧϦʔυϩοΫ or ςʔϒϧϩοΫʣ • ΊͪΌͪ͘ΌͰ͔͍ςʔϒϧΛಡΉ͍࣌ʢ͍ 1ഊʣ PostgreSQL • ಡऔઐ༻γϦΞϥΠβϒϧϨϕϧͷ τϥϯβΫγϣϯΛషΔ • ϩοΫແ͍
ӡ༻ʹ͓͍ͯؾΛ͚ͭΔࣄͷվળྫ • DebeziumͷϩοΫΛؾʹ͢Δ߹ɺ CDCઐ༻ͷReadReplicaΛཱͯΔ • Debeziumࣗମʹࢮ׆ࢹΛೖΕ͓ͯ͘ͷ͕ྑ͍ • αʔόʔ֤λεΫͷੜ͖ࢮʹ • ʮࡴ͞Ε·ͨ͠ɻࣗಈͰىಈग़དྷͳ͍ͷͰखಈͰىͯ͜͠ʯ
ͬͯϩάʹग़ΔͷͰͦΕͷࢹ • ↑ ։ൃɾݕূڥͳͲͷ DBΛࢭΊΔڥͰൃੜ͢Δ • Subscrip6on Filter Ͱݕͯ͠ LambdaͰ Restart API Λࣗಈ࣮ߦ͢Δ
(10ϲ݄)ӡ༻ͯ͠ΈͯಘΒΕͨݟɾײ • ΊͪΌͪ͘Ό͍ • APIʹϦΫΤετ͛ͯ Ϧϩʔυͨ͠Βө͞ΕͯΔ • RESTͰͷઃఆָ͕ • IaaC
• ެࣜυΩϡϝϯτͷཏੑ • ϋϚͬͯɺجຊެࣜDoc͕Ҿ༻ ͞ΕͯΔ • ϑϧϚωʔδυ͡Όͳ͍ • MSKͰka'a-connectαϙʔτͯ͠ Δ͚Ͳɺӡ༻ʹͷͤΔͷ͕ϦεΫ • ઃఆϛεͬͯΔͱͣͬͱϦτϥΠ ʢREST͑ͳ͍ʣ • ϩʔΧϧڥ • DBͱͷଓ͕Ұఆࢭ·Δ࣌ʹ૬ ੑѱΊ
Ҏ্Ͱ͢ʂ