Debeziumとは?
DBテーブルへの変更をKafkaトピックに格納して、アプリケーションがストリーミングで変更内容を監視・受信できるようにするソフトウェアです。2016年初頭から、RedHat主導で開発されています。もともと、マイクロサービスを実装するためのソリューションとして開発されたもののようですが、マイクロサービスに関係なく使えます。現時点でMySQLとMongoDBに対応していますが、将来、PostgreSQLやOracleへの対応予定があります。
DBMSは、変更内容をトランザクションログに記録していきます。MySQLの場合は、バイナリログです。それをKafka Connectサービスがコネクタを使用して監視します。変更を検知したら、テーブル単位で作成されたKafkaトピックに、変更内容を「イベント」としてJSONでシリアライズして記録します。アプリケーションはKafkaのコンシューマなどを使ってKafkaメッセージブローカーに接続し、トピックを監視します。変更イベントが到着したら受信して、アプリケーションの他の処理に利用します。
仕組みの詳細は、FAQを見ると良いと思います。
http://debezium.io/docs/faq/
2017年1月時点のものを、日本語に訳したものです。
http://wp.me/p1mQkm-3A
特徴
DBの変更内容をストリーミングするソフトウェアは他にもありますが、Debeziumには、現在のところ、以下の利点があります。
-
DB特有の処理をコネクタに隔離するアーキテクチャです。将来、様々なDBMSに対応する予定があります。
-
DBMSの中にDebeziumの設定を格納しないような設計思想となっています。
-
Debeziumを起動する前のテーブル変更も、トランザクションログが残っている限り検知できます。
-
KafkaメッセージブローカーとKafka Connectサービスは、それぞれクラスタ構成にして運用できます。
-
Debezium(Kafka)の停止中に行われたDBテーブルの変更は、復旧(再起動)後に拾われます。
-
DBテーブルの内容と、その時点でのDBのテーブル構造の両方が常にイベントに入ってくるので、テーブルのDDLが運用中に変更されるようなケースでも、アプリケーションが追従しやすい仕組みになっています。(ただしそのために、毎回送られてくるJSONドキュメントが大きいのが難点)
試してみる
まずは、チュートリアルを一通りやってみるといいでしょう。
http://debezium.io/docs/tutorial/
2017年1月時点のものを、日本語に訳したものです。
http://wp.me/p1mQkm-1i
チュートリアルは長いですが、概ね、以下のような感じで進んでいきます。
- Zookeeper、Kafka(メッセージブローカー)、MySQLサーバ/クライアント、Kafka ConnectサービスとなるDockerコンテナを、順に立てていきます。
- Kafka Connectサービスに新規のMySQLコネクタを作成します。
- Kafkaトピックを監視をするコンテナを立てて、DBのテーブルへUPDATEやDELETEを発行し、トピックに記録される内容を確認します。
- Kafka Connectサービスを停止し、DBテーブルに何個かクエリを投げ、Kafka Connectサービスを起動すると、サービスが停止している間のDBへの変更がトピックに反映されることを確認します。
チュートリアル以上に詳細が知りたい場合は、各DBのコネクタのドキュメントを読むと良いでしょう。
MySQLコネクタ
http://debezium.io/docs/connectors/mysql/
ソースやコミュニティ
-
GitHubリポジトリ
https://github.com/debezium/debezium -
JIRA
https://issues.jboss.org/projects/DBZ/issues/DBZ-174?filter=allopenissues
GitHubのIssueを使わず、JIRAで報告してください、とのこと。
Pull Requestの前に、チャットやメーリングリストで相談してください、とのこと。Contribute.md必読。
-
チャット
https://gitter.im/debezium/dev (開発作業用)
https://gitter.im/debezium/user (使い方が分からないなどの相談用)
メーリングリストはあまり動きがなく、チャットで開発者の見解が示されることが多いです。
チャットは、リアルタイムで参加している必要はありません。自分の都合の良い時に書いて放置でOK。