SpinalTapを試す
社内でCDC(Change Data Capture)が少し流行っていたので、それの実装であるSpinalTapを試してみました。
SpinalTapはairbnbが開発しているOSSとなっています。
アーキテクチャなどの詳細についてはこちらのblogに書いてあります。
SpinalTap is a general-purpose reliable Change Data Capture (CDC) service, capable of detecting data mutations with low-latency across different data sources, and propagating them as standardized events to downstream consumers.
SpinalTapは汎用の信頼できるチェンジデータキャプチャ(CDC)サービスであり、さまざまなデータソースで低遅延でデータの変化を検出し、標準化されたイベントとしてダウンストリームコンシューマーに伝播できます。
- 雑に解説すると、mysqlなどのDBの変更をSpinalTap(CDC)が検出し、Kafkaなどのイベントバスにイベントを渡すことが出来ます。
ユースケースとしては、レガシーシステムに変更を加えずにデータだけ横から拾って、分析ツールなどでデータを分析したり等考えられます。
試してみる
基本的には、githubに書いてあるGetting Startedに従っていけば良いです。
前提として、既にmysqlを使ったシステムがあることとします。
$ git clone https://github.com/airbnb/SpinalTap.git
を実行し一式をローカルに落とす。$ cd SpinalTap
- Thriftがインストールされていない場合は、
$ ./install-thrift-0.9.3.sh
を実行 $ cd spinaltap-standalone
$ ../gradlew shadowjar
を実行しビルドします。- gradlewでのビルドが成功すれば、build/libs/spinaltap-standalone-all.jar のようにモジュールが生成されます。
- Kafkaをインストールします。(既にインストール済みの方はSkipして下さい)
- ここでは詳細は割愛しますが、Quickstartに従い、「Step 5: Start a consumer」まで動くことを確認して下さい。
- 公式に従いmysqlの設定変更を行います。変更後は一度mysqlを再起動して下さい。
SpinalTapの設定を行います。
- SpinalTap/spinaltap-standalone/src/main/resources/spinaltap-standalone-config-sample.yamlがあるのでこれを参考にして下さい。
- 以下に私の環境での設定を記載します。
zk-connection-string: localhost:2181 //zookeeperの接続先
zk-namespace: spinaltap-standalone
kafka-config:
bootstrap_servers: localhost:9092 // serverの接続先
mysql-user: spinaltap
mysql-password: spinaltap
mysql-server-id: 1
mysql-sources:
- name: localhost
host: localhost
port: 3306
tables:
- sampledb:users // db名:table名zookeeperを起動します。
$ bin/zookeeper-server-start.sh config/zookeeper.properties
- Kafka Brokerを起動します。
$ bin/kafka-server-start.sh config/server.properties
- SpinalTapを起動します
$ java -jar build/libs/spinaltap-standalone-all.jar spinaltap_standalone.yaml
- 設定ファイルは↑で編集したものを使用して下さい。うまく行っていればこれでKafkaにmysqlの変更が飛んでいるはずです。
- コンシューマに設定するトピックを確認します。
$ bin/kafka-topics.sh --list --bootstrap-server localhost:9092
- 私の設定では、
spinaltap.localhost-sampledb-user2
となっていました。
- コンシューマを起動します。
$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic spinaltap.localhost-sampledb-user2 --from-beginning
mysqlに何らかの変更が行われた際にコンシューマにイベントが届けば成功です!
まとめ
- SpinalTapを動作するところまで確認しました。
- SpinalTapはmysqlのbinlogを監視し、イベントとしてKafkaに通知している。
- 発展として、変更を可視化するところまで試してみたい。