設定外部備用資源

本頁面說明如何設定 Cloud SQL 執行個體,將資料複製到一或多個 Cloud SQL 外部副本,以及如何降級外部副本設定中的主要執行個體,反轉設定。

如要進一步瞭解複製功能,請參閱「關於 Cloud SQL 中的複製功能」。

設定外部副本

事前準備

開始這項工作前,您必須擁有 Cloud SQL 執行個體,以及符合外部副本規定的外部 MySQL 執行個體。

來源執行個體需求

外部唯讀副本的來源執行個體必須是主要或獨立執行個體。您無法將 Cloud SQL 唯讀副本做為外部唯讀副本的來源執行個體。唯讀副本有時會從主要執行個體的磁碟複製項目重新建立,且唯讀副本無法維護其對外部唯讀副本的複製狀態。

設定主要執行個體

  1. 前往 Cloud de Confiance 控制台的「Cloud SQL 執行個體」頁面。
  2. 在主要執行個體上,啟用外部副本 IP 位址的存取權。

    如要瞭解如何啟用 IP 存取權,請參閱「設定 IP 連線的存取權」。

  3. 記下主要執行個體的公開 IP 位址和公開傳出 IP 位址,稍後會用到。您可以在執行個體的「Overview」(總覽) 頁面找到這些值。
  4. 按一下右上角的 Cloud Shell 圖示 。
  5. 在 Cloud Shell 提示視窗中,使用內建的 MySQL 用戶端連線至主要執行個體:
       
    gcloud sql connect PRIMARY_INSTANCE_NAME \
    --user=root
       
       
  6. 輸入根密碼。接著,您應該會看見 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 bucket,然後匯入副本。進一步瞭解如何將資料從 Cloud SQL 匯出至 Cloud Storage 中的 SQL dump 檔案。

設定外部副本

警告:這項程序會以主要執行個體的設定和資料,覆寫副本 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 執行個體已啟用自動備份、二進位記錄和時間點復原功能,因此應有足夠的記錄,可讓副本趕上進度。不過,在這種情況下,雖然二進位記錄存在,但副本不知道要從哪一列開始讀取。

使用正確的旗標設定建立新的 dump 檔案,並使用該檔案設定外部副本

  1. 透過 Compute Engine 執行個體連線至 mysql 用戶端。
  2. 執行 mysqldump 並使用 --master-data=1 和 --flush-privileges 旗標。

    重要事項:請勿加入 --set-gtid-purged=OFF 旗標。

    瞭解詳情。

  3. 確認剛建立的 dump 檔案包含 SET @@GLOBAL.GTID_PURGED='...' 行。
  4. 將 dump 檔案上傳至 Cloud Storage bucket,並使用 dump 檔案設定副本。

後續步驟