路由選項
從應用程式傳送要求至 Bigtable 時,您會使用應用程式設定檔,指定 Bigtable 處理要求的方式。應用程式設定檔會指定要求的轉送政策。對於使用複製功能的執行個體,轉送政策會控管哪些叢集會收到要求,以及如何處理容錯移轉。
本文說明標準應用程式設定檔可用的轉送政策。
如果您無法使用 Data Boost,路由政策對於工作負載隔離用例就特別重要。您可以搭配要求優先順序設定這些值。
路由政策不會影響複製作業,但閱讀本頁面之前,請先瞭解 Bigtable 複製功能的運作方式。您也應閱讀「容錯移轉」一文。
單一叢集轉送
單一叢集轉送政策會將所有要求轉送至執行個體中的單一叢集。如果該叢集無法使用,您必須手動容錯移轉到另一個叢集。
只有這個轉送政策可讓您啟用單一資料列交易。
複製的執行個體通常會提供最終一致性。不過,如果為工作負載設定應用程式設定檔,使用單叢集轉送將讀取和寫入要求傳送到同一叢集,您就能在複製的執行個體中,為工作負載實現讀寫一致性。您可以根據工作負載需求,將複製執行個體上其他工作負載的流量,轉送到執行個體中的其他叢集。
多叢集轉送
多叢集轉送政策會將您傳送至執行個體的要求,轉送至執行個體中叢集所在的最近區域。如果叢集無法使用,系統會自動將流量容錯移轉到最近的可用叢集。
這項設定可提供最終一致性。您無法透過多叢集轉送啟用單一資料列交易,因為使用多叢集轉送時,單一資料列交易可能會導致資料衝突。詳情請參閱「單列交易」。
如要確保高可用性,請使用多叢集轉送。如需建議的執行個體設定和更多詳細資料,請參閱「建立高可用性 (HA)」。
多叢集轉送有兩種:任何叢集和叢集群組。
任何叢集轉送
任何叢集轉送都會讓執行個體中的每個叢集都能接收要求並進行容錯移轉。
叢集群組轉送
如要從可能的容錯移轉中排除一或多個執行個體的叢集,可以使用叢集群組轉送。這種多叢集轉送方式可讓您指定應用程式設定檔可將流量傳送至的叢集子集。如果您想為個別工作負載預留叢集,這項功能就非常實用。
資料列相依性轉送
資料列親和性轉送會根據要求的資料列鍵,自動將單一資料列的讀取和寫入要求轉送至特定叢集。
如果您希望多叢集轉送能實現更高的讀寫一致性,且大部分要求都是單列作業,可以使用列關聯轉送 (黏性轉送)。如要啟用資料列相依性轉送,請使用自訂應用程式設定檔,並啟用 --row-affinity
旗標。Bigtable 會使用要求的資料列鍵,自動判斷要將要求轉送至哪個叢集。您無法手動設定資料列鍵和叢集之間的對應關係。
列親和性路由只能用於單列讀取或寫入要求。包括使用指定金鑰呼叫 ReadRows
的要求、使用指定金鑰呼叫 MutateRow
的要求、使用指定金鑰呼叫 MutateRows
的要求,以及使用指定金鑰呼叫 BulkMutateRow
的要求。
在下列情況中,使用資料列親和性路由時,無法完全達到讀寫一致性:
將叢集新增至執行個體:資料列相依性路由會根據資料列鍵,決定要將流量導向哪個叢集。如果啟用資料列親和性路由時,在執行個體中新增或移除叢集,資料列鍵指派作業可能會變更。為確保叢集容錯移轉順序維持不變,即使執行個體的叢集清單有所變更,我們建議您設定
--restrict-to
旗標,使用叢集群組。使用叢集群組時,如果應用程式設定檔正在使用執行個體中的叢集,您就無法刪除該叢集。此外,除非明確新增至應用程式設定檔的叢集群組,否則新增至執行個體的任何新叢集都不會開始接收要求。
容錯移轉:如果叢集無法使用或不健康,系統會根據容錯移轉順序,將傳送至受影響叢集的要求導向至下一個叢集。這項重新導向作業可能會影響一致性。
如要進一步瞭解容錯移轉,請參閱「容錯移轉」。如要瞭解如何完成容錯移轉,請參閱「管理容錯移轉」。
單一資料列交易
在 Bigtable 變異中,讀取、寫入和刪除要求等作業一律會在資料列層級以不可分割的方式執行。包括對單一資料列中的多個資料欄進行變異,只要這些變異包含在同一個變異作業中即可。Bigtable 不支援以原子方式更新多列的交易。
不過,Bigtable 支援某些寫入作業,這些作業在其他資料庫中需要交易。實際上,Bigtable 會使用單列交易完成這些作業。這些作業包括讀取和寫入,所有讀取和寫入作業都會以不可部分完成的方式執行,但作業仍只會在資料列層級不可部分完成:
- 讀取/修改/寫入作業,包括遞增和附加。讀取-修改-寫入作業會讀取現有值、遞增或附加至現有值,然後將更新後的值寫入資料表。
- 檢查及異動作業,也稱為有條件的變動或有條件的寫入。在檢查及變動作業中,Bigtable 會檢查資料列是否符合指定條件。如果符合條件,Bigtable 會將新值寫入資料列。
單一資料列交易間的衝突
Bigtable 執行個體中的每個叢集都是主要叢集,可接受讀取和寫入作業。因此,需要單一資料列交易的作業可能會在複製的執行個體中造成問題。
如果您的用途允許,可以使用匯總來避免這些衝突。當您對匯總欄位傳送新增要求時,新值會與現有值合併。匯總可讓您持續計算總和或計數。詳情請參閱「在寫入時匯總值」。
為說明未使用聚合函式可能導致的問題,假設您有一個資料表,用於儲存票務系統的資料。您可以使用整數計數器儲存已售出的票券數量。每次售票時,應用程式都會傳送「讀取-修改-寫入」作業,將計數器遞增 1。
如果執行個體有一個叢集,用戶端應用程式可以同時銷售票券並遞增計數器,不會遺失資料,因為要求會由該單一叢集以不可分割的方式處理,並依據接收順序執行。
另一方面,如果執行個體有多個叢集,且應用程式設定檔允許使用多叢集轉送,則遞增計數器的並行要求可能會分別傳送至不同叢集,然後複製到執行個體中的其他叢集。如果您同時傳送兩項遞增要求,且這兩項要求會分別傳送至不同叢集,則每項要求都會完成交易,但「不知道」另一項要求。每個叢集的計數器都會遞增 1。 資料複製到其他叢集時,Bigtable 無法得知您要遞增 2。
為避免非預期的結果,Bigtable 會執行下列操作:
- 要求每個應用程式設定檔指定是否允許單一資料列交易。
- 防止您在採用多叢集轉送的應用程式設定檔中啟用單一資料列交易,因為無法安全地同時啟用這兩項功能。
- 如果您在兩個以上的不同應用程式設定檔中啟用單一資料列交易,且這些設定檔使用單一叢集轉送並指向不同叢集,系統會發出警告。如果您選擇建立這類設定,請務必確保不會將衝突的讀取-修改-寫入或檢查與變動要求傳送至不同叢集。