MySQL

MySQL レプリケーションのサポートポリシーがこっそり (?) 変わっていた話

この記事は MySQL Casual Advent Calendar 2018・3 日目の記事です。

昨日は meijik さんでした(たぶん…)出てました。

なお、私のこの記事の話は、第25回 中国地方DB勉強会 in 鳥取(倉吉)山﨑さんが発表された内容の丸パクりです(ごめんなさい)。Advent Calendar 3 日目がずっと空いたままだったので、つい(あ、まだ 5 日目が空いてる)。

※元ネタは第25回 中国地方DB勉強会 in 鳥取(倉吉)発表資料のここから 3 ページ分です。

変わったところ

これを書いている時点で、MySQL 5.6 日本語マニュアルにはまだ記述が残っているのですが、17.4.2 MySQL バージョン間のレプリケーション互換性の、

場合によっては、マスターと、マスターよりメジャーバージョン 2 つ以上新しいスレーブとの間で複製できます。ただし、MySQL 4.1 以前を実行するマスターから MySQL 5.1 以降を実行するスレーブに複製しようとすることに関する既知の問題があります。このような問題に対処するために、2 つの間に中間バージョンを実行する MySQL サーバーを挿入できます。たとえば、MySQL 4.1 マスターから MySQL 5.1 スレーブに直接複製するのではなく、MySQL 4.1 サーバーから MySQL 5.0 サーバーに複製してから、MySQL 5.0 サーバーから MySQL 5.1 サーバーに複製できます。

に相当する文章が英語マニュアルからごっそり削除されています。

結果、

2 つを超える MySQL Server バージョンを使用することは、マスターまたはスレーブ MySQL サーバーの数にかかわらず、複数のマスターを使用するレプリケーションセットアップでサポートされません。この制限は、メジャーバージョンだけではなく、同じメジャーバージョン内のマイナーバージョンにも適用されます。たとえば、チェーンまたは循環レプリケーションセットアップを使用している場合、MySQL 5.6.1、MySQL 5.6.2、および MySQL 5.6.4 は同時に使用できませんが、これらのリリースの任意の 2 つを一緒に使用することはできます。

という原則が適用されるため、

  • MySQL 5.6 から MySQL 8.0 にバージョンアップしたいとき、
  • 5.6 からは直接 8.0 へのレプリケーションはサポートされないので、
  • 間に 5.7 のスレーブ兼マスタサーバを「中継サーバ」として立ててレプリケーションする形でバージョンアップ

という構成にするのは、現在ではサポート外となっております。

「技術的に動くかどうかは別」という話です。「やるなら自己責任で」ということですね。安全に行くなら「段階的バージョンアップ」か、レプリケーションを使わずサービス停止時間を長く取ってバージョンアップすることになるでしょう。こういうこともあるので、なるべくこまめにバージョンアップしていくのが吉です(間を飛ばして一気に上げるのはやめて)。

なお、「3 つ以上のバージョン間でのレプリケーション構成をサポートしない」点については、文中にある通り、マイナーバージョン(現在のバージョン表記でいうところの、3 つ目の数字)も同じですので、その点についてもご注意を。

具体的には、普段から循環 or 数珠繋ぎ形式のレプリケーションを使っている構成で、各サーバのマイナーバージョンのバージョンアップをする場合に、うっかり 3 マイナーバージョン混在構成にならないようにしてください。

※「運用中のシステムで 1 台ずつ日程をずらしてバージョンアップしてしまう」などが NG。但し「技術的に NG」とは言っていないので、やるなら自己責任で。

補足

これを書いている時点の MySQL 5.6 日本語マニュアルには、

MySQL は、あるメジャーバージョンから次以降のメジャーバージョンへのレプリケーションをサポートします。

とありますが、英語の原文には、

MySQL supports replication from one release series to the next higher release series.

とありますし、日本語マニュアルの続きの文章が、

たとえば、MySQL 4.1 を実行するマスターから MySQL 5.0 を実行するスレーブ、MySQL 5.0 を実行するマスターから MySQL 5.1 を実行するスレーブなどへの複製ができます。

なので、日本語マニュアルの「以降」の文言は誤り(ないのが正しい)です。


明日(4 日目)は yoku0825 さんです!