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
520
システムリプレースの中で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
Amazon RDS 向けに提供されている MCP Server と仕組みを調べてみた/jawsug-okayama-2025-aurora-mcp
takahashiikki
1
110
のびしろを広げる巻き込まれ力:偶然を活かすキャリアの作り方/oso2024
takahashiikki
1
780
ビジネスを止めずにシステムリプレースを進める為のCDCという選択肢/osc24ng-2-b
takahashiikki
0
73
アプリケーションエンジニアから見たPostgreSQL16 の新機能/postgresql16-new-information
takahashiikki
0
330
DBリファクタリングのデータリモデリング勘所/stafesstudy-db-modling
takahashiikki
5
2.1k
アプリケーションエンジニアから見たPostgreSQL15 の新機能/postgresql15-new-information
takahashiikki
7
2.9k
HowDoYouLikePostgreSQl12/Chugokudb28-1
takahashiikki
1
1.2k
SQLチューニング_理論と改善の実例_/pgcon19j_t4
takahashiikki
10
3.7k
SQLチューニング 理論と実践/osc19ni
takahashiikki
0
800
Other Decks in Programming
See All in Programming
Ruby×iOSアプリ開発 ~共に歩んだエコシステムの物語~
temoki
0
320
もうちょっといいRubyプロファイラを作りたい (2025)
osyoyu
1
440
ユーザーも開発者も悩ませない TV アプリ開発 ~Compose の内部実装から学ぶフォーカス制御~
taked137
0
180
AWS発のAIエディタKiroを使ってみた
iriikeita
1
190
Improving my own Ruby thereafter
sisshiki1969
1
160
基礎から学ぶ大画面対応(Learning Large-Screen Support from the Ground Up)
tomoya0x00
0
1.5k
モバイルアプリからWebへの横展開を加速した話_Claude_Code_実践術.pdf
kazuyasakamoto
0
330
意外と簡単!?フロントエンドでパスキー認証を実現する WebAuthn
teamlab
PRO
2
760
そのAPI、誰のため? Androidライブラリ設計における利用者目線の実践テクニック
mkeeda
2
310
Flutter with Dart MCP: All You Need - 박제창 2025 I/O Extended Busan
itsmedreamwalker
0
150
Oracle Database Technology Night 92 Database Connection control FAN-AC
oracle4engineer
PRO
1
450
Reading Rails 1.0 Source Code
okuramasafumi
0
230
Featured
See All Featured
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
Building Applications with DynamoDB
mza
96
6.6k
The Cult of Friendly URLs
andyhume
79
6.6k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3k
Facilitating Awesome Meetings
lara
55
6.5k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.9k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.9k
Why You Should Never Use an ORM
jnunemaker
PRO
59
9.5k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
Git: the NoSQL Database
bkeepers
PRO
431
66k
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ͱͷଓ͕Ұఆࢭ·Δ࣌ʹ૬ ੑѱΊ
Ҏ্Ͱ͢ʂ