Debezium connector for MySQLのお勉強
Debezium connector for MySQL
MySQLのバイナリログ(binlog)を読み、データベース内の変更を検知している。
MySQLコネクタは最初にデータベースのスナップショットを作成する。
ref: https://debezium.io/documentation/reference/stable/connectors/mysql.html
スナップショット
キャプチャするテーブルの書き込みをブロックするため、テーブルのグローバル読み取りロックを取得している。
スナップショットを作成する過程でbinlogに書き込まれている変更イベントをKafkaのトピックに発行する。
スナップショットが作成完了するとテーブルの現在の状況を把握できるため、これ以降の変更を検知できる。
ref: https://debezium.io/documentation/reference/stable/connectors/mysql.html#mysql-snapshots
起動時にbinlogが複数個あったときの挙動
Debezium connector for MySQLのコードを読んでみると、determineSnapshotOffset
メソッドで以下のクエリが実行されるので一番最新のbinlogファイルだけを読み込むことが分かる
ref: SHOW MASTER STATUS
determineSnapshotOffset
メソッドがいつ呼び出されるか確認する
スナップショットを作成する前に呼び出される関数だと思うので、MySQLコネクタを起動するメソッドを確認する
MySqlConnectorTask.start()
ではMySqlChangeEventSourceFactory
インスタンスをフィールドに持つChangeEventSourceCoordinator
インスタンスを生成し、start
メソッドを実行している
start
メソッドの処理を追っていくとスナップショットの作成をしていることが分かる
execute
メソッドはAbstractSnapshotChangeEventSource
クラスに定義されており、その中でdoExecute
メソッドを実行している
doExecute
メソッドはRelationalSnapshotChangeEventSource
クラスに定義されており、その中でdetermineSnapshotOffset
メソッドを実行していることが分かった
doExecute
メソッドがスナップショットを作成する処理そのもの