これは何?
Aurora/RDSでプロダクション→ステージングのデータのレプリケーションを行うツールです。
「開発環境のデータをできるだけ本番に近づける - クックパッド開発者ブログ」という記事があって、同じことをAurora/RDSで行うために作りました。
Aurora/RDSでの問題
mysql.rds_set_external_masterを使う場合
- レプリケーションフィルターが使えない
REPLICATE_WILD_IGNORE_TABLE
とかが使えないので、ステージングに流したくないテーブルの情報もレプリケーションされます
- エラーがスキップしにくい
- mysql.rds_skip_repl_errorはあるんですがslave-skip-errorsの用にまとめて複数のエラーのスキップができないため、event schedulerで毎分呼び出す、みたいな苦しい運用に
DMSを使う場合
- いろいろ制限がある
- https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Source.MySQL.html
- AUTO_INCREMENTがマイグレーションされないとか、対応していない方があるとか、いろいろと
- なんだかんだでマイグレーションが止まる
binrpt
MySQLのレプリカサーバのようにrowフォーマットのbinlogを読み込んで、SQL(INSERT・UPDATE・DELETE)に変換するか、流れてきたDDLをレプリカに対して実行します。
特徴
- テーブルのフィルタリングができる
- エラーは無視
- 接続が切れたら再接続
ラフにレプリケーションをできるようにしてるので、逆に厳密なレプリケーションには向かないです。
misc: go-mysqlがすごい
binlogを読み込むのにgo-mysqlを使っています。
googleabilityが悪くて「go-mysql」で検索してするとgo-sql-driver/mysqlが出てきたりするんですが
- MySQLのクライアントライブラリ
- binlogを継続的に読み込む(go-mysql-elasticsearchで使われているようです)
- サーバとしてクライアントを受け付けられる
と、ニッチな気がする方向で強力でした。
MySQL Binlog APIのライブラリって、まだMySQL Labsからダウンロードできるんでしたっけ…? MySQL Binlog APIはベータ版であまり完成度が高くなく、実装がめんどくさかった(日本語まわりでバグもあった)記憶があって「binlogで自前レプリケーションはつらい」という印象だったんですが、go-mysqlはかなりサクッと使えて、わりあい頑丈なので(再接続なども実装済み)驚いてます
追記
go-mysqlのMySQLクライアントとしての動作、メモリまわりが怪しい… あと https://github.com/siddontang/go-mysql/pull/466 これバグってないかな