2018の6日目です。(子供の寝かしつけで一緒に寝落ちして日付が変わってしまいましたが12/6分です。)Debeziumとは?DebeziumはDBに対するデータ操作をキャプチャしてイベントストリームに変換してくれる分散プラットフォームです。Connectベースのコネクタを利用してDBをモニターすることができます。既存DBに対するデータ操作をKafkaのメッセージに変換することができますので、レガシーシステムなどでアプリケーションに手を入れたくないけどデータだけ抜き出してリアルタイム処理したいとか、別システムにデータを流用したいという場合に便利なソフトウェアです。イベントログはKafkaが保持してくれているので、データを利用する側(consumer)が止まってもイベントログが失われることはなく、consumerを復旧させれば処理を再開することが可能です。Connectorの3つのコンポーネントを動かす必要があります(ZookeeperはKafkaを動かすために必要)。プロダクション環境であれば全コンポーネントを複数プロセスで構成して分散処理を行うようにしますが、動作を理解するためにまずはすべてのコンポーネントをシングルプロセスで動かしてみましょう。詳しい手順と解説は公式サイトのチュートリアルを参照してみてください。0.8環境構成すべてのプロセスをDockerコンテナとして起動します。最終的には次のような感じになります。Dockerは適当に用意してください。自分の環境は以下の通りでした。trueセットアップ必要なコンテナを順次起動してからConnectorの設定を行います。ログを確認しやすくするため、コンテナ毎にターミナルウィンドウを開き、フォアグラウンドで動かします。変更を監視する対象としてMySQLを起動しておきます。CLIを起動MySQLを操作するためにCLIを起動しておきます。-p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'初期状態では以下のようになっています。Connect起動MySQLを監視するConnectorを起動します。APIで操作を行うためです。APIが動作するか確認しておきます。APIからDBやKafkaに接続するために必要な情報を設定します。}'以下のようなレスポンスが返ってくれば無事設定できています。(JSONは整形しています。null}念の為、正しく設定されているか確認してみます。"source"}OKですね!このとき、connectorコンテナ側には「登録できたよ!」というログが出ているはずなので、興味のある方は確認してみてください。Debeziumの動作を確認セットアップ大変でしたね。consumer)を起動しておきます。テーブルに対する変更を監視するようにしています。dbserver1.inventory.customerswatcherを起動すると、既にいくつかメッセージが投入されていることが確認できます。Connectorはbinlogを解析してイベントに変換するように実装されていますが、初期接続時にはテーブル作成時からのすべての変更を読み取るため、このような動作をします。Connectorを再起動するなどして再接続した場合、前回読み取り済みのログの続きから読み取るようになっています。興味のある方はSnapshotReaderのソースを読み解いてみて下さい。https://github.com/debezium/debezium/blob/master/debezium-connector-mysql/src/main/java/io/debezium/connector/mysql/SnapshotReader.javaデータを更新してみるUPDATEを実行してデータを更新してみます。sec)すると、watcher側で以下のイベントログが観測できるはずです。}}payloadのbeforeとafterを見ると、確かにUPDATE前と後の値が確認できます。今回は単にコンソール表示しただけですが、データ変更の全容がここに含まれていますので、この情報を別アプリケーションで再利用することが可能です。Connectorを止めてみるConnectorを再起動しても、その間の変更がロストしないことを確認してみます。Connectorを停止します。connectConnectorが停止した状態でデータをINSERTします。sec)Watcherにはログが出ていないはずです。(Kafkaにメッセージが届いていないので当然ですが。)では、Connectorをおもむろに起動します。debezium/connect:0.8すると、変更監視が再開され、Watcherに以下ログが出力されます。}}ちゃんとINSERT2件が捕捉されていますね!他にもいろいろなパターンで試してみて下さい。以下コマンドで全コンテナを停止します。(関係ないコンテナが巻き込まれないように注意してください。Composeで一発起動できるサンプルが提供されていますのでご利用下さい。https://github.com/debezium/debezium-examples/tree/master/tutorialまとめDebeziumとKafkaの組み合わせによって、アプリケーションにほぼ影響なしで、DBに対する更新を横取りして再利用することができることを確認しました。Kafkaという汎用的なメッセージバスに乗せることで、単純なデータレプリケーションだけでなく、同じメッセージストリームを複数の目的で再利用することができます。レガシーマイグレーションの手段の一つとして、いろいろ使い所がありそうですね。オブジェクト管理に関して皆さんこんにちは、ソリューションアーキテクトの岡野です。Hatの佐藤匡剛です。各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。