OCIチュートリアル
トップページへ戻る

その11 - クラウドでMySQLデータベースを高可用性構成で使う

Oracle Cloud Infrastructure では、MySQL HeatWaveが利用できます。MySQL HeatWaveはAlways Freeの対象となっていますが、このチュートリアルで解説する高可用性構成は対象外となります。トライアルアカウント作成時に付与されるクレジットでも使用可能です。

このチュートリアルでは、コンソール画面から高可用性構成を有効化したMySQL HeatWaveのDBシステムを作成し、コンピュート・インスタンスにMySQLクライアントをインストールして、MySQL HeatWaveの高可用性動作を確認する手順を説明します。

所要時間 : 約30分 (約15分の待ち時間含む)

前提条件 :

  1. Oracle Cloud Infrastructure の環境(無料トライアルでも可) と、管理権限を持つユーザーアカウントがあること
  2. OCIコンソールにアクセスして基本を理解する - Oracle Cloud Infrastructureを使ってみよう(その1) を完了していること
  3. クラウドに仮想ネットワーク(VCN)を作る - Oracle Cloud Infrastructureを使ってみよう(その2) を完了していること
  4. インスタンスを作成する - Oracle Cloud Infrastructureを使ってみよう(その3) を完了していること

注意 : チュートリアル内の画面ショットについては Oracle Cloud Infrastructure の現在のコンソール画面と異なっている場合があります。
また、このチュートリアルでコードブロックに掲載しているコードは1行で長いコードを掲載している部分もあります。その部分では、右側にスクロールしてコード全文を確認して下さい。
(チュートリアルを実践する時は、一旦テキストエディタ等にコピー&ペーストして内容確認&編集することを推奨します)

目次:

1. はじめに

本チュートリアルでは、MySQL HeatWaveの基本的な説明や、MySQL HeatWaveの基本的な作成方法の説明は割愛しています。これらについては、クラウドでMySQLデータベースを使う - Oracle Cloud Infrastructureを使ってみよう(その9) を参照して下さい。

2. 本チュートリアルで作成する構成の構成図

本チュートリアルでは、以下の構成を作成します。

img_diagram.png

3. 高可用性構成を有効化したMySQL HeatWaveの作成

MySQL HeatWaveを作成します。本チュートリアルではデフォルトの構成でMySQL HeatWaveを作成していますが、シェイプやストレージサイズ、バックアップ設定などをカスタマイズすることも可能です。

  1. コンソールメニューから データベースMySQLDBシステム を選択します。

    img1.png

  2. DBシステムの作成 ボタンを押します。この際、左下の リスト範囲 でリソースを作成したいコンパートメントを選択していることを確認して下さい。ここでは「handson」コンパートメントを使用しています。

    img2.png

  3. 立ち上がった DBシステムの作成 ウィンドウで「開発またはテスト」を選択した後で、以下の項目を入力します。

    • 名前 - 任意の名前を入力します。ここでは「TestHA」と入力しています。
    • 説明 - このMySQL HeatWaveの説明を入力します。ここでは「ハンズオン用」と入力しています。(入力は任意です)
    • 「スタンドアロン」、「高可用性」 - MySQL HeatWaveを高可用性構成で構成するため、「高可用性」を選択します。「高可用性」を選択した場合、グループ・レプリケーションによる高可用性構成が組まれるため、内部的には3台のMySQL HeatWaveが構成されます。
    img3.png

    • ユーザー名 - MySQL HeatWaveの管理者ユーザーのユーザー名を指定します。ここでは「root」と入力しています。(セキュリティの観点からは任意のユーザー名を指定することを推奨します)
    • パスワード - MySQL HeatWaveの管理者ユーザーのパスワードを指定します。パスワードは8文字から32文字までの長さで、大文字、小文字、数字および特殊文字をそれぞれ1つ以上含める必要があります。
    • パスワードの確認 - パスワードを再入力します。
    • ネットワーキングの構成 - 本チュートリアルでは、「TutorialVCN」、「プライベート・サブネット-TutorialVCN(リージョナル)」を使用します。
    • ハードウェアの構成 - ⚠️「HeatWaveクラスタの有効化」はオフにしておいてください。
    img4.png

    • ホスト名 - 任意の名前を入力します。ここでは「TestHA」と入力しています。
      ※ページ下部にある「拡張オプションの表示」をクリック後、「ネットワーキング」タブをクリックして入力欄を表示します。
    img5.png

  4. MySQL HeatWaveが作成中になるのでしばらく待ちます。概ね15分程度で作成が完了しステータスがアクティブに変わります。**「高可用性」部分を確認すると「高可用性: 有効」**となっていることから、このMySQL HeatWaveで高可用性が有効になっていることが確認できます。また、「DBシステム構成」部分を確認すると、先程プロビジョニングしたリソースの3倍の値が表示されています。これは、グループ・レプリケーション機能により内部的に3台のMySQL HeatWaveが構成されているためです。

    img6.png img7.png

  5. ページ左下の リソースエンドポイント をクリックして、ホスト名、IPアドレスを確認しておきます。

    img8.png

4. セキュリティリストの修正(イングレス・ルールの追加)

このチュートリアルで作成したMySQL HeatWaveと通信するためには、TCP/IPによる3306ポートに対する通信を許可する必要があります。そのため、セキュリティリストのイングレス・ルールに設定を追加します。

  1. コンソールメニューから ネットワーキング仮想クラウドネットワーク を選択し、作成済みのVCNを選択します。本チュートリアルではTutorialVCN です。またこれ以降はVCNが TutorialVCN である前提で説明を記述しています。

    img9.png

    img10.png

  2. プライベート・サブネット-TutorialVCN をクリックします。

    img11.png

  3. プライベート・サブネット-TutorialVCNのセキュリティ・リスト をクリックします。

    img12.png

  4. イングレス・ルールの追加 をクリックします。

    img13.png

  5. 立ち上がった イングレス・ルールの追加 ウィンドウで、以下の項目を入力し イングレス・ルールの追加 ボタンを押します。

    • ソースCIDR - 「10.0.0.0/16」と入力します。
    • 宛先ポート範囲 - 「3306」と入力します。
    • 説明 - 「MySQL」と入力します。(入力は任意です)
    img14.png

  6. 3306ポートに対するイングレス・ルールが追加されたことを確認します。

    img15.png

5. MySQLクライアント、MySQL Shellのインストール

コンピュート・インスタンスにMySQLクライアントとMySQL Shellをインストールします。MySQLチームが提供しているyumの公式リポジトリをセットアップした後で、yumでインストールします。

  1. インスタンスを作成する - Oracle Cloud Infrastructureを使ってみよう(その3)で作成したコンピュート・インスタンスに接続し、以下のコマンドを実行します。これにより、MySQLチームが提供しているyumの公式リポジトリがセットアップされます。

    sudo yum install https://dev.mysql.com/get/mysql80-community-release-el8-4.noarch.rpm
    

  2. RHEL8系のOSの場合、デフォルトで有効になっているMySQLモジュールを無効化する必要があるため、以下のコマンドを実行します。詳細な説明はこちらのドキュメントを参照して下さい。

    sudo yum module disable mysql
    

  3. 以下コマンドを実行し、MySQLクライアントをインストールします。

    sudo yum install mysql-community-client
    

  4. 以下コマンドを実行し、MySQL Shellをインストールします。

    sudo yum install mysql-shell
    

6. 作成したMySQL HeatWaveで高可用性が実現できることを確認

作成したMySQL HeatWaveの状態を確認し、グループ・レプリケーションが構成されていることを確認します。その後、データを更新しながらスイッチオーバーを発生させることで、短時間でプライマリ・サーバーが切り替わることを確認します。
(実際に障害が発生した場合は、スイッチオーバーではなくフェイルオーバーが発生します。しかし、フェイルオーバーを意図的に発生させることは難しいため、ここではスイッチオーバーを使ってプライマリ・サーバーの切り替えを確認します)

  1. mysqlコマンドラインクライアントを使ってMySQL HeatWaveへ接続します。ユーザー名はMySQL HeatWaveの管理者ユーザー名に、ホスト名は確認したホスト名に置き換えて下さい。
    (-uオプションでユーザー名を、-hオプションでホスト名を指定します)

    実行コマンド例(コピー&ペースト用)

    mysql -u root -p -h TestHA.sub01311142371.tutorialvcn.oraclevcn.com
    

    実行例

    [opc@testvm1 ~]$ mysql -u root -p -h TestHA.sub01311142371.tutorialvcn.oraclevcn.com
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 38
    Server version: 8.0.32-cloud MySQL Enterprise - Cloud
    
    Copyright (c) 2000, 2023, Oracle and/or its affiliates.
    
    Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql>
    

  2. performance_schema.replication_group_membersテーブルを検索してグループ・レプリケーションが構成されていることを確認します。3台のMySQL HeatWaveでグループ・レプリケーションが構成されているため、結果は3行出力されます。その中で、MEMBER_ROLE列がPRIMARYになっているメンバーが、今プライマリになっているMySQL HeatWaveです。この後の確認のために、プライマリのMySQL HeatWaveのMEMBER_HOSTをメモしておきます。この例では、3行目がPRIMARYとなっているため"battlz9jzxwb28dg“をメモしておきます。

    実行コマンド(コピー&ペースト用)

    SELECT MEMBER_ID, MEMBER_HOST, MEMBER_STATE, MEMBER_ROLE
      FROM performance_schema.replication_group_members;
    

    実行例

    mysql> SELECT MEMBER_ID, MEMBER_HOST, MEMBER_STATE, MEMBER_ROLE
        ->   FROM performance_schema.replication_group_members;
    +--------------------------------------+------------------+--------------+-------------+
    | MEMBER_ID                            | MEMBER_HOST      | MEMBER_STATE | MEMBER_ROLE |
    +--------------------------------------+------------------+--------------+-------------+
    | 434e1837-a7bf-11ed-895a-020017009e6c | msv4fwl6o2e28az2 | ONLINE       | SECONDARY   |
    | 4362771b-a7bf-11ed-b99b-02001701ef69 | xodvzvdletbd4kcx | ONLINE       | SECONDARY   |
    | ffb0f26f-a7be-11ed-851b-0200170045b2 | battlz9jzxwb28dg | ONLINE       | PRIMARY     |
    +--------------------------------------+------------------+--------------+-------------+
    3 rows in set (0.00 sec)
    

  3. スイッチオーバー時の動作を確認するためのテストテーブルを作成します。そのテーブルに、現在プライマリであるMEMBER_HOSTの情報と現在の時刻を追加し、データを検索して確認します。その後、mysqlコマンドラインクライアントを終了します。

    実行コマンド(コピー&ペースト用)

    CREATE DATABASE test;
    
    CREATE TABLE test.test(
      id int AUTO_INCREMENT,
      PRI_MEMBER_HOST CHAR(20),
      INSERT_TIME time,
      PRIMARY KEY(id)
      );
    
    INSERT INTO test.test(PRI_MEMBER_HOST, INSERT_TIME)
      SELECT MEMBER_HOST, CURTIME()
      FROM performance_schema.replication_group_members
      WHERE MEMBER_ROLE='PRIMARY';
    
    SELECT * FROM test.test;
    

    実行例

    mysql> CREATE DATABASE test;
    Query OK, 1 row affected (0.01 sec)
    
    mysql> CREATE TABLE test.test(
        ->   id int AUTO_INCREMENT,
        ->   PRI_MEMBER_HOST CHAR(20),
        ->   INSERT_TIME time,
        ->   PRIMARY KEY(id));
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> INSERT INTO test.test(PRI_MEMBER_HOST, INSERT_TIME)
        ->   SELECT MEMBER_HOST, CURTIME()
        ->   FROM performance_schema.replication_group_members
        ->   WHERE MEMBER_ROLE='PRIMARY';
    Query OK, 1 row affected (0.01 sec)
    Records: 1  Duplicates: 0  Warnings: 0
    
    mysql> SELECT * FROM test.test;
    +----+------------------+-------------+
    | id | PRI_MEMBER_HOST  | INSERT_TIME |
    +----+------------------+-------------+
    |  1 | battlz9jzxwb28dg | 15:37:31    |
    +----+------------------+-------------+
    1 row in set (0.00 sec)
    
    mysql> exit
    Bye
    [opc@testvm1 ~]$ 
    

  4. 以下のシェルスクリプトをtest.shという名前で作成し、test.shを実行します。このスクリプトでは、1秒毎にテストテーブルにデータを追加する処理を無限ループで実行します。ユーザー名とパスワードはMySQL HeatWaveの管理者ユーザー名/パスワードに、ホスト名は確認したホスト名に置き換えて下さい。なお、スクリプト実行時にパスワードをコマンドラインで指定していることに対する警告が発生しますが、ここでは無視して大丈夫です。
    (-pオプションでパスワードを指定しています。この例では、”MySQL_8.0”というパスワードを指定しています)

    test.shファイル

    #!/bin/bash
    
    while true; do
      mysql -u root -pMySQL_8.0 -h TestHA.sub01311142371.tutorialvcn.oraclevcn.com -e "INSERT INTO test.test(PRI_MEMBER_HOST, INSERT_TIME) SELECT MEMBER_HOST, CURTIME() FROM performance_schema.replication_group_members WHERE MEMBER_ROLE='PRIMARY';"
      sleep 1
    done
    

    実行コマンド (コピー&ペースト用)

    chmod 744 ./test.sh
    ./test.sh
    

    test.shの実行例

    [opc@testvm1 ~]$ chmod 744 ./test.sh
    [opc@testvm1 ~]$ ./test.sh
    mysql: [Warning] Using a password on the command line interface can be insecure.
    mysql: [Warning] Using a password on the command line interface can be insecure.
    mysql: [Warning] Using a password on the command line interface can be insecure.
    <略>
    

  5. コンソールからスイッチオーバーを発生させます。他のアクションスイッチオーバー をクリックし、その後表示されたウインドウで現在セカンダリになっているFD(もしくはAD)を選択し、スイッチオーバー をクリックします。この例では、プライマリがFD1の状態から、FD2をプライマリに切り替える操作をしています。スイッチオーバーを実行すると、コンソール上でステータスが数分間「更新中」になり、その後ステータスが「アクティブ」に戻ります。なお、ステータスがアクティブに戻った時には、「優先フォルト・ドメイン」(もしくは「優先可能性ドメイン」)部分が新しいプライマリに応じて更新されています。

    img16.png

    img17.png

    img18.png

    img19.png

  6. 「Ctrl+C」を押し、シェルスクリプトtest.shを停止します。その後、MySQL HeatWaveに接続します。

    実行例

    mysql: [Warning] Using a password on the command line interface can be insecure.
    mysql: [Warning] Using a password on the command line interface can be insecure.
    mysql: [Warning] Using a password on the command line interface can be insecure.
    ^C
    [opc@testvm1 ~]$ mysql -u root -p -h TestHA.sub01311142371.tutorialvcn.oraclevcn.com
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 237
    Server version: 8.0.32-cloud MySQL Enterprise - Cloud
    
    Copyright (c) 2000, 2023, Oracle and/or its affiliates.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> 
    

  7. 以下のSQLを実行し、スイッチオーバー時にMySQL HeatWaveが使用できなかった時間を確認します。"PRI_MEMBER_HOST='battlz9jzxwb28dg'“部分は、事前にメモした旧プライマリのMySQL HeatWaveのMEMBER_HOSTの値に置き換えて実行して下さい。この例の場合INSERT_TIMEの差分が3秒であるため、スイッチオーバー時にMySQL HeatWaveが使用できなかった時間は約2秒であることが分かります。障害発生時に発生するフェイルオーバーの方が、通常状態でプライマリサーバーを切り替えるスイッチオーバーよりも所要時間が長くなる可能性がありますが、プライマリサーバーの切り替え自体はこのように短時間で実現可能です。

    実行コマンド例(コピー&ペースト用)

    SELECT *
      FROM test.test
      WHERE id IN (
        (SELECT MAX(id) FROM test.test WHERE PRI_MEMBER_HOST='battlz9jzxwb28dg'),
        (SELECT MAX(id) FROM test.test WHERE PRI_MEMBER_HOST='battlz9jzxwb28dg')+1
        )
      ORDER BY 1 ASC;
    

    実行例

    mysql> SELECT *
        ->   FROM test.test
        ->   WHERE id IN ((SELECT MAX(id) FROM test.test WHERE PRI_MEMBER_HOST='battlz9jzxwb28dg'),
        ->                (SELECT MAX(id) FROM test.test WHERE PRI_MEMBER_HOST='battlz9jzxwb28dg')+1)
        ->   ORDER BY 1 ASC;
    +-----+------------------+-------------+
    | id  | PRI_MEMBER_HOST  | INSERT_TIME |
    +-----+------------------+-------------+
    | 104 | battlz9jzxwb28dg | 15:40:09    |
    | 105 | msv4fwl6o2e28az2 | 15:40:12    |
    +-----+------------------+-------------+
    2 rows in set (0.00 sec)
    

これで、この章の作業は終了です。

この章では、TestHA というHA構成のMySQL HeatWaveのDBシステムを作成し、スイッチオーバーによるDB停止時間を確認しました。MySQL HeatWaveのHA構成はグループ・レプリケーションにより構成されていますが、グループ・レプリケーションでは障害発生時のデータロスが発生しないアーキテクチャーになっています。また、障害発生時にも自動的にフェイルオーバーが発生するため、ダウンタイムも最小限に抑えられます。高可用性が求められるシステムを構築する際は、HA構成のMySQL HeatWaveを使って下さい。

なお、本チュートリアル作成当初の時点(2023年2月時点)でドキュメントで案内されているRTO、RPOは以下の通りです。 (最新の情報はこちらから確認して下さい)

img20.png

また、HA構成のMySQL HeatWaveの制限事項についてはこちらを確認して下さい。2023年2月時点では主に以下の制限事項がありますが、今後改善が計画されています。

  • 「構成」を変更できない
  • セカンダリのMySQL HeatWaveのノードにはアクセスできない