本頁面說明如何使用 Spanner 讀取租約。讀取租約可協助資料庫減少非領導者區域的讀取延遲,以處理需要強烈一致性的交易。
根據預設,當 Spanner 在非主要區域收到強式讀取要求時,執行讀取作業的備用資源會與執行個體的主要讀寫區域聯絡。這個聯絡人會先確認資料是否為最新狀態,再處理要求。這個程序會在接收要求的區域和領導者區域之間,產生網路來回行程。與單一區域內的通訊不同,區域之間的地理距離會增加要求延遲時間。
使用 Spanner 讀取租約可免除這項往返行程。為資料庫設定一或多個讀取租約區域後,Spanner 會將在本機提供讀取服務的權限,授予一或多個非領導者、可讀寫或唯讀區域。這樣一來,非主要區域就能直接提供強讀取作業,不必與主要區域通訊。從較靠近用戶端的非主要地區提供強式讀取,可減少跨地區的延遲時間。在雙區域或多區域執行個體中,這可實現強讀取作業的區域內延遲。
在區域啟用或停用讀取租約功能時,不需要停機。不過,使用這項功能時,寫入作業的延遲時間會較長,因為啟用讀取租約時,主要節點必須在提供寫入作業時聯絡讀取租約區域。副作用是寫入作業會持有鎖定時間較長,這可能會影響高爭用寫入工作負載。詳情請參閱「何時使用讀取租約」。讀取租約最適合應用程式,這類應用程式願意以寫入延遲時間增加為代價,換取更快速的強讀取作業。舉例來說,存取控制系統的讀取作業頻繁,但寫入作業很少。
如要瞭解如何在非領導者區域啟用讀取租約,請參閱「使用讀取租約」。
使用讀取租約的時機
如果應用程式和工作負載符合下列條件,請啟用讀取租約:
- 相較於寫入作業的低延遲時間,強讀取作業的低延遲時間更重要。
- 您的工作負載可容許較長的寫入鎖定時間,或寫入爭用較少。
啟用讀取租約會增加寫入延遲時間,導致寫入鎖定時間延長。如果寫入工作負載的寫入爭用情況嚴重,這項功能可能會導致寫入延遲時間變長,並降低處理量。
如果同時進行寫入作業,使用查詢 API 或讀取 API 會影響使用讀取租用區域的資料庫效能。
在 Spanner 中執行 SQL 陳述式時,會從多個資料列或範圍讀取資料。啟用讀取租約後,使用查詢 API 時,讀取作業必須等待並行寫入作業完成,才能確保正確性。因此,您可能會發現延遲時間變長,特別是寫入負載較高時。一般而言,讀取 API 比查詢 API 更能容忍並行寫入。如果經常使用查詢 API 且寫入負載高,請考慮降低寫入頻率,或改用過時讀取。
讀取 API 經過最佳化調整,適合讀取特定資料列或資料範圍。他們只需要等待修改所要讀取確切資料的寫入作業。如果您使用讀取 API,只有對完全相同資料範圍的寫入作業會封鎖讀取作業。因此,當有並行寫入作業,且您使用讀取租約區域時,Spanner 強制讀取作業的效能會更好,延遲時間也會較短。
如要進一步瞭解如何監控延遲時間,請參閱「監控」。
用途範例
假設某個應用程式部署在全球各地,在美國執行寫入作業,且在美國、歐洲和亞洲都有用戶端。您可以設定多區域 Spanner 執行個體,例如 nam-eur-asia1
,其中主要區域位於 us-central1
,唯讀副本位於 europe-west1
和 asia-east1
。
在 europe-west1
和 asia-east1
唯讀區域啟用讀取租約後,Spanner 會從這些本機副本提供歐洲和亞洲的強讀取作業,進而縮短延遲時間。但所有寫入作業的延遲時間都會增加。延遲時間增加的幅度,相當於主要 us-central1
地區與最遠的讀取租約地區之間的往返時間。
限制
Spanner 讀取租約有下列限制:
- 您無法在見證區域啟用讀取租約。
- 您無法將讀取租約與地理分區搭配使用。
- 讀取租約不會減少讀寫交易中讀取作業的延遲時間。即使讀寫交易只包含讀取作業,這些作業仍會由主要地區提供。
- 如果將執行個體移至其他執行個體設定,系統不會保留讀取租約設定。遷移完成後,您必須重新啟用資料庫的讀取租約。
使用讀取租約
您必須先啟用讀取租約,才能使用這項功能。
使用 IAM 控管存取權
如要設定讀取租約區域,使用者必須具備 spanner.databases.create
或 spanner.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
(GoogleSQL、
PostgreSQL)
DDL 陳述式中設定 read_lease_regions
選項:
主控台
前往 Google Cloud 控制台的「Instances」(執行個體) 頁面。
選取要啟用讀取租約的執行個體。
在開啟的「Instance overview」(執行個體總覽) 頁面中,按一下「Create database」(建立資料庫)。
輸入資料庫名稱。
選取資料庫方言。
點選「建立」。
Google Cloud 控制台會顯示您建立的資料庫「總覽」頁面。
在導覽選單中,按一下「Spanner Studio」。
在「Spanner Studio」頁面中,按一下
「New tab」(新分頁),或使用空白的編輯器分頁。輸入下列
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
。您可以為多個區域啟用讀取租約。並以半形逗號區隔每個區域。
按一下「執行」。
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
(GoogleSQL、PostgreSQL) DDL 陳述式中設定 read_lease_regions
選項:
主控台
前往 Google Cloud 控制台的「Instances」(執行個體) 頁面。
選取要啟用讀取租約的執行個體。
選取要啟用讀取租約的資料庫。
在導覽選單中,按一下「Spanner Studio」。
在「Spanner Studio」頁面中,按一下
「新增分頁」,或使用空白的編輯器分頁。輸入下列
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
。您可以為多個區域啟用讀取租約。並以半形逗號區隔每個區域。
按一下「執行」。
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
(GoogleSQL、
PostgreSQL)
DDL 陳述式中,將 read_lease_regions
選項設為 NULL
:
主控台
前往 Google Cloud 控制台的「Instances」(執行個體) 頁面。
選取要停用讀取租約的執行個體。
選取要停用讀取租約的資料庫。
在導覽選單中,按一下「Spanner Studio」。
在「Spanner Studio」頁面中,按一下
「新增分頁」,或使用空白的編輯器分頁。輸入下列
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。
按一下「執行」。
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
資訊結構定義資料表 (GoogleSQL、PostgreSQL) 或資料庫,找出主導區域和啟用讀取租約的區域。啟用讀取租約的區域會預期強讀取具有區域內延遲。同時,主要地區與啟用讀取租約的最遠地區之間的寫入延遲時間會增加。
您也可以使用下列 Spanner 延遲時間指標,監控執行個體中的讀取要求延遲時間:
spanner.googleapis.com/api/read_request_latencies_by_serving_location
您可以使用 /serving_location
欄位篩選這個指標。「/serving location
」欄位會指出要求服務的 Spanner 伺服器位置。
如需可用指標的完整清單,請參閱 Spanner 的指標清單。
費用注意事項
如果地區啟用讀取租約功能,則從該地區提供強讀取時,使用的運算資源會稍微減少。另一方面,啟用讀取租約功能的資料庫寫入作業會使用稍微多一點的運算資源。詳情請參閱「Spanner 計算容量定價」。
這項功能不會影響其他價格元件,例如儲存空間和網路。
後續步驟
- 進一步瞭解 Spanner 複製功能。
- 進一步瞭解交易以外的讀取作業。