複製延遲時間

本頁說明如何排解及修正 Cloud SQL 讀取複本的複製延遲問題。

總覽

Cloud SQL 唯讀備用資源會使用全域交易 ID (GTID) 的 MySQL 列式複製功能。變更會寫入主要執行個體的二進位記錄,並傳送至備用資源,在那裡接收並套用至資料庫。

複製延遲可能會在以下情況下發生:

  • 主要執行個體無法將變更內容快速傳送至副本。
  • 副本無法快速接收變更。
  • 副本無法快速套用變更。
請在主要執行個體無法快速傳送變更,或備援執行個體無法快速接收變更時,使用 network_lag 指標監控前兩種情況。

您可以使用 replica_lag 指標查看總延遲時間。replica_lagnetwork_lag 之間的差異,可以指出當複本無法快速套用複製變更時的第三個原因。如要瞭解這些指標,請參閱下方的「監控複製延遲」一節。

加快備用資源設定速度

我們提供兩種方法,讓 MySQL 複本更快套用變更。使用者可以使用下列選項設定複本:

  • 平行複製
  • 高效能沖洗

平行複製

平行複製功能可設定備用資源,讓備用資源使用多個並行執行的執行緒,以便套用備用資源上的變更,進而縮短複製延遲時間。如要瞭解如何使用平行複製功能,請參閱「 設定平行複製功能」。

高效能沖洗

根據預設,MySQL 適用的 Cloud SQL 會在每筆交易完成後,將重做記錄刷新至磁碟。高效清除可將重做記錄清除至磁碟的頻率降低至每秒一次,進而改善寫入效能。

將唯讀備用資料庫的 innodb_flush_log_at_trx_commit 標記設為 2。您也必須將 sync_binlog 標記設為較高的值,innodb_flush_log_at_trx_commit 標記才能生效。

如要進一步瞭解此標記,請參閱使用標記的提示

在唯讀備用資源上設定 innodb_flush_log_at_trx_commit 旗標,如果 Cloud SQL 偵測到可能發生當機情形,就會自動重新建立備用資源。

最佳化查詢和結構定義

本節將提供一些常見的查詢和結構定義最佳化方式,協助您提升複製效能。

唯讀備用資料庫的查詢隔離層級

REPEATABLE READSERIALIZABLE 交易隔離層級會取得可能會阻斷複製變更的鎖定。建議您降低複本中查詢的隔離層級。READ COMMITTED 交易隔離等級的效能可能較佳。

主要資料庫中的長時間交易

如果在單一交易中更新大量資料列,可能會導致需要套用至主要執行個體,然後傳送至複本的變更數量突然激增。這項功能適用於一次影響多個資料列的單一陳述式更新或刪除作業。變更會在提交後傳送至複本。如果備用資源的查詢負載也偏高,在備用資源中套用突然大量變更的做法,可能會增加備用資源中發生鎖定爭用的可能性,導致複製作業延遲。

建議將大型交易分割成多項較小的交易。

缺少主鍵

Cloud SQL 唯讀備用資源使用列式複製功能,如果複製的 MySQL 資料表沒有主索引鍵,則效能會變差。建議所有複製的資料表都設有主索引鍵。

針對 MySQL 8 以上版本,建議您將旗標 sql_require_primary_key 設為 ON,要求資料庫中的資料表必須有主鍵。

因 DDL 而產生的專屬鎖定

資料定義語言 (DDL) 指令 (例如 ALTER TABLECREATE INDEX) 可能會因專屬鎖定而導致備援主機的複製延遲。為避免發生鎖定爭用情形,建議您在複本的查詢負載較低時,安排 DDL 執行作業。

備用資源超載

如果讀取副本收到的查詢過多,複製作業可能會遭到封鎖。建議您將讀取作業分散到多個備用資源,以減輕每個備用資源的負載。

為避免查詢量激增,建議您在應用程式邏輯中或代理層 (如有) 中,限制複本讀取查詢。

如果主要執行個體的活動量突然激增,請考慮分散更新作業。

單體式主要資料庫

建議您將主要資料庫進行垂直 (或水平) 分割,以免一或多個延遲的資料表拖慢其他所有資料表。

監控複製延遲時間

您可以使用 replica_lagnetwork_lag 指標監控複製延遲情形,並找出延遲的原因是主要資料庫、網路或備用資料庫。

指標說明
複製延遲時間
(cloudsql.googleapis.com/database/replication/replica_lag)

備用資源的狀態落後於主要執行個體的秒數。這是目前時間與原始時間戳記之間的差異,當初主要資料庫會在該時間戳記時刻,將目前套用在副本上的交易提交。特別是,如果副本尚未將寫入作業套用至資料庫,即使副本已收到寫入作業,系統仍可能將寫入作業計為延遲。

這個指標會在備援機制上執行 SHOW SLAVE STATUS 時,回報 Seconds_Behind_Master 的值。如需更多資訊,請參閱 MySQL 參考手冊中的「檢查複製作業狀態」。

上一個 I/O 執行緒錯誤編號
(cloudsql.googleapis.com/database/mysql/replication/last_io_errno)

指出導致 I/O 執行緒失敗的最後一個錯誤。如果此值不為 0,表示複製作業已中斷。這種情況很少發生,但仍有可能發生。請查看 MySQL 說明文件,瞭解錯誤代碼代表的意思。舉例來說,主例項中的 binlog 檔案可能已在複本收到檔案前刪除。如果複製作業中斷,Cloud SQL 通常會自動重新建立備用資源。 這個 last_io_errno 指標可能會告訴你原因。

上一個 SQL 執行緒錯誤號碼
(cloudsql.googleapis.com/database/mysql/replication/last_sql_errno)

指出導致 SQL 執行緒失敗的最後一個錯誤。如果此值不為 0,表示複製作業已中斷。這種情況很少發生,但仍有可能發生。請查看 MySQL 說明文件,瞭解錯誤代碼代表的意思。如果複製作業中斷,Cloud SQL 通常會自動重新建立備用資源。 這個 last_sql_errno 指標可以告訴你原因。

網路延遲
(cloudsql.googleapis.com/database/replication/network_lag)

從主要資料庫中寫入 binlog 到複本中的 IO 執行緒所需的時間長度 (以秒為單位)。

如果 network_lag 為零或可忽略,但 replica_lag 很高,表示 SQL 執行緒無法快速套用複製變更。

確認複製設定

如要確認複製功能是否正常運作,請針對複本執行下列陳述式:

mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
               Slave_IO_State: Queueing master event to the relay log
                  Master_Host: xx.xxx.xxx.xxx
                  Master_User: cloudsqlreplica
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.199927
          Read_Master_Log_Pos: 83711956
               Relay_Log_File: relay-log.000025
                Relay_Log_Pos: 24214376
        Relay_Master_Log_File: mysql-bin.199898
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 24214163
              Relay_Log_Space: 3128686571
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: Yes
           Master_SSL_CA_File: master_server_ca.pem
           Master_SSL_CA_Path: /mysql/datadir
              Master_SSL_Cert: replica_cert.pem
            Master_SSL_Cipher:
               Master_SSL_Key: replica_pkey.pem
        Seconds_Behind_Master: 2627
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 321071839
                  Master_UUID: 437d04e9-8456-11e8-b13d-42010a80027b
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: System lock
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set: 437d04e9-8456-11e8-b13d-42010a80027b:52111095710-52120776390
            Executed_Gtid_Set: 437d04e9-8456-11e8-b13d-42010a80027b:1-52113039508
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)

如果正在進行複製作業,第一欄 Slave_IO_State 會顯示 Waiting for master to send event 或類似訊息。此外,Last_IO_Error 欄位為空白。

如果沒有進行複製作業,Slave_IO_State 欄會顯示狀態 Connecting to masterLast_IO_Error 欄則會顯示狀態 error connecting to master cloudsqlreplica@x.x.x.x:3306

根據 MySQL 說明文件,與複製延遲相關的其他有趣欄位包括:

欄位說明
Master_Log_File
I/O 執行緒目前正在讀取的來源二進位記錄檔名稱。
Read_Master_Log_Pos
I/O 執行緒已讀取的目前來源二進位記錄檔位置。
Relay_Log_File
SQL 執行緒目前讀取及執行的轉送記錄檔案名稱。
Relay_Log_Pos
SQL 執行緒已讀取及執行的目前轉送記錄檔中位置。
Relay_Master_Log_File
來源二進位記錄檔案的名稱,其中包含 SQL 執行緒執行的最新事件。

在上述範例中,Relay_Master_Log_File 的值為 mysql-bin.199898Master_Log_File 的值為 mysql-bin.199927。數字後置字串 199898 小於 199927。也就是說,即使副本已收到較新的 mysql-bin.199927 記錄檔,仍會套用較舊的 mysql-bin.199898

在這種情況下,SQL 執行緒在備援機制中會出現延遲。

您也可以連線至主要資料庫並執行下列指令:

  SHOW MASTER STATUS;

這個指令會顯示主要資料庫中正在寫入的 binlog 檔案。

如果主要資料庫的二進位記錄檔比副本中的 Master_Log_File 還新,表示 I/O 執行緒有延遲。備份資源仍會從主要資料庫讀取較舊的二進位記錄檔案。

如果 I/O 執行緒延遲,network_lag 指標也會偏高。如果 SQL 執行緒延遲,但 I/O 執行緒沒有延遲,network_lag 指標就不會太高,但 replica_lag 會偏高。

先前的指令可讓您在延遲發生時觀察延遲詳細資料,但指標 network_lagreplica_lag 可讓您查看過去發生的延遲情形。

重新建立延遲的備用資源

當複製作業落後於可接受的時間長度時,重新建立落後的備援機制。

在 Cloud SQL 中,如果複製作業延遲時間超過可接受的時間長度,且延遲時間持續至少五分鐘,您可以設定唯讀備用資源自行重建。

如果您將可接受的複寫延遲時間定義為 360 秒 (六分鐘) 以下,且至少 361 秒的複寫延遲時間持續超過五分鐘,則在五分鐘後,主要執行個體會建立自身的新快照,並使用此快照重新建立讀取/寫入複本。

重建延遲的唯讀備用資料庫有以下優點:

  • 您可以控制系統認為可接受的複製延遲範圍。
  • 您可以縮短解決複製延遲問題所需的時間,甚至可縮短數小時或數天。

適用其他功能詳細資料:

  • 相容版本:
    • MySQL 5.7
    • MySQL 8.0
    • MySQL 8.4
  • 複製延遲或延遲的接受範圍必須以秒為單位。
  • 可接受的最低值為 300 秒或 5 分鐘。
  • 可接受的最大值為 31,536,000 秒或一年。
    • 如果您為執行個體啟用重新建立落後備用資源的功能,但未設定可接受的最大複製延遲時間,Cloud SQL 會使用預設值一年。
  • 支援的執行個體類型:
    • 唯讀備用資源
    • 跨區域唯讀備用資源
    • 分層備用資源
  • replicationLagMaxSeconds 欄位的值會依複本例項而異。如果主要執行個體有多個複本執行個體,您可以為每個複本設定不同的值。
  • 重建副本時,使用者可能會在完成下列作業期間,遇到一些服務中斷時間:
    • 複製作業已停止。
    • 備份資源已刪除。
    • 建立主要執行個體的快照。
    • 系統會根據這項最新的快照重新建立複本。新的備援資源會使用與先前備援資源相同的名稱和 IP 位址。因此,MySQL 必須停止並重新啟動。
    • 新的備援資源會開始複製資料。
  • replicationLagMaxSeconds 是執行個體層級欄位。每個例項都有自己的值。
  • 如果同一個主要執行個體有多個唯讀備用資源,您可以為每個備用資源設定 replicationLagMaxSeconds 欄位的不重複值。

    為不同複本定義不同的時間門檻,有助於避免所有複本同時發生故障。

啟用重新建立延遲備援機制

重建延遲備用資源功能預設為停用。如要在建立執行個體時啟用此功能,請使用下列任一方法:

gcloud

使用 gcloud sql instances create 指令,搭配
--replication-lag-max-seconds-for-recreate 標記建立新的讀取/複寫執行個體:

gcloud beta sql instances create REPLICA_INSTANCE_NAME \
  --master-instance-name=PRIMARY_INSTANCE_NAME \
  --database-version=DATABASE_VERSION \
  --tier=TIER \
  --edition=EDITION \
  --region=REGION \
  --root-password=PASSWORD \
  --replication-lag-max-seconds-for-recreate=REPLICATION_LAG_MAX_SECONDS

其中:

  • REPLICA_INSTANCE_NAME 是複本執行個體的名稱。
  • PRIMARY_INSTANCE_NAME 是主要例項的名稱。
  • DATABASE_VERSION 是執行個體的資料庫版本。例如:MYSQL_8_0_31
  • TIER 是您要用於複本執行個體的機器類型。例如,db-perf-optimized-N-4。詳情請參閱「自訂執行個體設定」。
  • EDITION 是您要用於複本執行個體的版本。例如,ENTERPRISE_PLUS。詳情請參閱「建立執行個體」。
  • REGION 是您要用於複本執行個體的地區。例如:us-central1
  • PASSWORD 是執行個體的根密碼。
  • REPLICATION_LAG_MAX_SECONDS 是可接受的複製延遲時間上限 (以秒為單位)。例如,600。可接受的最低值為 300 秒或 5 分鐘。最大可接受值為 31,536,000 秒或一年。

REST API

replicationLagMaxSeconds 欄位位於 DatabaseInstance 資源中。將這個欄位新增至要求主體:

{
  "settings": {
  "replicationLagMaxSeconds" :REPLICATION_LAG_MAX_SECONDS,
  }
  ...
}

其中:

  • REPLICATION_LAG_MAX_SECONDS 是可接受的複製延遲時間上限 (以秒為單位)。例如:600

更新複製延遲的重新建立時間範圍

如要查看執行個體的設定,請使用「查看執行個體摘要資訊」一文所述的任何方法。

有了這項資訊,您就可以選擇是否要更新在重新建立複本之前,您指定的接受範圍內的複製延遲時間。

gcloud

使用 gcloud sql instances patch 指令,根據複製延遲時間更新重新建立執行個體的時間範圍:

gcloud beta sql instances patch INSTANCE_NAME \
  --replication-lag-max-seconds-for-recreate=REPLICATION_LAG_MAX_SECONDS

其中:

  • INSTANCE_NAME 是執行個體的名稱。
  • REPLICATION_LAG_MAX_SECONDS 是可接受的複製延遲時間上限 (以秒為單位)。例如,700。如要還原為預設值一年,請輸入 31536000。可接受的最低值為 300 秒或 5 分鐘。最大可接受值為 31,536,000 秒或一年。

REST API

您可以使用 instances.patchinstance.insert 更新政策。

如需使用 REST API 更新設定的範例,請參閱「編輯執行個體」。

限制

重建延遲的複本時,請注意下列限制:

  • replicationLagMaxSeconds 的值只能以秒為單位。
  • 在重建作業之前,在讀取用途備用資源上建立的索引不會保留。如果已建立索引,請在重新建立複本後建立次要索引。
  • 為避免唯讀備用資源經常發生停機情形,每個執行個體每天只能重新建立一次。
  • 這項功能不支援外部伺服器的備用資源。
  • 如果您在層疊備用資源上啟用落後備用資源的重建功能,Cloud SQL 會先重建葉節備用資源,以維持複製作業的一致性。
  • 重新建立跨區域備用資源會產生額外費用
  • 您無法在 Google Cloud 主控台中啟用重建延遲備用資源的功能。

後續步驟: