少し前に話題に上ったmysql-replication-listener(libreplication)のRubyバインディングを書きました。
https://bitbucket.org/winebarrel/ruby-binlog/
require "binlog" client = Binlog::Client.new("mysql://repl:repl@nyarlathotep") client.connect client.position = 4 while event = client.wait_for_next_event case event when Binlog::QueryEvent puts event.query when Binlog::RowEvent puts event.event_type p event.columns p event.rows else puts "(#{event.event_type})" end end
QueryEventやRowEvent以外のイベントについてもそれぞれクラスを定義しています。
詳しくはコード嫁ごめんなさい、ですがメタ情報を出力すれば大体使い方はわかると思います。
それはさておき。
バインディングもそうなのですがlibreplicationもプロダクションレベルのコードに突っ込むためにはいくつか手直しが必要そうです。
- オブジェクトのメモリ管理のポリシーが不明。ライブラリ側で処理してくれるようなくれないような。ライブラリ側で握っているオブジェクトのいくつかはdisconnect時に解放されるようだけど、privateで触れないし。なんとなく連続稼働を想定していいないような印象
- 再接続できない・接続状況がわからない。ローテートは追っかけてくれるけど再接続はむりっぽい。ソケットのメンバ変数探したらprivate、アクセッサに見当たらず。
- Format_eventで提供されている関数使うとSEGV。使い方が間違っているのか…
メモリに関してはGC叩きながらの1時間ほどの稼働でリークっぽい挙動はなしですが、切断後のオブジェクトの再利用は避けた方がいい気がします。
コネクションの再接続は結構致命的なのですが本体に手を入れるか『#define private public』とかやるかですね。
そもそもmysql-replication-listener自体、一年くらい更新されていないので誰かがメンテしないかぎり消えていきそうな感じです。
面白そうなライブラリではあるので時間があればもうすこし追いかけてみたいところではありますが。
追記
一応、、、再起動しても追えるようにはなりました、、、一応、、、