外部レプリカを構成する

このページでは、Cloud SQL の外部にある 1 つ以上のレプリカに複製される Cloud SQL インスタンスを構成する方法を説明します。また、外部レプリカの構成に含まれるプライマリ インスタンスを降格して構成を元に戻す方法も説明します。

外部レプリカの構成の詳細については、外部レプリケーションについてをご覧ください。

外部レプリカの構成を行う

始める前に

このタスクを開始する前に、外部レプリカの要件を満たす Cloud SQL インスタンスと外部 MySQL インスタンスを用意しておく必要があります。

プライマリ インスタンスを構成する

  1. Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
  2. プライマリ インスタンスで外部レプリカの IP アドレスへのアクセスを有効にします。

    IP アクセスの有効化の詳細については、IP 接続のためのアクセスを構成するをご覧ください。

  3. 後で使用できるように、プライマリ インスタンスのパブリック IP アドレスとパブリック送信 IP アドレスを記録します。これらの値はインスタンスの [概要] ページで確認できます。
  4. 右上隅の Cloud Shell アイコン()をクリックします。
  5. Cloud Shell プロンプトで、組み込み MySQL クライアントを使用してプライマリ インスタンスに接続します。
       
    gcloud sql connect PRIMARY_INSTANCE_NAME \
    --user=root
       
       
  6. root パスワードを入力します。mysql プロンプトが表示されます。
  7. レプリケーション用に特別なユーザーを作成し、レプリケーション権限を付与します。
    CREATE USER 'REPLICATION_USER'@'%' IDENTIFIED BY 'REPLICATION_USER_PASSWORD';
    GRANT REPLICATION SLAVE ON *.* TO 'REPLICATION_USER'@'%';
       
  8. 新しいデータベースで開始する場合は、プライマリ インスタンスとレプリカ インスタンスの両方に同じデータベースとテーブルを作成します。次に例を示します。
    CREATE DATABASE test;
    
    USE test;
    
    CREATE TABLE replica_test (id SERIAL PRIMARY KEY, data text);
    INSERT INTO replica_test (data) VALUES ('apple'), ('banana'), ('cherry');
  9. プライマリ インスタンスにデータベースがすでに存在する場合は、レプリカでもデータベースを作成する必要があります。これを行うには、プライマリ インスタンスから Cloud Storage バケットにデータベースをエクスポートし、レプリカにインポートします。詳しくは、Cloud SQL から Cloud Storage の SQL ダンプファイルにデータをエクスポートするをご覧ください。

外部レプリカを構成する

警告: この手順を行うと、レプリカの MySQL データベースでホストされているすべてのデータ(ユーザーとパスワードを含む)がプライマリ インスタンスの設定とデータで上書きされます。
  1. レプリカをホストしているマシン上で、プライマリ インスタンスから作成したエクスポート ファイルとともに新しい外部 MySQL インスタンスをシードします。

    たとえば、次のコマンドは、mydump.sql という名前のエクスポートされたファイルを読み込みます。

    mysql --user=root --password < mydump.sql
    
  2. このレプリカとプライマリのペアのサーバー ID を特定します。

    サーバー ID は数値(たとえば「3」)で、外部レプリカの構成全体で一意でなければなりません(各レプリカは一意のサーバー ID を持つ必要があります)。

  3. レプリカの my.cnf オプション ファイルに次のオプションを追加します。
    [mysqld]
    server-id=[SERVER_ID]
    gtid_mode=ON
    enforce_gtid_consistency=ON
    log_slave_updates=ON
    replicate-ignore-db=mysql
    binlog-format=ROW
    log_bin=mysql-bin
    expire_logs_days=1
    read_only=ON
    

    MySQL のレプリケーション オプションの詳細については、レプリケーションとバイナリログのオプションをご覧ください。

  4. mysqld プロセスを再起動して構成ファイルが読み取られるようにします。
  5. レプリカの mysql クライアントで、次のコマンドを入力します。
    CHANGE MASTER TO MASTER_HOST='MASTER_IP_ADDRESS', MASTER_USER='REPLICATION_USER',
    MASTER_PASSWORD='REPLICATION_PASSWORD', MASTER_AUTO_POSITION=1;
    
  6. レプリカのレプリケーションを開始します。
    START SLAVE;
    
  7. レプリケーションのステータスを確認します。

    SHOW SLAVE STATUS\G;
    

    「マスターからのイベントの送信を待機しています」と表示された場合、レプリケーションは作動しています。

外部レプリカのプライマリ インスタンスを降格する

外部レプリカを使用する Cloud SQL インスタンスがある場合、外部レプリカの構成を元に戻すことができます。構成を元に戻すと、次のように変更されます。

  • 外部レプリカが新しいプライマリ インスタンスになります。
  • Cloud SQL インスタンスがリードレプリカになり、前は外部レプリカだったサーバー(現在のソース データベース サーバー)からのレプリケーションを行います。

外部レプリカの構成を元に戻すには、次の手順に従います。

  1. ソース表現インスタンスを作成します。

    降格オペレーションが完了した後は、このインスタンスが Cloud SQL レプリカのソース データベース サーバーを表します。

    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data '{
             "name": "SOURCE_REPRESENTATION_NAME",
             "region": "REGION",
             "databaseVersion": "EXTERNAL_SERVER_DATABASE_VERSION",
             "onPremisesConfiguration": {
                 "hostPort": "EXTERNAL_SERVER_IP:EXTERNAL_SERVER_PORT"
             }
         }' \
         -X POST \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT-ID/instances
    

    Cloud SQL レプリカを配置するリージョンを使用します。

  2. 降格プロセスを開始します。

    この API 呼び出しでは機密情報を提供する必要があるため、データをコマンドラインに入力するのではなく、JSON ファイルを使用してデータを cURL に渡す必要があります。

    次のデータファイルを作成します。

    {
        "demoteMasterContext": {
            "replicaConfiguration": {
                "mysqlReplicaConfiguration": {
                    "username": "REPLICATION_USERNAME",
                    "password": "PASSWORD",
                    "caCertificate": "EXTERNAL_SERVER_CA",
                    "clientCertificate": "CLIENT_CERT",
                    "clientKey": "PRIVATE_KEY"
                }
            },
            "masterInstanceName": "SOURCE_REPRESENTATION_NAME",
        },
    }
    

    次に、API を呼び出します。

    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data @PATH_TO_DATA_FILE \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT-ID/instances/INSTANCE_NAME/demoteMaster
    

    SSL / TLS のオプションについて詳しくは、SSL / TLS オプションをご覧ください。 replicaConfiguration オブジェクトにより使用されるプロパティの詳細については、外部サーバーからのレプリケーションをご覧ください。

  3. 外部レプリカがプライマリ インスタンスからの保留中トランザクションをすべて完了するまで待ちます。

    レプリカに追いつくと、SHOW SLAVE STATUS コマンドで表示される Seconds Behind Master が 0 となり、外部レプリカと Cloud SQL プライマリ間で Executed_Gtid_Set の値が同じになります。

  4. mysql クライアントを使用して、外部レプリカに対するレプリケーションを停止します。

    STOP SLAVE
    RESET SLAVE ALL
    
  5. Cloud SQL インスタンスが新しくソース データベース サーバーとなった外部サーバーからのレプリケーションを開始するまで待ちます。

    Cloud SQL インスタンスで SHOW SLAVE STATUS コマンドを実行すると、レプリケーションのステータスが提供されます。

  6. Cloud SQL インスタンスがソース データベース サーバーから正常にレプリケートしている場合は、ソース データベース サーバーの read_only フラグを off に設定し、アプリケーションを更新してこのソース データベース サーバーを指すようにします。

トラブルシューティング

問題 トラブルシューティング
エラー メッセージ: The slave is connecting ... master has purged binary logs containing GTIDs that the slave requires プライマリ Cloud SQL インスタンスで自動バックアップ、バイナリログ、ポイントインタイム リカバリが有効になっているため、レプリカが追いつくまで必要なログが保持されていなければなりません。しかし、この場合、バイナリログは存在しますが、読み取りを開始する行がレプリカで認識されません。

正しいフラグを設定して新しいダンプファイルを作成し、そのファイルを使用して外部レプリカを構成します。

  1. Compute Engine インスタンスを介して mysql クライアントに接続します。
  2. mysqldump を実行し、--master-data=1 フラグと --flush-privileges フラグを使用します。

    重要: --set-gtid-purged=OFF フラグを含めないでください

    詳細

  3. 作成したダンプファイルに SET @@GLOBAL.GTID_PURGED='...' 行が含まれていることを確認します。
  4. ダンプファイルを Cloud Storage バケットにアップロードし、ダンプファイルを使用してレプリカを構成します。

次のステップ