yanom blog

様々な技術について書きます

SpinalTapを試す

社内でCDC(Change Data Capture)が少し流行っていたので、それの実装であるSpinalTapを試してみました。
SpinalTapはairbnbが開発しているOSSとなっています。
アーキテクチャなどの詳細についてはこちらのblogに書いてあります。

f:id:yanom20:20191018085816p:plain
アーキテクチャ

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を使ったシステムがあることとします。

  1. $ git clone https://github.com/airbnb/SpinalTap.git を実行し一式をローカルに落とす。
  2. $ cd SpinalTap
  3. Thriftがインストールされていない場合は、 $ ./install-thrift-0.9.3.sh を実行
  4. $ cd spinaltap-standalone
  5. $ ../gradlew shadowjar を実行しビルドします。
    • gradlewでのビルドが成功すれば、build/libs/spinaltap-standalone-all.jar のようにモジュールが生成されます。
  6. Kafkaをインストールします。(既にインストール済みの方はSkipして下さい)
    • ここでは詳細は割愛しますが、Quickstartに従い、「Step 5: Start a consumer」まで動くことを確認して下さい。
  7. 公式に従いmysqlの設定変更を行います。変更後は一度mysqlを再起動して下さい。
  8. 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名

  9. zookeeperを起動します。

    • $ bin/zookeeper-server-start.sh config/zookeeper.properties
  10. Kafka Brokerを起動します。
    • $ bin/kafka-server-start.sh config/server.properties
  11. SpinalTapを起動します
    • $ java -jar build/libs/spinaltap-standalone-all.jar spinaltap_standalone.yaml
    • 設定ファイルは↑で編集したものを使用して下さい。うまく行っていればこれでKafkaにmysqlの変更が飛んでいるはずです。
  12. コンシューマに設定するトピックを確認します。
    • $ bin/kafka-topics.sh --list --bootstrap-server localhost:9092
    • 私の設定では、 spinaltap.localhost-sampledb-user2となっていました。
  13. コンシューマを起動します。
    • $ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic spinaltap.localhost-sampledb-user2 --from-beginning

mysqlに何らかの変更が行われた際にコンシューマにイベントが届けば成功です!

まとめ

  • SpinalTapを動作するところまで確認しました。
  • SpinalTapはmysqlのbinlogを監視し、イベントとしてKafkaに通知している。
  • 発展として、変更を可視化するところまで試してみたい。