---
title: ビジネスを止めずにシステムリプレースを進める為のCDCという選択肢
tags: 
author: [ikkitang](https://convert.docswell.com/user/ikkitang938)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/YE6Y9D1PJV.jpg?width=480
description: Open Source Conference 2024 Nagaoka で発表した発表資料です。  https://ospn.connpass.com/event/325425/  私はキャリアの中で、多くのシステムリプレースに携わってきました。リソースが限られる中、開発を可能な限り止めずに並行稼働しながらリプレースを成功させるために、CDC（チェンジデータキャプチャ）を採用した手法をご紹介します。具体的には、Debeziumを使った実践例を通じて、Webアプリケーション開発者向けに効果的な方法をお伝えします。  対象者: - Webアプリケーション開発者 - スタートアップなどにお勤めのシステムエンジニアの方
published: October 20, 24
canonical: https://convert.docswell.com/s/ikkitang938/KXEW1G-osc24ng-2-b
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/YE6Y9D1PJV.jpg)

ビジネスを止めずに
システムリプレースを
進める為のCDCという
選択肢
2024-10-12 Open Source Conference 2024 Nagaoka


# Page. 2

![Page Image](https://bcdn.docswell.com/page/GE5GN34PE4.jpg)

INDEX
目次
01 自己紹介
02 システムリプレースの目的
03 CDCの紹介
04 最後に


# Page. 3

![Page Image](https://bcdn.docswell.com/page/972Y5ZVZ7R.jpg)

01
自己紹介
高橋 一騎
( @ikkitang)
・ Webアプリケーションエンジニア(12年目)
・ バックエンドエンジニア | テックリード
・ 日本PostgreSQLユーザー会 中国地方支部長
・ 妻と息子と娘と岡山在住
TakahashiIkki
TakahashiIkki
ikkitang
ikkitang


# Page. 4

![Page Image](https://bcdn.docswell.com/page/DJYGKR3NJM.jpg)

01
宣伝 (1)
2024年10月19日 (土)
オープンセミナー岡山
https://okayama.open-seminar.org/
メインテーマは 「のびしろ」
『のびしろを広げる巻き込まれ力：
偶然を活かすキャリアの作り方』
高橋が講演予定!!


# Page. 5

![Page Image](https://bcdn.docswell.com/page/V7NGRDVVE8.jpg)

01
宣伝 (2)
2024年12月06日 (金)
PostgreSQL Conference Japan 2024
https://www.postgresql.jp/jpug-pgcon2024
PostgreSQLをテーマにカンファレンス
を開催します。
絶賛チケット販売中！！


# Page. 6

![Page Image](https://bcdn.docswell.com/page/YJ9WMG6VJ3.jpg)

01
宣伝 (3)
(不定期)
PostgreSQL アンカンファレンス
https://pgunconf.connpass.com/
オフライン or オンラインで
PostgreSQLをテーマに勉強会を開催
1セッションが10~20分と短くて
参加や聴講などが気軽にできます


# Page. 7

![Page Image](https://bcdn.docswell.com/page/GJ8NLVZ4ED.jpg)

02
システムリプレースの目的


# Page. 8

![Page Image](https://bcdn.docswell.com/page/LJLPL5DVER.jpg)

02
システムリプレースとは
システムリプレース
既存のシステム（サービス）やソフトウェアを新しいシステムやソフトウェアに
置き換える事を指す
システムリプレースの手法として、
徐々に新システムに移行するフェーズアプローチと
一度にすべてのシステムを新しいものに切り替えるビッグバンアプローチがある
システムの規模感によって、手法を選択する。


# Page. 9

![Page Image](https://bcdn.docswell.com/page/47M4M3PNEW.jpg)

02
システムリプレースとは
システムリプレース
既存のシステム（サービス）やソフトウェアを新しいシステムやソフトウェアに
置き換える事を指す
今日はこっち
システムリプレースの手法として、
徐々に新システムに移行するフェーズアプローチと
一度にすべてのシステムを新しいものに切り替えるビッグバンアプローチがある
システムの規模感によって、手法を選択する。


# Page. 10

![Page Image](https://bcdn.docswell.com/page/P7RWVQ14E9.jpg)

02
システム開発のジレンマ
サービス開始から複数年が経過して、コードベースが大きい
作った人が退職してもう居なくて、何故この機能があるのかが分か
らない
機能リリース優先で作られた為、どこかを修正すればどんな影響が
発生するか分からない
色んな要因によって事業成長のスピードが妨げられてしまう


# Page. 11

![Page Image](https://bcdn.docswell.com/page/PJXPZ5YZEX.jpg)

02
システム開発のジレンマ
予約レコード
ゲスト会員予約は
撤廃されてて
カラムは使ってない
予約ID
...
性別
ゲスト会員
フラグ
1
...
“男性”
1
2
...
“女性”
0
...
...
...
...
...
“1”
0
1000
性別の書式が
定まってない


# Page. 12

![Page Image](https://bcdn.docswell.com/page/3JKD863V7D.jpg)

02
フェーズアプローチを選ぶ
今後の事業の成長の為にも日々機能開発は行いたい
vs
機能開発を妨げる要因が沢山ある
開発の限られたリソースを
全てシステムリプレースに割り当てる事はできない。
ので、一部ずつ切り替えながらやる フェーズアプローチを選ぶ


# Page. 13

![Page Image](https://bcdn.docswell.com/page/LE3R26LQ75.jpg)

02
システムリプレースをやる
何のためにシステムリプレースをするのか
機能開発を阻害する要因を取り除く
技術部分の老朽化・パフォーマンス向上に対応する
EoLを迎えたのでバージョンアップとか
運用コストを削減する
運用を再度見直す


# Page. 14

![Page Image](https://bcdn.docswell.com/page/8EDYZVNWEG.jpg)

02
システムリプレースをやる
フレームワークのバージョンを上げる！
TypeScript ( or Go or Rust ) で書き直す！
SPA化して、Reactを採用する！
開発のしやすさが上がって、価値提供までの速度は上がるが
一方で「キレイな旧システム」を作ってしまう可能性もある


# Page. 15

![Page Image](https://bcdn.docswell.com/page/V7P6DV5XJ8.jpg)

02
システムリプレースをやる
例えばこういうパターン →
クーポンには審査の概念があり、
承認されたクーポンのみを使う事が
できる（というコード）
移植自体は簡単ではあるが、ヒアリング
すると、現在はクーポンの承認フローは
無くて特に見ずに承認しているという
背景があった


# Page. 16

![Page Image](https://bcdn.docswell.com/page/2JV31ZP3EQ.jpg)

02
システムリプレースをやる
システムリプレースとして
クーポンの承認フローを消す方針を取る
運用フローの改善をする
コードの認知不可を削減する
といったメリットが生まれる


# Page. 17

![Page Image](https://bcdn.docswell.com/page/5EG324PY7L.jpg)

02
システムリプレースをやる
システムの振る舞いを変えない システムリファクタリングではなくて
システムの振る舞いを見直して置き換える システムリプレースをやる
要件定義・要求定義コストをかけても
中長期で運用コストを減らして皆が嬉しいシステムを作っていく


# Page. 18

![Page Image](https://bcdn.docswell.com/page/4JQ5PG267P.jpg)

03
CDCの紹介


# Page. 19

![Page Image](https://bcdn.docswell.com/page/K749Y5LME1.jpg)

03
フェーズアプローチを進める
フェーズアプローチは一部ずつ切り替えながら進めていく手法なので
旧システムとリプレースさせた新システムが平行稼働する
データベースをリモデリングしたいけどその場合は？
結局、旧システムからも書き込みをしないといけない？
↑極力、旧システムには手をいれずに連携を取りたい ... !!!


# Page. 20

![Page Image](https://bcdn.docswell.com/page/LJ1K6WLY7G.jpg)

03
CDC
そこでCDCを採用してみる


# Page. 21

![Page Image](https://bcdn.docswell.com/page/GJWDW6V172.jpg)

03
CDC
CDC : Change Data Capture
データベースの変更（ Insert / Update / Delete ) を検知し
別のアプリケーションに伝達する為の技術や手法
採用事例
食べログさん： ElasticSearch Indexのリアルタイム更新
Chatworkさん： CQRSモデルの更新
オミカレさん： DBリファクタリングの実践


# Page. 22

![Page Image](https://bcdn.docswell.com/page/4EZG5Y4XJ3.jpg)

03
CDC
伝搬
更新SQL
旧システム
DB
イベント /
メッセージ
伝
搬
新システム
DB
新システム


# Page. 23

![Page Image](https://bcdn.docswell.com/page/Y76Y9D3PEV.jpg)

03
CDC
伝搬
更新SQL
旧システム
DB
イベント /
メッセージ
伝
搬
新システム
DB
ここが CDC
新システム


# Page. 24

![Page Image](https://bcdn.docswell.com/page/G75GN3LP74.jpg)

03
トリガーベースのCDC
名著 『データベース・リファクタリング』 でも紹介されている手法
新カラム（新テーブル）を追加
トリガーを用いて旧カラムの書き込みを検知して新カラムを更新
新カラムから読むようにコードを変更する
新カラムへ書き込むようにコードを変更する
旧カラムとトリガーを削除する


# Page. 25

![Page Image](https://bcdn.docswell.com/page/9J2Y5ZLZJR.jpg)

03
トリガーベースのCDC
メリット
SQL標準でも規定されており、ほとんどのDBMSで利用可能
各DBMS毎に方言・仕様がある
デメリット
データベースに追加の負荷が掛かる
トランザクション処理にも影響がある ( ※ 後述 )
SQLで書く必要がある（好みによりそう）
PostgreSQLなら 他言語で書ける
（ざっと調べた感じ、テスト手法があんまり確立されてなさそう）


# Page. 26

![Page Image](https://bcdn.docswell.com/page/DEYGKRQNEM.jpg)

03
トリガーベースのCDC
トランザクションの確定前に
トリガーが順に実行される
before insert
トリガー
users
↑ 設定のとき...
after insert
トリガー
before
トリガー
Begin
app側で
右のような
処理をする
Insert SQL
Insert SQL
Commit
after
トリガー


# Page. 27

![Page Image](https://bcdn.docswell.com/page/VJNGRDKV78.jpg)

03
トリガーベースのCDC
トランザクションの確定前に
トリガーが順に実行される
before insert
トリガー
users
↑ 設定のとき...
after insert
トリガー
before
トリガー
Begin
app側で
右のような
処理をする
Insert SQL
Insert SQL
Commit
after
トリガー
beforeトリガー や
after トリガー で
失敗すると
Insert SQL 全体が
ロールバックされてしまう


# Page. 28

![Page Image](https://bcdn.docswell.com/page/YE9WMGVVE3.jpg)

03
ログベースのCDC
データベースのトランザクションログを直接読み取る手法
一般的にはサポートするツールを導入する手法が取られる
Debezium / AWS DMS / Azure Data Factory / GoldenGate ...
各RDBMS固有のトランザクションログを出力する設定を有効化する
上記ツールのセットアップを行う


# Page. 29

![Page Image](https://bcdn.docswell.com/page/GE8NLVP47D.jpg)

03
ログベースのCDC
メリット
処理を別アプリケーションに切り出す事ができるので、
追加のオーバーヘッドが発生しない。
デメリット
各ツールの運用をキャッチアップする必要がある
Debezium → AWSのマネージドサービスを使用するなら
一部制限がある
AWS DMS → ローカルで開発環境を構成できない (僕調べ)


# Page. 30

![Page Image](https://bcdn.docswell.com/page/LELPL51V7R.jpg)

03
ログベースのCDC
監視
監視
debezium
users
↑ 設定のとき...
users 監視
Consumer
トランザクションは
Insert SQL が成功すれば
コミットされる
Begin
users 監視
Consumer
Begin
app側で
右のような
処理をする
Insert SQL
リファクタリング
Insert SQL
Commit
Commit
users 監視 Consumer は
別ライフサイクルで
トランザクションを実行する


# Page. 31

![Page Image](https://bcdn.docswell.com/page/4JM4M3WN7W.jpg)

03
ログベースのCDC
監視
監視
debezium
users
↑ 設定のとき...
users 監視
Consumer
トランザクションは
Insert SQL が成功すれば
コミットされる
Begin
users 監視
Consumer
Begin
app側で
右のような
処理をする
Insert SQL
リファクタリング
Insert SQL
Commit
users 監視 Consumer は
別ライフサイクルで
トランザクションを実行する
Commit
※ 詳しくは後ほど


# Page. 32

![Page Image](https://bcdn.docswell.com/page/PJRWVQY479.jpg)

03
CDC 手法まとめ
トリガーベース
ログベース
データベースのトリガーを
使用して変更を検出する手法
データベースのトランザクシ
ョンログを直接監視する手法
メリット
ほとんどのDBMSで利用可能
追加の負荷を最小限に
抑える事ができる
デメリット
データベースの動作に追加の
オーバーヘッドが発生する
セットアップの複雑性
手法


# Page. 33

![Page Image](https://bcdn.docswell.com/page/PEXPZ5GZ7X.jpg)

03
ログベースを支えるツール
ログベースのCDCを実践するソフトウェアとして
以下2種類の経験があります
AWS DMS
Debezium


# Page. 34

![Page Image](https://bcdn.docswell.com/page/3EKD864VJD.jpg)

03
AWS DMS
AWS DMS ( Database Migration Service )
データストアから別のデータストアへ移行できるようにするサービス
移行元をソース / 移行先をターゲットという
ソースやターゲットとして主要なRDBMSをサポート（オンプレやS3とかも対象）
特徴
フルマネージドサービスなので管理が楽 ( Terraformなどでも管理できる）
データ移行ツール なので アプリケーションを起動させるとかは一工夫必要


# Page. 35

![Page Image](https://bcdn.docswell.com/page/L73R26DQJ5.jpg)

03
AWS DMSの実例
別DB間のデータ移行
Kafkaに書いて Consumerを動かす
.....
MySQL
AWS DMS
MySQL
Database
AWS DMS
Kafka
Consumer
S3に書いてLambdaを動かす
異種DB間のデータ移行
MySQL
AWS DMS
PostgreSQL
Database
AWS DMS
S3
Lambda


# Page. 36

![Page Image](https://bcdn.docswell.com/page/87DYZVPW7G.jpg)

03
Debezium
Debezium
Kafka Connect を仕様してログベースのCDCを実装するためのツール
ソースとして複数のRDBMSをサポート
特徴
AWSで使用する際、Kafka Connectの設定をいじるRESTエンドポイントが無いので
細かい調整が難しい
Kafkaの仕様に乗っかれるので自由度は高い


# Page. 37

![Page Image](https://bcdn.docswell.com/page/VJP6DVNXE8.jpg)

03
Apache Kafka
Apache Kafka
オープンソースの分散型イベントストリーミングプラットフォーム
大量のメッセージを高速に処理する為に作られた分散メッセージシステム
※解説しだすとめっちゃ時間かかるのでほどほどに ...
特徴
メッセージに対してイベントを発生させる際に少なくとも一回、成功保証を持つ
非常に高速に動作する
高可用性を担保できる


# Page. 38

![Page Image](https://bcdn.docswell.com/page/2EV31ZK37Q.jpg)

03
MySQL
Debezium
Debezium
.....
Consumer部分は
実質的には制限が無いので
自由度の高いアプリケーションが
実装できる
Consumer
データベースのリファクタリングしたり
イベントを受け取ってメールしたり
... etc
Kafka


# Page. 39

![Page Image](https://bcdn.docswell.com/page/57G324QYJL.jpg)

03
Debeziumの使い方イメージ
以下のconfigを Debeziumに設定する
アプリケーション側で以下のJSONが得られる


# Page. 40

![Page Image](https://bcdn.docswell.com/page/4EQ5PGK6JP.jpg)

03
Debeziumの使い方
くわしくはこちら
https://zenn.dev/stafes_blog/articles/ikkitang-691e9913644952


# Page. 41

![Page Image](https://bcdn.docswell.com/page/KJ49Y5PM71.jpg)

04
最後に


# Page. 42

![Page Image](https://bcdn.docswell.com/page/LE1K6W9YJG.jpg)

04
最後に
システムリプレースでは、ソフトウェアは捨てる事ができても
データを捨て去る事は難しい
CDCという手法が困難なシステムリプレースに
立ち向かう一助と慣れれば幸いです
一方でシステムリプレースは何のためを常に自問自答していきましょう


# Page. 43

![Page Image](https://bcdn.docswell.com/page/GEWDW6Q1J2.jpg)

ご清聴ありがとうございました


