MySQL 5.6 で loss-less semi-sync レプリケーション

こんにちは。運用本部 Hazama チームの深谷です。

今回は MySQL 5.6 で loss-less semi-sync レプリケーションを実現するパッチについて紹介します。

loss-less semi-sync って何?

詳しい説明は、他の方のブログ を見ていただくのが早いですが、かいつまんで説明すると、MySQL 5.6 の semi-sync レプリケーションでは運が悪いとコミット済みのトランザクションが失われてしまうケースがありました。それを改修するものです。

弊社では一部サービスで、HA 構成のために semi-sync レプリケーションを検討していたのですが、 MySQL 5.6 ではこの問題が解決されていないため、5.7 からバックポートすることにしました。

Facebook ありがとう

ところが、5.7 は 5.6 と相当コードが変更されていたため、容易にはパッチが行えないことが分かりました。 その時、Facebook が この問題を解決するためにパッチを当てたということを知りました。 そこで Facebook の github を調べたところ、当該コードが公開されていることが分かりました。

パッチの取り込み

当時取り込んだパッチは 5.6.16 ベースだったため、5.6.17、5.6.19 に当てるために、 幾つか修正する必要がありました。

gist にパッチを置きました。

facebook.patch は Facebook のパッチを 5.6.19 に当てるために少し修正したものです。取り込んだコミットは以下の3つのコミットです。 核となるものは最後のコミットですが、依存関係があったので、最初の2つのコミットも取り込んでいます。 実はそのおかげで LOCK_log を使わなくなったので、 MySQL 5.6 でのレプリケーション遅延は危険の記事の解決にもなっています。

実はこのパッチだけではデッドロックが発生するので、fix-3way-dead-lock.patchfix-sighup.patch で修正しています。割と苦労したのですが、機会があればまた書いてみようと思います。

最後に

ここ最近取り組んでいた、loss-less semi-sync のパッチの紹介をしてみました。 5.7 を待てないけれど、loss-less semi-sync は使いたい!という方のお役に立てれば幸いです。