讀取租約

本頁面說明如何使用 Spanner 讀取租約。讀取租約可協助資料庫減少非領導者區域的讀取延遲,以處理需要強烈一致性的交易。

根據預設,當 Spanner 在非主要區域收到強式讀取要求時,執行讀取作業的備用資源會與執行個體的主要讀寫區域聯絡。這個聯絡人會先確認資料是否為最新狀態,再處理要求。這個程序會在接收要求的區域和領導者區域之間,產生網路來回行程。與單一區域內的通訊不同,區域之間的地理距離會增加要求延遲時間。

使用 Spanner 讀取租約可免除這項往返行程。為資料庫設定一或多個讀取租約區域後,Spanner 會將在本機提供讀取服務的權限,授予一或多個非領導者、可讀寫或唯讀區域。這樣一來,非主要區域就能直接提供強讀取作業,不必與主要區域通訊。從較靠近用戶端的非主要地區提供強式讀取,可減少跨地區的延遲時間。在雙區域或多區域執行個體中,這可實現強讀取作業的區域內延遲。

在區域啟用或停用讀取租約功能時,不需要停機。不過,使用這項功能時,寫入作業的延遲時間會較長,因為啟用讀取租約時,主要節點必須在提供寫入作業時聯絡讀取租約區域。副作用是寫入作業會持有鎖定時間較長,這可能會影響高爭用寫入工作負載。詳情請參閱「何時使用讀取租約」。讀取租約最適合應用程式,這類應用程式願意以寫入延遲時間增加為代價,換取更快速的強讀取作業。舉例來說,存取控制系統的讀取作業頻繁,但寫入作業很少。

如要瞭解如何在非領導者區域啟用讀取租約,請參閱「使用讀取租約」。

使用讀取租約的時機

如果應用程式和工作負載符合下列條件,請啟用讀取租約:

  • 相較於寫入作業的低延遲時間,強讀取作業的低延遲時間更重要。
  • 您的工作負載可容許較長的寫入鎖定時間,或寫入爭用較少。

啟用讀取租約會增加寫入延遲時間,導致寫入鎖定時間延長。如果寫入工作負載的寫入爭用情況嚴重,這項功能可能會導致寫入延遲時間變長,並降低處理量。

如果同時進行寫入作業,使用查詢 API讀取 API 會影響使用讀取租用區域的資料庫效能。

在 Spanner 中執行 SQL 陳述式時,會從多個資料列或範圍讀取資料。啟用讀取租約後,使用查詢 API 時,讀取作業必須等待並行寫入作業完成,才能確保正確性。因此,您可能會發現延遲時間變長,特別是寫入負載較高時。一般而言,讀取 API 比查詢 API 更能容忍並行寫入。如果經常使用查詢 API 且寫入負載高,請考慮降低寫入頻率,或改用過時讀取

讀取 API 經過最佳化調整,適合讀取特定資料列或資料範圍。他們只需要等待修改所要讀取確切資料的寫入作業。如果您使用讀取 API,只有對完全相同資料範圍的寫入作業會封鎖讀取作業。因此,當有並行寫入作業,且您使用讀取租約區域時,Spanner 強制讀取作業的效能會更好,延遲時間也會較短。

如要進一步瞭解如何監控延遲時間,請參閱「監控」。

用途範例

假設某個應用程式部署在全球各地,在美國執行寫入作業,且在美國、歐洲和亞洲都有用戶端。您可以設定多區域 Spanner 執行個體,例如 nam-eur-asia1,其中主要區域位於 us-central1,唯讀副本位於 europe-west1asia-east1

europe-west1asia-east1 唯讀區域啟用讀取租約後,Spanner 會從這些本機副本提供歐洲和亞洲的強讀取作業,進而縮短延遲時間。但所有寫入作業的延遲時間都會增加。延遲時間增加的幅度,相當於主要 us-central1 地區與最遠的讀取租約地區之間的往返時間。

限制

Spanner 讀取租約有下列限制:

  • 您無法在見證區域啟用讀取租約。
  • 您無法將讀取租約與地理分區搭配使用。
  • 讀取租約不會減少讀寫交易中讀取作業的延遲時間。即使讀寫交易只包含讀取作業,這些作業仍會由主要地區提供。
  • 如果將執行個體移至其他執行個體設定,系統不會保留讀取租約設定。遷移完成後,您必須重新啟用資料庫的讀取租約。

使用讀取租約

您必須先啟用讀取租約,才能使用這項功能。

使用 IAM 控管存取權

如要設定讀取租約區域,使用者必須具備 spanner.databases.createspanner.databases.updateDdl IAM 權限。預先定義的資料庫管理員角色 (roles/spanner.databaseAdmin) 包含這些權限。詳情請參閱 Spanner 的 IAM 總覽

如要瞭解如何授予權限,請參閱套用 IAM 權限

PostgreSQL 資料庫使用者事前準備

如要在 PostgreSQL 資料庫中使用讀取租約,請對資料庫進行下列其中一項設定變更。否則,即使您已設定讀取租約區域,系統仍會由主要區域提供讀取服務。

  • 如果您只使用唯讀交易,請設定 PostgreSQL 連線,將資料庫中每項新交易的預設狀態設為唯讀。如要這麼做,請將 default_transaction_read_only 選項設為 true

    postgres://USER_ID:PASSWORD@localhost:5432/DATABASE_ID?sslmode=disable&options=-c \
      default_transaction_read_only=true
    host=/tmp port=5432 database=DATABASE_ID \
      options='-c default_transaction_read_only=true'
    

    更改下列內容:

    • USER_ID,並提供使用者的專屬 ID。

    • PASSWORD 密碼。

    • DATABASE_ID 替換為資料庫的專屬 ID。

啟用讀取租約

如要在建立新資料庫時啟用讀取租約,請在 ALTER DATABASE (GoogleSQLPostgreSQL) DDL 陳述式中設定 read_lease_regions 選項:

主控台

  1. 前往 Google Cloud 控制台的「Instances」(執行個體) 頁面。

    執行個體

  2. 選取要啟用讀取租約的執行個體。

  3. 在開啟的「Instance overview」(執行個體總覽) 頁面中,按一下「Create database」(建立資料庫)

  4. 輸入資料庫名稱。

  5. 選取資料庫方言。

  6. 點選「建立」

    Google Cloud 控制台會顯示您建立的資料庫「總覽」頁面。

  7. 在導覽選單中,按一下「Spanner Studio」

  8. 在「Spanner Studio」頁面中,按一下 「New tab」(新分頁),或使用空白的編輯器分頁。

  9. 輸入下列 ALTER DATABASE DDL 陳述式。

    GoogleSQL

    ALTER DATABASE DATABASE_ID
    SET OPTIONS (read_lease_regions = 'READ_LEASE_REGION');
    

    更改下列內容:

    • DATABASE_ID 替換為資料庫的專屬 ID。

    • READ_LEASE_REGION 則替換為您要啟用讀取租約的地區。例如,europe-west1。您可以為多個區域啟用讀取租約。並以半形逗號區隔每個區域。

    PostgreSQL

    ALTER DATABASE DATABASE_ID
    SET "spanner.read_lease_regions" = 'READ_LEASE_REGION';
    

    更改下列內容:

    • DATABASE_ID 替換為資料庫的專屬 ID。

    • READ_LEASE_REGION 則替換為您要啟用讀取租約的地區。例如,europe-west1。您可以為多個區域啟用讀取租約。並以半形逗號區隔每個區域。

  10. 按一下「執行」

gcloud

如要在建立資料庫時設定 read_lease_regions 資料庫選項,請使用 gcloud spanner databases create

GoogleSQL

gcloud spanner databases create DATABASE_ID \
  --instance=INSTANCE_ID \
  --ddl="ALTER DATABASE DATABASE_ID SET OPTIONS (read_lease_regions = 'READ_LEASE_REGION');"

更改下列內容:

  • DATABASE_ID:Spanner 資料庫的永久 ID。
  • INSTANCE_ID:Spanner 執行個體的永久 ID。
  • READ_LEASE_REGION:要啟用讀取租約的區域。例如,europe-west1。您可以為多個區域啟用讀取租約。並以半形逗號區隔每個區域。

PostgreSQL

gcloud spanner databases create DATABASE_ID \
  --instance=INSTANCE_ID \
  --ddl="ALTER DATABASE DATABASE_ID \
    SET "spanner.read_lease_regions" = 'READ_LEASE_REGION';"

更改下列內容:

  • DATABASE_ID:Spanner 資料庫的永久 ID。
  • INSTANCE_ID:Spanner 執行個體的永久 ID。
  • READ_LEASE_REGION:要啟用讀取租約的區域。例如,europe-west1。您可以為多個區域啟用讀取租約。並以半形逗號區隔每個區域。

如要在更新現有資料庫時啟用讀取租約,請在 ALTER DATABASE (GoogleSQLPostgreSQL) DDL 陳述式中設定 read_lease_regions 選項:

主控台

  1. 前往 Google Cloud 控制台的「Instances」(執行個體) 頁面。

    執行個體

  2. 選取要啟用讀取租約的執行個體。

  3. 選取要啟用讀取租約的資料庫。

  4. 在導覽選單中,按一下「Spanner Studio」

  5. 在「Spanner Studio」頁面中,按一下 「新增分頁」,或使用空白的編輯器分頁。

  6. 輸入下列 ALTER DATABASE DDL 陳述式。

    GoogleSQL

    ALTER DATABASE DATABASE_ID \
    SET OPTIONS (read_lease_regions = 'READ_LEASE_REGION');
    

    更改下列內容:

    • DATABASE_ID 替換為資料庫的專屬 ID。

    • READ_LEASE_REGION 則替換為您要啟用讀取租約的地區。例如,europe-west1。您可以為多個區域啟用讀取租約。並以半形逗號區隔每個區域。

    PostgreSQL

    ALTER DATABASE DATABASE_ID \
    SET "spanner.read_lease_regions" = 'READ_LEASE_REGION';
    

    更改下列內容:

    • DATABASE_ID 替換為資料庫的專屬 ID。

    • READ_LEASE_REGION 則替換為您要啟用讀取租約的地區。例如,europe-west1。您可以為多個區域啟用讀取租約。並以半形逗號區隔每個區域。

  7. 按一下「執行」

gcloud

如要設定 read_lease_regions 資料庫選項,請使用 gcloud spanner databases ddl update

GoogleSQL

gcloud spanner databases ddl update DATABASE_ID \
  --instance=INSTANCE_ID \
  --ddl="ALTER DATABASE DATABASE_ID \
    SET OPTIONS (read_lease_regions = 'READ_LEASE_REGION');"

更改下列內容:

  • DATABASE_ID:Spanner 資料庫的永久 ID。
  • INSTANCE_ID:Spanner 執行個體的永久 ID。
  • READ_LEASE_REGION 則替換為您要啟用讀取租約的地區。例如,europe-west1。您可以為多個區域啟用讀取租約。並以半形逗號區隔每個區域。

PostgreSQL

gcloud spanner databases ddl update DATABASE_ID \
  --instance=INSTANCE_ID \
  --ddl="ALTER DATABASE DATABASE_ID \
    SET "spanner.read_lease_regions" = 'READ_LEASE_REGION';"

更改下列內容:

  • DATABASE_ID:Spanner 資料庫的永久 ID。
  • INSTANCE_ID:Spanner 執行個體的永久 ID。
  • READ_LEASE_REGION 則替換為您要啟用讀取租約的地區。例如,europe-west1。您可以為多個區域啟用讀取租約。並以半形逗號區隔每個區域。

停用讀取租約

讀取租約預設為停用。

如要更新及停用現有資料庫的這項功能,請在 ALTER DATABASE (GoogleSQLPostgreSQL) DDL 陳述式中,將 read_lease_regions 選項設為 NULL

主控台

  1. 前往 Google Cloud 控制台的「Instances」(執行個體) 頁面。

    執行個體

  2. 選取要停用讀取租約的執行個體。

  3. 選取要停用讀取租約的資料庫。

  4. 在導覽選單中,按一下「Spanner Studio」

  5. 在「Spanner Studio」頁面中,按一下 「新增分頁」,或使用空白的編輯器分頁。

  6. 輸入下列 ALTER DATABASE DDL 陳述式。

    GoogleSQL

    ALTER DATABASE DATABASE_ID SET OPTIONS (read_lease_regions = NULL);
    

    DATABASE_ID 替換為資料庫的專屬 ID。

    PostgreSQL

    ALTER DATABASE DATABASE_ID SET "spanner.read_lease_regions" = NULL;
    

    DATABASE_ID 替換為資料庫的專屬 ID。

  7. 按一下「執行」

gcloud

如要設定 read_lease_regions 資料庫選項,請使用 gcloud spanner databases ddl update

GoogleSQL

gcloud spanner databases ddl update DATABASE_ID \
  --instance=INSTANCE_ID \
  --ddl="ALTER DATABASE DATABASE_ID SET OPTIONS (read_lease_regions = NULL);"

更改下列內容:

  • DATABASE_ID:Spanner 資料庫的永久 ID。
  • INSTANCE_ID:Spanner 執行個體的永久 ID。

PostgreSQL

gcloud spanner databases ddl update DATABASE_ID \
  --instance=INSTANCE_ID \
  --ddl="ALTER DATABASE DATABASE_ID SET "spanner.read_lease_regions" = NULL;"

更改下列內容:

  • DATABASE_ID:Spanner 資料庫的永久 ID。
  • INSTANCE_ID:Spanner 執行個體的永久 ID。

最佳做法

如要充分發揮這項功能的優勢,請使用多工工作階段,在單一工作階段中建立大量並行要求。

監控

啟用讀取租約後,請務必監控延遲時間,確認這項功能達到預期效果。如要這麼做,請查詢 data_options 資訊結構定義資料表 (GoogleSQLPostgreSQL) 或資料庫,找出主導區域和啟用讀取租約的區域。啟用讀取租約的區域會預期強讀取具有區域內延遲。同時,主要地區與啟用讀取租約的最遠地區之間的寫入延遲時間會增加。

您也可以使用下列 Spanner 延遲時間指標,監控執行個體中的讀取要求延遲時間:

  • spanner.googleapis.com/api/read_request_latencies_by_serving_location

您可以使用 /serving_location 欄位篩選這個指標。「/serving location」欄位會指出要求服務的 Spanner 伺服器位置。

如需可用指標的完整清單,請參閱 Spanner 的指標清單

費用注意事項

如果地區啟用讀取租約功能,則從該地區提供強讀取時,使用的運算資源會稍微減少。另一方面,啟用讀取租約功能的資料庫寫入作業會使用稍微多一點的運算資源。詳情請參閱「Spanner 計算容量定價」。

這項功能不會影響其他價格元件,例如儲存空間和網路。

後續步驟