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
300
システムリプレースの中で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
アプリケーションエンジニアから見たPostgreSQL16 の新機能/postgresql16-new-information
takahashiikki
0
90
DBリファクタリングのデータリモデリング勘所/stafesstudy-db-modling
takahashiikki
4
1.6k
アプリケーションエンジニアから見たPostgreSQL15 の新機能/postgresql15-new-information
takahashiikki
7
2.6k
HowDoYouLikePostgreSQl12/Chugokudb28-1
takahashiikki
1
950
SQLチューニング_理論と改善の実例_/pgcon19j_t4
takahashiikki
10
3.3k
SQLチューニング 理論と実践/osc19ni
takahashiikki
0
620
AWS DMSを利用した今風DBリファクタリング/jawsug_okayama_2019
takahashiikki
1
680
DMSを使った異種DB移行で学んだPostgreSQLの面白い所/chugokudb27-postgresql-is-interesting
takahashiikki
2
1k
SQLチューニングの基礎~基礎から振り返るExplainコマンド~/chugokudb26-sql-tuning
takahashiikki
0
1.2k
Other Decks in Programming
See All in Programming
TCAとKMPを用いた新規動画配信アプリ 「ABEMA Live」の設計
tomu28
1
120
二郎系ラーメンのコールで学ぶ AST 解析
memory1994
PRO
7
1.7k
VS Code をプロダクトにどう取り込むか
onomax
1
470
冗長なエラーログを削減し、スタックトレースを手に入れる / Reducing Verbose Error Logs and Obtaining Stack Traces
upamune
0
840
スキーマ駆動開発による品質とスピードの両立 - 私達は何故、スキーマを書くのか
kentaroutakeda
0
170
try! Swift Tokyo 初参加報告LT
hinakko2
0
220
OpenAPIを中心に考えるAPI開発入門 / Introduction to API Development with a Focus on OpenAPI
seike460
PRO
2
170
エンターテイメント業界で利用されるAWS
demuyan
0
210
大規模UIKitベースアプリへのTCAの段階的導入/gradual-adoption-of-tca-in-a-large-scale-uikit-based-app
takehilo
1
180
禅の心を手に入れよ
eltociear
1
160
コーンフレークから始める モデリング会話入門
ogurotakayuki
0
380
SwiftUIで使いやすいToastの作り方 / How to build a Toast system which is easy to use in SwiftUI
lovee
3
150
Featured
See All Featured
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
274
13k
The Mythical Team-Month
searls
216
42k
Build The Right Thing And Hit Your Dates
maggiecrowley
24
2k
The Cult of Friendly URLs
andyhume
74
5.7k
Facilitating Awesome Meetings
lara
42
5.6k
A designer walks into a library…
pauljervisheath
200
23k
What's new in Ruby 2.0
geeforr
337
31k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
125
32k
The Brand Is Dead. Long Live the Brand.
mthomps
49
29k
Stop Working from a Prison Cell
hatefulcrawdad
266
19k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
155
14k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
19
1.7k
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ͱͷଓ͕Ұఆࢭ·Δ࣌ʹ૬ ੑѱΊ
Ҏ্Ͱ͢ʂ