スマートスタイル TECH BLOG

データベース&クラウド技術情報

MySQL Shell 8.1 新機能 : MySQL InnoDB Cluster Read Replicas について (1)

はじめに

先月、MySQL のリリースモデルの変更が大きなニュースとなったことは MySQL ユーザのみならず耳にしている方も多いのではないでしょうか。

その詳細については、既にアナウンスされた以下の情報や補足記事をご覧いただければと思います。

今回の記事は、MySQL Innovation Release の第一弾となる 8.1.0 で追加された新機能

MySQL InnoDB Cluster Read Replicas

の紹介となります。

機能の概要

その名の通り、 InnoDB Cluster に 非同期レプリケーションのリードレプリカを追加することができる機能です。


[引用元:https://dev.mysql.com/doc/mysql-shell/8.1/en/mysql-shell-read-replicas.html]

大きな特徴としては、以下が挙げられます。

  • ノード追加、削除は MySQL Shell 上から容易に行える。
  • InnoDB Cluster のステータスと併せて、リードレプリカの状態も MySQL Shell から統合的に確認できる。
  • リードレプリカを InnoDB Cluster セカンダリメンバーに昇格させたり、またその逆も行うことができる。
  • MySQL Router の読み取り専用ルーティング対象にリードレプリカを含めることが(リードレプリカのみにすることも)可能。
  • レプリケーションソースサーバ(InnoDB Cluster メンバー)がダウンした場合、非同期レプリケーション接続も自動フェイルオーバーする。

MySQL の公式リファレンスマニュアルとしては、InnoDB Cluster 同様、 MySQL Shell のドキュメントに記載があります。

MySQL :: MySQL Shell 8.1 :: 10 MySQL InnoDB Cluster Read Replicas

構成条件について

InnoDB Cluster Read Replicas を構成するための大前提は MySQL Shell 8.1 を使用することですが、それ以外に対象となる MySQL についての諸条件が MySQL Shell リファレンスマニュアルの以下のページに列挙されています。

MySQL :: MySQL Shell 8.1 :: 10.1 Prerequisites

  • スタンドアロンの MySQL サーバであること
  • MySQL Server のバージョンは 8.0.23 以上であること
    • DB インスタンス(InnoDB Cluster メンバー, リードレプリカ)が 8.1 である必要はありません。
  • unmanaged なレプリケーションチャネルが設定されていないこと
    • ※ユーザーが手動で作成したレプリケーションチャネルのことを指します。
  • クラスタを管理するために使用されるものと同じ認証情報を使用する必要があります。
    • ※InnoDB Cluster 管理者ユーザアカウント
  • インスタンスのserver_idとserver_uuidは、トポロジー内で一意であること
    • ※MySQL Shell のマニュアルには記載ないが、MySQL Shell API リファレンス側に記載あり

あと、上記のマニュアルに明記されていませんが MySQL Router も 8.1 を使用する必要があります。

MySQL Router Release Notes / Changes in MySQL Router 8.1.0 (2023-07-18, Innovation Release)

MySQL Router supports InnoDB Cluster Read Replicas.

MySQL Router reads the values defined in the metadata field, v2_router_options.router_options.read_only_targets, to retrieve routing information for read-only traffic.
(…)

実機検証してみる

今回使用した環境

元々存在していた バージョン 8.0.33 の InnoDB Cluster に 同一バージョンのリードレプリカを追加することとしました。

  • MySQL InnoDB Cluster

    • Ver 8.0.33 for Linux on x86_64 (MySQL Community Server – GPL)
    • 3 ノード, シングルプライマリーモード
    • OS : RHEL 8.6
  • MySQL Server(リードレプリカ用)

    • Ver 8.0.33 for Linux on x86_64 (MySQL Community Server – GPL)
    • OS : RHEL 8.6
  • MySQL Shell

    • Ver 8.1.1 for Linux on x86_64 – for MySQL 8.1.0 (MySQL Community Server (GPL))
    • OS : RHEL 8.6
  • MySQL Router

    • Ver 8.1.0 for Linux on x86_64 (MySQL Community – GPL)
    • OS : RHEL 8.6

MySQL Shell 8.1 のインストール

まずは YUM リポジトリを更新(またはインストール)します。

MySQL Shell 8.1 は mysql-tools-innovation-community から入手できますので、当該リポジトリを有効化しましょう。

8.1 が選択可能になりました。
この環境ではすでに MySQL Shell 8.0.33 をインストール済みでしたのでアップグレードします。

MySQL Router 8.1 へのアップグレード

MySQL Router 8.1 も mysql-tools-innovation-community から入手できます。
上記手順を MySQL Router インストールサーバで実行してリポジトリを有効にしておき、MySQL Router 8.1 をインストール(またはアップグレード)しましょう。

クラスタメタデータ のアップグレード

MySQL Shell 8.1 を使用するには、クラスタメタデータのアップグレード(2.1.0 から 2.2.0)が必要です。

※そのまま MySQL Shell を使用すると以下のメッセージが表示されます。

NOTE: The installed metadata version 2.1.0 is lower than the version required by Shell which is version 2.2.0. It is recommended to upgrade the metadata. See \? dba.upgradeMetadata for additional details.

dba.upgradeMetadata() を実行しましょう。

インスタンスの事前構成

本機能を使用してリードレプリカを追加する際に、 InnoDB Cluster にノード追加する際と同じ互換性チェックが行われます。

つまり、 InnoDB Cluster としてメンバー追加可能なようにパラメータであったりクラスタ管理者の認証情報が整合している必要があります。

ですので InnoDB Cluster 構成時と同じように事前に追加するリードレプリカ上で dba.checkInstanceConfiguration() または dba.configureInstance() を実行しておきましょう。

以下は dba.configureInstance() の実行例です。

あとは、 InnoDB Cluster と同様、追加するリードレプリカの IPアドレスを名前解決できるように /etc/hosts ファイルに追加しておくなどで対応しておきます。

Read Replicas の作成

ではいよいよリードレプリカを追加してみます。

事前準備が済んでいれば、 Cluster.addReplicaInstance() という API コマンドを実行するだけで冒頭の特徴でも述べた通り簡単に追加することができます。

MySQL Shell API: MySQL Shell API

InnoDB Cluster メンバー上で MySQL Shell にてクラスタ管理者でログインします。

以下は、 ss_rep_mysql_01 というリードレプリカを、InnoDB Cluster プライマリーノードをレプリケーションソースとしてクラスタに追加するコマンドの例です。

指定可能なすべてのオプションは MySQL Shell API リファレンスでご確認ください。

MySQL Shell API: Cluster Class Reference

  • label は追加する Read Replicas インスタンスの識別子ラベル名で、cluster.status() および cluster.description() の出力で使用されます。
    • label 指定無しの場合、識別子は hostname:port が表示されます。
  • recoveryMethodcloneincremental が選択可能です。デフォルトは auto です。
    • cloneDonor でクローン元を指定することも可能です。

その他、timeoutdryRun もあり、InnoDB Cluster の cluster.addInstance() と同じ感覚で使用できます。

  • replicationSources で指定できるパターンは以下の通りです。
    1. primary
      • プライマリーノードがフェイルオーバするたびにレプリケーション接続が追随します。
    2. secondary
      • セカンダリーノードが存在する限りはセカンダリノードをレプリケーションソースとするように接続フェイルオーバーします。
      • セカンダリーノードが存在し無くなった場合、(最後に残っている)プライマリーノードに接続フェイルオーバーします。
    3. hostname:port
      • 特定のノードのみをレプリケーションソースとします。
    4. [hostname:port, hostname:port, ...]
      • カンマ区切りでリストすることで、先頭から順にレプリケーションソースとします。

レプリケーションソースの設定はリードレプリカごとに設定できるので、システムの運用に合わせて柔軟なトポロジー構成が組めますね。

状態確認

cluster.addReplicaInstance() を実行すると以下のように(この例ではクローニングで)リードレプリカが追加されました。

上記から、クローン元(ドナー)は ss_gr_mysql_01:3306(プライマリーノード) が自動選択されました。

オンラインで追加する際は、サービスに影響を与えないようにセカンダリーノードを明示的にドナーにすると良いと思います。

リードレプリカを追加すると、クラスター内にリードレプリカ用のユーザが自動追加されました。

リードレプリカからおなじみの SHOW REPLICA STATUS コマンドでレプリケーション状態を確認してみましょう。
バイナリログやリレーログも独自設定されたようです。

このレプリケーションチャネルは InnoDB Cluster による managed な接続となります。

クラスタの状態確認は、 InnoDB Cluster と同じ API コマンド cluster.status() で確認できます。
レプリケーションソースとなるメンバーノードの情報の配下に追加表示されるかたちです。

cluster.status()extended オプションのパラメータによって表示内容が変わってきます。

1以上では replicationLag(レプリケーション遅延秒数)を確認することができます。

Read Replicas の削除

リードレプリカのノード削除も簡単で、 InnoDB Cluster と同じコマンドである cluster.removeInstance() を使用します。

追加されたレプリケーション用ユーザが削除され、またクラスタメタデータ上からリードレプリカが削除されます。

まとめ

今回の記事では、 MySQL InnoDB Cluster Read Replicas の紹介としまして、概要やノード追加・削除の方法を見てみました。

InnoDB Cluster と統合することで手軽に操作や管理ができるようになる上に、非同期レプリケーション接続の自動フェイルオーバーによってリードレプリカの可用性まで高めることができる非常にお勧めの機能と言えます。

本記事ではお伝えしきれなかった以下の内容については次回掲載予定ですので、そちらも続けてご覧いただければと思います。

  • 非同期レプリケーションの自動フェイルオーバー機能について
  • MySQL Router – リードレプリカへのルーティングポリシー設定について
Return Top