設定外部備用資源

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

如要進一步瞭解複製作業,請參閱關於 Cloud SQL 中的複製作業

設定外部備用資源設定

事前準備

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

來源執行個體需求

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

設定主要執行個體

  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. 輸入根密碼。接著,您應該會看到 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 值區,並 使用傾印檔案設定副本

後續步驟