外部サーバーからのレプリケーション

このページでは、Cloud SQL 第 2 世代のレプリカにソース データベース サーバーのデータを複製するレプリケーション構成の作成方法について説明します。この構成は、外部マスター構成とも呼ばれます。

すべてのサーバー要件を満たす任意の MySQL サーバーをソース データベース サーバーにすることができます。これには Cloud SQL インスタンスも含まれます。他のクラウド プロバイダによってホストされているインスタンスも、GTID をサポートするなど、要件を満たしていればデータソースとして機能します。

この構成について詳しくは、外部サーバーからのレプリケーションについてをご覧ください。

始める前に

外部サーバーからのレプリケーションを設定する前に、次の手順を完了する必要があります。

  • Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  • GCP プロジェクトを選択または作成します。

    [リソースの管理] ページに移動

  • プロジェクトに対して課金が有効になっていることを確認します。

    課金を有効にする方法について

  • Cloud SQL 管理者 API を有効にします。

    APIを有効にする

  • gcloud コマンドライン ツールのインストールと認証を行います。
  • サーバーがソース データベース サーバーの要件を満たしていることを確認します。
  • マスターとレプリカ間の接続に必要なセキュリティ レベルを判断し、必要な証明書ファイルを取得します。
  • Cloud SQL レプリカを格納するために使用する GCP リージョンを決定します。
  • ソース データベース サーバーに関して必要な次の情報を集めます。

    • 外部 IPv4 アドレスとポート番号

      デフォルトでは、MySQL はポート 3306 を使用します。

    • MySQL レプリケーションのユーザー アカウントとパスワード
    • MySQL のバージョン番号
    • 選択したセキュリティ レベルに応じて必要となるすべての SSL/TLS 証明書および鍵の場所
  • ソース データベース サーバーが Cloud SQL レプリカからの接続を受け入れるようにネットワーク ファイアウォールを更新する準備をします。

    この手順は、レプリカを作成してから 30 分以内に完了する必要があります。

  • プロジェクト オーナーでない場合は、Storage Admin 役割が必要です。

ソース データベース サーバーの要件

外部サーバーから Cloud SQL レプリカに複製するには、ソース データベース サーバーが次の構成要件を満たしていることを事前に確認しておく必要があります。

  • MySQL Community Edition バージョン 5.6 または 5.7 を実行していること。

  • バイナリログが有効になっていること。 詳細をご覧ください。

  • レプリカがインポートを完了するのに十分な時間、バイナリログが保持されること。

    通常は、1 週間保持されるようになっていれば十分です。 バイナリログ保持ポリシーの設定については、こちらをご覧ください

  • 行ベースのバイナリ ロギングを使用していること。 詳細をご覧ください。

  • GTID が有効にされていて、GTID 整合性が強制されること。

    GTID の詳細については、こちらをご覧ください。GTID 整合性を強制する際のオプションをご確認ください。

  • (システム データベース内のテーブルを除く)すべてのテーブルで InnoDB ストレージ エンジンを使用していること。

    InnoDB の詳細については、こちらをご覧ください。InnoDB への変換の詳細については、こちらをご覧ください。

  • MySQL ユーザー アカウントに REPLICATION_SLAVE 権限が割り当てられていること。

    このアカウントを、どこからの接続でも受け入れるように構成します(ホスト = %)。後述の手順で、このユーザーに対してアクセスを制限できます。このユーザー アカウントはレプリケーション以外の目的で使用しないでください。

    権限の詳細については、こちらをご覧くださいユーザー アカウントの詳細については、こちらをご覧ください

  • IPv4 アドレスと TCP ポートに外部からアクセスできること。

構成プロセス

外部データベース サーバーからのレプリケーションを設定するには、次の手順を行います。

  1. データ用の Cloud Storage バケットを作成します。
  2. Cloud Storage にデータをエクスポートします。
  3. レプリケーション構成を設定します。
  4. レプリカからの接続を受け入れるようにソース データベース サーバーを構成します。

  5. MySQL レプリケーション ユーザーに対してアクセスを制限します。

  6. レプリカ構成を完了します。

  7. レプリケーションのステータスを確認します。

  8. ストレージをクリーンアップします。

1. データ用の Cloud Storage バケットを作成する

エクスポート プロセス中にデータを一時的に格納するバケットを作成するか、または既存のバケットを使用します。

バケットの作成方法について詳しくは、ストレージ バケットの作成をご覧ください。ストレージ管理者の役割の詳細については、Cloud Storage の IAM 役割をご覧ください。

2. Cloud Storage にデータをエクスポートする

レプリカは自身のデータを Cloud Storage 内で探すため、サーバーのデータのコピーを Cloud Storage に入れます。エクスポート後も、引き続きサーバーに対する書き込みオペレーションを実行できます。レプリカはダンプファイルのインポートを完了すると、エクスポートの実行後に行われたすべての変更を処理し、最終的にマスターの状態に追いつきます。

gcloud ツールがインストールされていて、MySQL サーバーにネットワーク接続できるマシンから、次のコマンドを実行します。

mysqldump \
    -h [MASTER_IP] -P [MASTER_PORT] -u [USERNAME] -p \
    --databases [DBS]  \
    --hex-blob  --skip-triggers  --master-data=1  \
    --order-by-primary --no-autocommit \
    --default-character-set=utf8mb4 --ignore-table [VIEW] \
    --single-transaction --set-gtid-purged=on | gzip | \
    gsutil cp - gs://[BUCKET]/[PATH_TO_DUMP]

[PROPERTIES_IN_BRACKETS] は、次の値で置き換えます。

プロパティ
[MASTER_IP] ソース データベース サーバーの IPv4 アドレス。
[MASTER_PORT] ソース データベース サーバーのポート。
[USERNAME] MySQL レプリケーション ユーザー アカウント。
[PASSWORD] MySQL レプリケーション ユーザー アカウントのパスワード。
[DBS] システム データベース(sysmysqlperformance_schemainformation_schema)を除く、ソース データベース サーバー上のすべてのデータベースのカンマ区切りリスト。データベースを一覧表示するには、SHOW DATABASES MySQL コマンドを使用します。
[VIEW] ダンプしているデータベース内に存在するすべてのビューは無視する必要があります。ビューが複数ある場合は、このオプションを複数回使用します。
[BUCKET] エクスポート ファイルを格納するために作成したバケットの名前。
[PATH_TO_DUMP] エクスポート ファイルへのパス。

部分ダンプと GTID に関する警告が表示された場合、これは想定されていることで、問題はありません。

このコマンドは、次の例のようになります。

mysqldump \
    -h 192.0.2.1 -P 3306 -u replicationUser \
    --databases guestbook  \
    --hex-blob  --skip-triggers  --master-data=1  \
    --order-by-primary --no-autocommit \
    --default-character-set=utf8mb4 --ignore-table view1 --ignore-table view2 \
    --single-transaction --set-gtid-purged=on | gzip | \
    gsutil cp - gs://export-bucket/hq-master1.sql.gz

3. レプリケーション構成を作成する

Console

この手順では、Cloud SQL レプリカとソース表現インスタンスを作成します。

  1. Google Cloud Platform Console で、Cloud SQL インスタンスを開きます。

    インスタンスのリストを開く

  2. ボタンバーの [データを移行] をクリックして、Cloud SQL 移行アシスタントを開きます。

  3. [移行を開始] をクリックします。

  4. [ソース データベースの名前] フィールドに、Cloud SQL 内のレプリケーション構成の名前を入力します。

    この名前は構成の参照です。有効な任意の Cloud SQL インスタンス名を使用してください。

  5. ソース データベース サーバーの IP アドレスとポート番号を入力します。

  6. レプリケーション接続に使用する MySQL ユーザーのユーザー名とパスワードを指定します。

  7. ソース データベース サーバーの MySQL のバージョンを選択します。

  8. レプリカとソース データベース サーバー間の接続に SSL/TLS を使用する場合(推奨)、[SSL/TLS セキュリティを有効にする] を選択して、ソースサーバーの SSL/TLS 証明書情報を指定します。

    SSL/TLS のオプションについて詳しくは、SSL/TLS オプションをご覧ください。

  9. [次へ] をクリックし、レプリカの詳細を入力します。

    インポートが可能な限り効率化されるよう、データベースを格納するのにほぼ十分なストレージを使用してレプリカを構成します。マシンタイプのサイズは、ソースサーバーと同様のサイズにします。

  10. 前の手順で Cloud Storage にアップロードしたダンプファイルへのパスを指定します。

  11. [作成] をクリックしてレプリカを作成します。

  12. [次へ] をクリックします。

gcloud

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

    gcloud beta sql instances create [SOURCE_REPRESENTATION_NAME] \
        --region=[REGION] --database-version=[MYSQL_VERSION] \
        --source-ip-address=[SOURCE_IP] --source-port=[SOURCE_PORT]
    

    [PROPERTIES_IN_BRACKETS] は、次の値で置き換えます。

    プロパティ
    [SOURCE_REPRESENTATION_NAME] ソース表現インスタンスの名前。有効な任意の Cloud SQL インスタンス名を使用します。
    [REGION] Cloud SQL レプリカを配置するリージョン
    [MYSQL_VERSION] ソース データベース サーバーで実行されている MySQL のバージョン(MYSQL_5_6 または MYSQL_5_7)。
    [SOURCE_IP] 外部からアクセス可能なソース データベース サーバーの IPv4 アドレス。
    [SOURCE_PORT] 外部からアクセス可能なソース データベース サーバーのポート。
  2. Cloud SQL レプリカを作成します。

    gcloud beta sql instances create [REPLICA_NAME] \
        --master-instance-name=[SOURCE_REPRESENTATION_NAME] \
        --master-username=[USERNAME] --prompt-for-master-password \
        --master-dump-file-path=gs://[BUCKET]/[PATH_TO_DUMP] \
        --master-ca-certificate-path=[SOURCE_SERVER_CA_PATH] \
        --client-certificate-path=[CLIENT_CERT_PATH] \
        --client-key-path=[PRIVATE_KEY_PATH] \
        --tier=[MACHINE_TYPE] --storage-size=[DISK_SIZE]
    

    [PROPERTIES_IN_BRACKETS] は、次の値で置き換えます。

    プロパティ
    [REPLICA_NAME] Cloud SQL リードレプリカの名前。有効な任意の Cloud SQL インスタンス名を使用します。
    [SOURCE_REPRESENTATION_NAME] 前のステップで作成したソース表現インスタンスの名前。
    [USERNAME] ソース データベース サーバー上の MySQL レプリケーション ユーザー アカウント。
    [BUCKET] エクスポート ファイルを格納するために作成したバケットの名前。
    [PATH_TO_DUMP] エクスポート ファイルへのパス。
    [SOURCE_SERVER_CA_PATH] ソース データベース サーバーの CA 証明書が保管されている場所へのローカルパス。SSL/TLS を使用する場合にのみ必要です。
    [CLIENT_CERT_PATH] クライアント証明書が保管されている場所へのローカルパス。サーバー クライアント認証を使用する場合にのみ必要です。
    [PRIVATE_KEY_PATH] クライアント証明書の秘密鍵ファイルが保管されている場所へのローカルパス。サーバー クライアント認証を使用する場合にのみ必要です。
    [MACHINE_TYPE] レプリカのサイズ。通常、レプリカはソース データベース サーバーとほぼ同じサイズでなければなりません。使用するマシンタイプがわからない場合、まずは db-n1-standard-2 を使用してください。後で必要に応じてサイズを変更できます。
    [DISK_SIZE] レプリカのストレージ サイズ(GiB 単位)。パフォーマンスを最大限に高めるためには、インポート ファイル全体を格納するのにほぼ十分なストレージを使用してレプリカを作成してください。

cURL

1. Cloud SQL ソース表現インスタンスを作成する

ACCESS_TOKEN="$(gcloud auth application-default print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data '{
         "name": "[SOURCE_REPRESENTATION_NAME]",
         "region": "[REGION]",
         "databaseVersion": "[MYSQL_VERSION]",
         "onPremisesConfiguration": {
             "hostPort": "[SOURCE_SERVER_IP]:[SOURCE_SERVER_PORT]"
         }
     }' \
     -X POST \
     https://www.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances

[PROPERTIES_IN_BRACKETS] は、次の値で置き換えます。

プロパティ
[SOURCE_REPRESENTATION_NAME] ソース表現インスタンスの名前。有効な任意の Cloud SQL インスタンス名を使用します。
[REGION] Cloud SQL レプリカを配置するリージョン
[MYSQL_VERSION] ソース データベース サーバーで実行されている MySQL のバージョン(MYSQL_5_6 または MYSQL_5_7)。
[SOURCE_SERVER_IP] 外部からアクセス可能なソース データベース サーバーの IPv4 アドレス。
[SOURCE_SERVER_PORT] 外部からアクセス可能なソース データベース サーバーのポート。
[PROJECT_ID] GCP プロジェクトのプロジェクト ID。

たとえば、hq-master1 という名前のソース表現インスタンスを作成するとします。ソース データベース サーバーの IP アドレスが 192.0.2.0 で、開いているポートは 3306、実行中の MySQL のバージョンは 5.7 だとします。また、Cloud SQL レプリカは MyProject プロジェクトに含まれていて us-central1 リージョンに配置されているとしたら、次のコマンドを使用します。

ACCESS_TOKEN="$(gcloud auth application-default print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data '{
         "name": "hq-master1",
         "region": "us-central1",
         "databaseVersion": "MYSQL_5_7",
         "onPremisesConfiguration": {
             "hostPort": "192.0.2.0:3306"
         }
     }' \
     -X POST \
     https://www.googleapis.com/sql/v1beta4/projects/MyProject/instances

2. Cloud SQL レプリカを作成する

この手順では、ソース データベース サーバーを表すソース表現インスタンスを使用して Cloud SQL リードレプリカを作成し、作成したレプリカに、前の手順で Cloud Storage に読み込んだデータを取り込みます。

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

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

{
    "replicaConfiguration": {
        "mysqlReplicaConfiguration": {
            "username": "[USERNAME]",
            "password": "[PASSWORD]",
            "dumpFilePath": "gs://[BUCKET]/[PATH_TO_DUMP]",
            "caCertificate": "[SOURCE_SERVER_CA]",
            "clientCertificate": "[CLIENT_CERT]",
            "clientKey": "[PRIVATE_KEY]"
        }
     },
     "settings": {
         "tier": "[MACHINE_TYPE]",
         "dataDiskSizeGb": "[DISK_SIZE]"
     },
     "masterInstanceName": "[SOURCE_REPRESENTATION_NAME]",
     "region": "[REGION]",
     "databaseVersion": "[MYSQL_VERSION]",
     "name": "[REPLICA_NAME]"
}

[PROPERTIES_IN_BRACKETS] は、次の値で置き換えます。

プロパティ
[USERNAME] ソース データベース サーバー上の MySQL レプリケーション ユーザー アカウント。
[PASSWORD] MySQL レプリケーション ユーザー アカウントのパスワード。
[BUCKET] エクスポート ファイルを格納するために作成したバケットの名前。
[PATH_TO_DUMP] エクスポート ファイルへのパス。
[SOURCE_SERVER_CA] ソース データベース サーバーの CA 証明書。SSL/TLS を使用する場合にのみ必要です。証明書をリクエスト本文に貼り付けてください。
[CLIENT_CERT] クライアント証明書。サーバー クライアント認証を使用する場合にのみ必要です。証明書をリクエスト本文に貼り付けてください。
[PRIVATE_KEY] クライアント証明書の秘密鍵ファイル。サーバー クライアント認証を使用する場合にのみ必要です。鍵をリクエスト本体に貼り付けてください。
[MACHINE_TYPE] レプリカのサイズ。通常、レプリカはソース データベース サーバーとほぼ同じサイズでなければなりません。使用するマシンタイプがわからない場合、まずは db-n1-standard-2 を使用してください。後で必要に応じてサイズを変更できます。
[DISK_SIZE] レプリカのストレージ サイズ(GiB 単位)。パフォーマンスを最大限に高めるためには、インポート ファイル全体を格納するのに十分なストレージを使用してレプリカを作成してください。
[SOURCE_REPRESENTATION_NAME] 前の手順で作成したソース表現インスタンスの名前。
[REGION] ソース表現インスタンスを作成したリージョン。リードレプリカは、ソース表現インスタンスと同じリージョンに配置する必要があります。
[MYSQL_VERSION] ソース データベース サーバーで実行されている MySQL のバージョン(MYSQL_5_6 または MYSQL_5_7)。
[REPLICA_NAME] Cloud SQL リードレプリカの名前。有効な任意の Cloud SQL インスタンス名を使用します。

コマンドラインで API を呼び出します。

ACCESS_TOKEN="$(gcloud auth application-default print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data @[PATH_TO_DATA_FILE] \
     -X POST \
     https://www.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances

前に作成したソース表現インスタンスとバケットを使用する場合、データファイル data.json は次の例のようになります。

{
    "replicaConfiguration": {
        "mysqlReplicaConfiguration": {
            "username": "replicationUser",
            "password": "486#@%*@",
            "dumpFilePath": "gs://export-bucket/hq-master1.sql.gz",
            "caCertificate": "[SOURCE_SERVER_CA]",
            "clientCertificate": "[CLIENT_CERT]",
            "clientKey": "[PRIVATE_KEY]"
        }
    },
    "settings": {
        "tier": "db-n1-standard-4",
        "dataDiskSizeGb": "100"
    },
    "masterInstanceName": "hq-master1",
    "region": "us-central1",
    "databaseVersion": "MYSQL_5_7",
    "name": "hq-master1-replica1"
}

cURL コマンドは次のようになります。

curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data @./data.json
     -X POST \
     https://www.googleapis.com/sql/v1beta4/projects/MyProject/instances

リードレプリカがダンプファイルにアクセスできるようになると、インポート プロセスを開始します。インポート プロセスの期間は、ダンプファイルのサイズ、レプリカのマシンタイプ、データベース スキーマに依存します。見積もりの一般的な目安として、レプリカは 1 時間あたり約 25〜50 GB をインポートすると想定してください。

インポート プロセスが完了するまで、レプリカは PENDING_CREATE 状態です。完了すると、レプリカの状態は RUNNABLE に変わります。

4. レプリカからの接続を受け入れるようにソース データベース サーバーを構成する

レプリケーションを成功させるには、レプリカがソース データベース サーバーに接続しなければなりません。ソース データベース サーバーがファイアウォールの背後にある場合やその他のネットワーク制限で守られている場合、レプリカの OUTGOING IP アドレスを使用してネットワーク アクセスを有効にする必要があります。このアドレスは、GCP Console でレプリカのメインリストに表示される IP アドレスとは異なりますOUTGOING IP アドレスを取得するには、IP アドレスの [詳細] にカーソルを合わせてツールチップを表示するか、以下の gcloud コマンドを使用します。

  1. リードレプリカの IP アドレスを取得します。

    gcloud sql instances describe [REPLICA_NAME] --format="default(ipAddresses)"
    
  2. ソース データベース サーバーが OUTGOING IP アドレスからの接続を受け入れるようにネットワーク ファイアウォールを構成します。
  3. レプリカがソース データベース サーバーに正常に接続したことを確認します。

    1. インスタンスの一覧ページに表示されているレプリカのアイコンが回転しなくなり、緑色であるはずです。
    2. Google Cloud Platform Console のログビューアに移動します。

      ログビューアに移動

    3. [インスタンス] プルダウンからレプリカを選択します。
    4. replication-setup.log ログファイルを選択します。

      レプリカがソース データベース サーバーに接続できない場合は、次の点を確認してください。

      • ソース データベース サーバー上のすべてのファイアウォールが、レプリカの OUTGOING IP アドレスからの接続を受け入れるように構成されている。
      • SSL/TLS 構成が正しく行われている。
      • 正しいレプリケーション ユーザー、ホスト、およびパスワードを使用している。

5. MySQL レプリケーション ユーザーに対してアクセスを制限する

この手順はオプションですが、セキュリティの観点から、行うことをおすすめします。

ソース データベース サーバー上の MySQL レプリケーション ユーザーは、任意のホスト(%)からの接続を受け入れるように構成されています。そのユーザー アカウントを、レプリカの OUTGOING IP アドレスからの接続のみを受け入れるように更新します。

    UPDATE mysql.user SET Host='[OUTGOING_IP]' WHERE Host='%' AND User='[USERNAME]';
    FLUSH PRIVILEGES;

6 レプリカ構成を完了する

  1. レプリカ上でユーザー アカウントを構成します。

    構成には、Google Cloud Platform Console、gcloud コマンドライン ツール、または Cloud SQL API を使用できます。ただし、mysql クライアントを使用することはできません。MySQL ユーザーについて詳しくは、MySQL ユーザーをご覧ください。

    GCP Console を使用してユーザーを作成するには:

    1. Google Cloud Platform Console で [Cloud SQL インスタンス] ページに移動します。
      Cloud SQL の [インスタンス] ページに移動
    2. インスタンス名をクリックして [インスタンスの詳細] ページを開きます。
    3. [ユーザー] タブを選択します。
    4. [ユーザー アカウントを作成] をクリックします。
    5. [ユーザー アカウントの作成] ダイアログで、作成するユーザーの詳細を指定します。
    6. [作成] をクリックします。
  2. IP アドレスでレプリカに接続するために使用するクライアントからのアクセスを承認します。

    手順については、承認済みアドレスまたはアドレス範囲を追加するをご覧ください。レプリカに接続するには、レプリカの PRIMARY IP アドレスを使用します。この IP アドレスは、GCP Console に表示されます。

    他の接続方法を使用してレプリカに接続することもできます。

7. レプリケーションのステータスを確認する

レプリカはダンプファイルのインポートを完了すると、オンプレミス サーバーに接続し、エクスポートの実行後に行われたすべての更新を適用します。そのステータスは、GCP Console のインスタンスの一覧ページで確認できます。

  1. Google Cloud Platform Console で [Cloud SQL インスタンス] ページに移動します。
    Cloud SQL インスタンス ページに移動
  2. [情報パネルを表示] をクリックし、指標プルダウン リストから [レプリケーションの遅延] を選択します。

    レプリケーションの遅延は 0 になっているか、0 に近くなっているはずです。そうでない場合は、対処する必要があります。

8. ストレージをクリーンアップする

  1. エクスポート ファイルを削除します。

    gsutil rm gs://[BUCKET]/[PATH_TO_DUMP]
    
  2. バケットが不要になった場合は、バケットを削除します。

    gsutil rm -r gs://[BUCKET]
    

詳細については、オブジェクトの削除バケットの削除に関する Cloud Storage ドキュメントをご覧ください。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...