序
運用しているサーバ群でslave1号とslave2号に差分があることがわかった。
App側でカウントするとその数がたまに異なることがあることがあって発覚。
普通の運用上は起こりえないことだとは思いますが、Slave側で書き込める別権限でデータベースの操作を直接していたことで発生。
差分を埋めるために、percona-toolkitのpt-table-syncを使用したが、日本語のリファレンスがなくて結構苦戦したので、忘備録的に使用方法を記録する
なお、インストールはpecona-toolkitの本家でrpmをダウンロードしてインストールしてください。
注意点
全てのサーバにある程度の権限を持つ同名のユーザが必要。
pt-online-schema-changeを使うためにも割り切ってユーザを作ってしまいましょう。
整合性の検証 - pt-table-checksum
Masterに打つことでスレーブとの差分を確認できる
pt-table-checksum (DSN)
DSNにはサーバ情報への接続情報。カンマ区切りで記述する
h=*** ホスト名
u=*** ユーザ名
p=*** パスワード
D=*** データベース名
t=*** テーブル名
データベースを指定して確認したい場合は、Dを設定していてもdatabasesオプションを入れる(DB分だけカンマ区切り)
pt-table-checksum h=chksv.com,u=myiser,p=mypass,D=myDB,t=mytable --databases myDB
うまくイケばめでたしだが、レプリケーションをするDBを指定していたり、レプリケーションをしないDB設定があると怒られる
(省略)
Please read the --check-replication-filters documentation to learn how to solve this problem.
--no-check-replication-filtersオプションを付ける
pt-table-checksum --no-check-replication-filters h=chksv.com,u=myiser,p=mypass,D=myDB,t=mytable --databases myDB
開発ではうまく動いたが、本番ではログフォーマットがMIXEDになってて、オプションつけて無理やりやると壊れるかもなんて脅されました。怖くてやっていません。
(追記2014/11/11:当社環境ではmasterがmysql5.1系でslaveが5.6系を使っていて、slaveの方で5.6オススメ設定になってるbinlog-formatがMIXEDなことがこの警告文の原因でした。
この設定の場合レプリケーションを破壊することはないと判断し、後日本番でも実行しました)
差分吸収ツール - pt-table-sync
うちでの用途はスレーブとの差分を吸収すること。
このツールの注意点として、マスターを更新することでスレーブに反映させること。
スレーブを一台ずつ運用を止めてやんわりと差分を吸収したかったのにできないっぽい
--sync-to-masterオプションと--replicaのオプションやらで色々な書き方ができるのだが、うちでの用途を満たす設定は2つ。
運用中のサーバに打つつもりなので後者を選択。
① マスターに命令を出して全サーバとの差分を潰す
pt-table-sync --dry-run --replicate myDB.mytable h=master.chksv.com,u=myiser,p=mypass,D=myDB,t=mytable
② 1台のスレーブとの差分を潰す
pt-table-sync --dry-run --replicate myDB.mytable --sync-to-master h=slave.chksv.com,u=myiser,p=mypass,D=myDB,t=mytable
ドハマりした点:
DB名とテーブル名の指定を--replicateの後にも、DSN内にも両方記述しないと動かない。
なぜかはよくわからないけど、両方にかけば動く。書かないと動かない。
実際に実行する
[接続確認]
pt-table-sync --dry-run --replicate myDB.mytable --sync-to-master h=slave.chksv.com,u=myiser,p=mypass,D=myDB,t=mytable
[差分の件数確認(大量のAlter文も生成されます)]
pt-table-sync --print --verbose --replicate myDB.mytable --sync-to-master h=slave.chksv.com,u=myiser,p=mypass,D=myDB,t=mytable
[実行]
pt-table-sync --execute --verbose --replicate myDB.mytable --sync-to-master h=slave.chksv.com,u=myiser,p=mypass,D=myDB,t=mytable
本来は件数の確認はpt-table-checksumでするべき。だけど、一応"--print --verbose"でも出力できる。
1台のスレーブとの差分を確認したいときはこれしかないのではないでしょうか。
また、実行前にはバックアップをきっちりと取ってから実行しましょう。マニュアルもなるべく目を通しましょう。
とはいえ、日本語資料がほぼなかったので、使ってみた事例として参考になれば。