Open3

Debezium connector for MySQLのお勉強

さくてぃさくてぃ

スナップショット

キャプチャするテーブルの書き込みをブロックするため、テーブルのグローバル読み取りロックを取得している。
スナップショットを作成する過程で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
https://github.com/debezium/debezium/blob/11d2ff0b9bc123627ae6a725abb9fe4f0faaef72/debezium-connector-mysql/src/main/java/io/debezium/connector/mysql/MySqlSnapshotChangeEventSource.java#L293-L299

determineSnapshotOffsetメソッドがいつ呼び出されるか確認する

スナップショットを作成する前に呼び出される関数だと思うので、MySQLコネクタを起動するメソッドを確認する

MySqlConnectorTask.start()ではMySqlChangeEventSourceFactoryインスタンスをフィールドに持つChangeEventSourceCoordinatorインスタンスを生成し、startメソッドを実行している
https://github.com/debezium/debezium/blob/11d2ff0b9bc123627ae6a725abb9fe4f0faaef72/debezium-connector-mysql/src/main/java/io/debezium/connector/mysql/MySqlConnectorTask.java#L188-L200

startメソッドの処理を追っていくとスナップショットの作成をしていることが分かる
https://github.com/debezium/debezium/blob/11d2ff0b9bc123627ae6a725abb9fe4f0faaef72/debezium-core/src/main/java/io/debezium/pipeline/ChangeEventSourceCoordinator.java#L253-L254

executeメソッドはAbstractSnapshotChangeEventSourceクラスに定義されており、その中でdoExecuteメソッドを実行している
https://github.com/debezium/debezium/blob/11d2ff0b9bc123627ae6a725abb9fe4f0faaef72/debezium-core/src/main/java/io/debezium/pipeline/source/AbstractSnapshotChangeEventSource.java#L90-L92

doExecuteメソッドはRelationalSnapshotChangeEventSourceクラスに定義されており、その中でdetermineSnapshotOffsetメソッドを実行していることが分かった
doExecuteメソッドがスナップショットを作成する処理そのもの
https://github.com/debezium/debezium/blob/11d2ff0b9bc123627ae6a725abb9fe4f0faaef72/debezium-core/src/main/java/io/debezium/relational/RelationalSnapshotChangeEventSource.java#L145-L146