Amazon Aurora Version2(MySQL5.7互換)とVM上のMySQL5.7を使っていたら突如レプリケーションが停止した話
技術本部 サービスリライアビリティグループ(SRG)の鬼海(@fat47)です。
#SRG(Service Reliability Group)は、主に弊社メディアサービスのインフラ周りを横断的にサポートしており、既存サービスの改善や新規立ち上げ、OSS貢献などを行っているグループです。
なにかの役に立てば幸いです。
何が起きたか3行でまとめ
[ Aurora v2 ] →[ MySQL5.7 ]へのレプリケーションを組んでいる時、
Aurora v2クラスタへの接続にMySQL8.0のClientを使って更新クエリを投げると、
MySQL5.7には存在しないCollationが自動で指定されてレプリケーションがエラーで停止する
状況について
オンプレ環境のMySQLからAmazon Auroraへの切り替えを進めていく中で、
下記のような構成を構築していました。
切り替え後は、万が一問題があった際にオンプレ環境に切り戻せるように逆方向のレプリケーションを貼るようにしていました。
後者の構成をとっている時、オンプレ環境のMySQL5.7が突如エラーでレプリケーション停止しました。
原因
開発者の端末のMySQL Clientが意図せず最新のMySQL8.0系を利用していた為でした。
今回のエラー自体はMySQL8.0へのアップグレード時の検証で同様のエラーを経験していたので、MySQL8.0絡みであると当たりをつけていました。
MySQL8.0からデフォルトのCollation(照合順序)がになっているのは有名?な話ですが、このCollationはMySQL5.7には存在しないため関係のない話だと思っていました。
実際にMySQL 8.0 ClientからMySQL5.7のサーバに対して接続してCollationの設定を確認してみるとこのようになっており問題はありません。
しかし、Aurora v2(MySQL5.7互換)には独自実装で先行してこのが利用できる状態になっているため、MySQL8.0 ClientからAurora v2に接続すると下記のようになります。
collation_connectionがになっています。
この状態でクエリを発行すると、バイナリログに
が書き出され、レプリカ側のMySQL5.7ではこの255が存在しない為エラーでレプリケーション停止するというものでした。
再現環境
バージョン情報
ソース側 Aurora | 5.7.mysql_aurora.2.11.0 |
レプリカ側 EC2 | MySQL 5.7.41 |
Aurora v2をソースにして、EC2上にインストールしたMySQL5.7をレプリカにしました。この2つの環境でバイナリログレプリケーションを構築します。
再現の手順
[Aurora v2]で適当なテーブルをつくる
適当にレコードを追加
MySQL5.7のclientから[ Aurora v2] クラスタにUPDATE実行
[ MySQL5.7レプリカ ] でレコードが更新されているか確認
MySQL8.0のClientから[ Aurora v2] クラスタにUPDATE実行
[ MySQL5.7レプリカ ] でshow slave statusを確認するとレプリケーションエラー発生
回避策
あまりこのような構成を取る機会も少ないかと思いますが、
まずは開発者全員Aurora v2への接続にはMySQL5.7のClientを使うということが挙げられます。
DBのパラメータでなんとかしたい場合は、Aurora側のDBクラスタパラメータグループでを1にすることで、client側の指定を無視することができるので
いったんこの現象を回避することができます。
ただ、この設定を入れるのはあくまでも移行時の一時的な処置とすることがおすすめかと思います。
参考URL
下記の記事が大変参考になりました。
終わりに
SRG では一緒に働く仲間を募集しています。
ご興味ありましたらぜひこちらからご連絡ください。