共用方式為


Azure Cosmos DB 中的一致性層級

適用於:NoSQL MongoDB Cassandra Gremlin 桌子

依賴複寫以取得高可用性、低延遲或兩者的分散式資料庫,必須在讀取一致性、可用性、延遲及輸送量之間進行基本權衡取捨,如 PACELC 定理 (英文) 所定義。 線性化能力或強式一致性模型是資料可程式性的黃金標準。 但由於資料必須跨很大的距離進行複寫和認可,因此寫入延遲會更高,進而導致成本遽增。 此外,強式一致性也可能會受到可用性降低 (失敗期間) 的影響,因為資料無法在每個區域中複寫和認可。 最終一致性提供更高的可用性和更佳的效能,但由於資料在所有區域之間可能不會一致,因此會更難開發應用程式。

現今市場中大多數商用分散式 NoSQL 資料庫僅提供強式一致性和最終一致性。 Azure Cosmos DB 提供五個定義完善的等級。 等級從最強到最弱分別為:

如需預設一致性層級的詳細資訊,請參閱設定預設一致性層級覆寫預設一致性層級

每個等級都有可用性和效能權衡取捨。 下圖以頻譜顯示各種不同的一致性等級。

圖表顯示以「強式」開頭的頻譜一致性,並提升至更高的可用性和輸送量,以及較低的「最終」延遲。

一致性層級與 Azure Cosmos DB API

Azure Cosmos DB 為熱門資料庫提供線路通訊協定相容 API 的原生支援。 這包括 MongoDB、Apache Cassandra、Apache Gremlin 和 Azure 資料表儲存體。 使用 Gremlin 或資料表的 API 時,會使用在 Azure Cosmos DB 帳戶上設定的預設一致性層級。 如需 Apache Cassandra 與 Azure Cosmos DB 之間一致性層級對應的詳細資料,請參閱 Cassandra 一致性對應的 API。 如需 MongoDB 與 Azure Cosmos DB 之間一致性層級對應的詳細資料,請參閱 MongoDB 一致性對應的 API

讀取一致性的範圍

讀取一致性適用於邏輯分割區內的單一讀取作業範圍。 遠端用戶端、預存程序或觸發程序可發佈讀取作業。

設定預設一致性層級

您可以隨時設定 Azure Cosmos DB 帳戶的預設一致性層級。 您帳戶中設定的預設一致性層級會套用至該帳戶中的所有 Azure Cosmos DB 資料庫和容器。 在預設情況下,對容器或資料庫發出的所有讀取和查詢都會使用指定的一致性層級。 變更帳戶層級一致性時,請務必重新部署應用程式,以及進行必要的程式碼修改並套用變更。 若要深入了解,請參閱如何設定預設一致性層級。 您也可以覆寫特定要求的預設一致性層級,若要深入了解,請參閱如何覆寫預設一致性層級一文。

提示

覆寫預設一致性層級僅適用於 SDK 用戶端內的讀取。 根據預設,針對強式一致性設定的帳戶仍會以同步方式將資料寫入和複寫至帳戶中的每個區域。 當 SDK 用戶端執行個體或要求以工作階段或較弱的一致性對此進行覆寫時,則會使用單一複本來執行讀取。 如需詳細資訊,請參閱一致性層級和輸送量

重要

變更預設一致性層級之後,必須重新建立任何 SDK 執行個體。 這可藉由重新啟動應用程式來完成。 如此可確保 SDK 使用新的預設一致性層級。

與一致性層級相關聯的保證

Azure Cosmos DB 保證讀取要求會百分之百符合所選一致性層級的一致性保證。 Azure Cosmos DB 中五個一致性層級精確定義 (使用 TLA+ 規格語言) 位於 azure-cosmos-tla GitHub 存放庫中。

下列各節將說明五個一致性層級的語意。

「強式」一致性

「強式一致性」模型可提供線性一致性保證。 線性化能力是指同時處理要求的能力。 保證讀取一定會傳回項目的最新認可版本。 用戶端將絕不會看到未認可或部分的寫入。 保證使用者一律會讀取最新認可的寫入。

下圖以音符說明強式一致性。 將資料寫入至「美國西部 2」區域之後,當您從其他區域讀取資料時,您會取得最新的值:

動畫顯示使用一律同步處理之音符的強式一致性層級。

動態仲裁

在正常情況下,針對具有強式一致性的帳戶,當所有區域都確認記錄已複寫到該記錄時,就會將寫入視為已提交。 不過,針對具有 3 個或更多區域的帳戶 (包括寫入區域),系統可以在某些區域沒有回應或回應緩慢的情況下,將區域的仲裁「降級」至全球多數。 此時,無回應區域會從仲裁區域中移除,以保留強式一致性。 這些區域只有在與其他區域一致且如預期執行後,才會重新新增。 可能從仲裁集取出的區域數目將取決於區域總數。 例如,在 3 或 4 個區域帳戶中,多數分別是 2 或 3 個區域,因此在任一情況下只能移除 1 個區域。 針對 5 個區域帳戶,多數為 3,因此最多可以移除 2 個沒有回應的區域。 這項功能稱為「動態仲裁」,可改善具有 3 個或更多區域的帳戶之寫入可用性和複寫延遲。

注意

當區域從仲裁集移除以作為動態仲裁的一部分時,直到重新加入仲裁前,這些區域將無法再提供讀取。

限定過期一致性

對於具有兩個或多個區域的單一區域寫入帳戶,資料會從主要區域複寫到所有次要 (唯讀) 區域。 對於具有兩個或多個區域的多重區域寫入帳戶,資料會從原本寫入到所有其他可寫入區域的區域複寫。 在這兩個情節中,雖然不常見,但偶爾可能會有從某個區域到另一個區域的複寫延遲。

在限定過期一致性中,任何兩個區域之間的資料延遲一律小於指定的數量。 數量可以是「K」版本 (即「更新」) 或「T」 個時間間隔 (以先達到者為準)。 換句話說,當您選擇限定過期時,任何區域中資料的最大「過期」可透過兩種方式來設定:

  • 項目的版本數 (K)
  • 讀取可能落後寫入的時間間隔 (T)

限定過時主要適用於具有兩個或多個區域的單一區域寫入帳戶。 如果區域中的資料延遲時間 (根據實體分割區決定) 超過設定的過期值,則會針對該分割進行寫入,直到過期時間回到已設定的上限內為止。

對於單一區域帳戶,限定過時提供與工作階段和最終一致性相同的寫入一致性保證。 使用限定過期時,資料會複寫到單一區域中的本地多數 (四個複本集中的三個複本)。

重要

使用限定過期一致性時,只會跨區域進行過期檢查,而不會在區域內進行。 在指定的區域內,不論一致性層級為何,資料一律會複寫到本機多數 (四個複本集中的三個複本)。

使用限定過時時,讀取會從該區域的兩個可用複本讀取,以傳回該區域中可用的最新資料。 由於區域內的寫入一律會複寫到本機多數 (四個複本中的三個),因此諮詢兩個複本會傳回該區域中可用的最新資料。

重要

使用限定過期一致性時,針對非主要區域發出的讀取不一定全域傳回最新版的資料,但保證會傳回該區域中最新版的資料,且會在全域過期限定之內。

限定過期最適合使用具有兩個或多個區域的單一區域寫入帳戶來全域散發的應用程式,其中需要跨區域幾乎強烈要求一致性。 對於具有兩個或多個區域的多重區域寫入帳戶,應用程式伺服器應該將讀取和寫入導向裝載應用程式伺服器所在的相同區域。 多寫入帳戶中的限定過期是反模式。 此層級需要區域之間的復寫延遲相依性,如果資料是從寫入所在的相同區域讀取,就不重要。

下圖以音符說明限定過期一致性。 將資料寫入至「美國西部 2」區域之後,「美國東部 2」和「澳洲東部」區域會根據設定的延隔時間上限或作業數目上限來讀取寫入的值:

動畫顯示使用最終在預先定義的延遲時間或版本內同步處理的音符,來達成限定過期一致性層級。

工作階段一致性

工作階段一致性層級中,在單一用戶端工作階段內,保證讀取會遵守讀取您的寫入和讀取後接寫入的保證。 這會保證假設單一「寫入器」工作階段或多個寫入器共用工作階段權杖。

就像所有比強弱的一致性層級一樣,寫入會復寫到本機區域中至少三個複本 (在四個複本集中),並非同步復寫至所有其他區域。

每次寫入作業之後,用戶端就會從伺服器接收更新的工作階段權杖。 用戶端會快取權杖,並將其傳送至伺服器,以便讀取指定區域中的作業。 如果發出讀取作業的複本包含指定之權杖的資料 (或較新的權杖),則會傳回要求的資料。 如果複本未包含該工作階段的資料,用戶端會針對區域中的另一個複本重試要求。 如有必要,客戶端會針對其他可用區域重試讀取,直到擷取指定工作階段權杖的資料為止。

重要

在會話一致性中,用戶端使用工作階段權杖可確保永遠不會讀取對應至較舊工作階段的資料。 不過,如果用戶端使用較舊的工作階段權杖,而且已對資料庫進行較新的更新,則會傳回較新版本的資料,儘管使用的是較舊的工作階段權杖。 工作階段權杖會作為最低版本屏障使用,但不是要從資料庫擷取之資料的特定 (可能歷程記錄) 版本。

Azure Cosmos DB 中的工作階段權杖會繫結至分割區,也就是只會與一個分割區相關聯。 為了確保可以讀取您的寫入,請使用上次為相關項目產生的工作階段權杖。

如果用戶端未起始對實體分割區的寫入,則用戶端在其快取中不包含工作階段權杖,而且該實體分割區會以最終一致性讀取的方式讀取。 同樣地,如果重新建立用戶端,也會重新建立其工作階段權杖的快取。 在這裡,讀取作業也會遵循與最終一致性相同的行為,直到後續寫入作業重建用戶端的工作階段權杖快取為止。

重要

如果工作階段權杖是從某個用戶端執行個體傳遞至另一個用戶端執行個體,則不應該修改權杖的內容。

工作階段一致性同時是單一區域及全域分散式應用程式最普遍使用的一致性層級。 其提供與最終一致性相當的寫入延遲、可用性和讀取輸送量。 工作階段一致性也會提供一致性保證,符合為了在使用者內容中操作而寫入應用程式的需求。 下圖以音符說明工作階段一致性。 「美國西部 2 寫入器」和「美國東部 2 讀取器」會使用相同的工作階段 (工作階段 A),以便同時讀取相同的資料。 雖然「澳洲東部」區域使用「工作階段 B」,但稍後會以與寫入相同的順序接收資料。

動畫顯示使用在單一用戶端工作階段內同步處理的音符,來達成工作階段一致性層級。

一致前置詞一致性

就像所有比強弱的一致性層級一樣,寫入會復寫到本機區域中至少三個複本 (在四個複本集中),並非同步復寫至所有其他區域。

在一致前置詞中,作為單一文件寫入的更新會具備最終一致性。

在交易中進行的批次更新,回傳時會與所屬的認可交易保持一致。 多個文件交易內的寫入作業一律共同顯示。

假設文件 Doc1 在交易 T1 和 T2 內,在文件 Doc1 上執行兩個寫入作業 (全部或無作業),後面接著文件 Doc2。 當用戶端在任何複本中讀取時,使用者會看到「Doc1 v1 和 Doc2 v1」或「Doc1 v2 和 Doc2 v2」,如果複寫延遲,則兩個文件都看不到,但永遠不會看到相同讀取或查詢作業的「Doc1 v1 和 Doc2 v2」或「Doc1 v2 和 Doc2 v1」。

下圖以音符說明一致前置詞一致性。 在所有區域中,讀取永遠不會看到交易寫入批次未按順序的寫入:

動畫顯示使用作為順序正確交易的最終同步處理音符來達成一致前置詞層級。

最終一致性

就像所有比強弱的一致性層級一樣,寫入會復寫到本機區域中至少三個複本 (在四個複本集中),並非同步復寫至所有其他區域。

在最終一致性中,用戶端會針對指定區域中四個複本中的任何一個發出讀取要求。 此復本可能會延遲,而且可能會傳回過期資料或沒有資料。

最終一致性是最弱式的一致性形式,因為用戶端可能會讀取到比過去讀取值還更舊的值。 最終一致性是應用程式不需要任何排序保證的理想選擇。 範例包括轉推、按讚或非對話串註解計數。 下圖以音符說明最終一致性。

動畫顯示使用最終同步處理音符來達成最終一致性層級,但不在特定限制內。

一致性保證應用

實際上,您通常可能會收到更強式的一致性保證。 讀取作業的一致性保證會對應至您所要求資料庫狀態的時效性和排序。 讀取一致性會繫結至寫入/更新作業的排序和傳播。

如果資料庫上沒有任何寫入作業,則具有最終工作階段一致前置詞一致性層級的讀取作業可能會產生與具有強式一致性層級的讀取作業相同的結果。

如果您的帳戶是使用強式一致性以外的一致性層級所設定,您可以藉由查看機率性限定過期 (PBS) 計量,來找出用戶端可能針對您的工作負載取得強式且一致性讀取的機率。 您可以藉由查看 概率限定過期 (PBS) 計量來找出此機率。 此計量會在 Azure 入口網站公開,若要深入了解,請參閱監視機率限定過期 (PBS) 計量

機率性限定過期會顯示最終一致性的最終結果。 此計量提供的見解,可讓您瞭解比起目前在 Azure Cosmos DB 帳戶上設定的一致性層級,可取得更強式一致性的頻率為何。 換句話說,您可以看到針對寫入和讀取區域的組合取得一致性讀取的機率 (以毫秒來測量)。

一致性層級和延遲

一律保證適用於所有一致性層級的讀取延遲都會在第 99 個百分位數小於 10 毫秒。 平均讀取延遲 (在第 50 個百分位數) 通常是 4 毫秒或更少。

一律保證適用於所有一致性層級的寫入延遲都會在第 99 個百分位數小於 10 毫秒。 平均寫入延遲 (在第 50 個百分位數) 通常是 5 毫秒或更少。 橫跨數個區域且設定了強式一致性的 Azure Cosmos DB 帳戶是此保證的例外狀況。

寫入延遲和強式一致性

針對使用多個區域設定強式一致性的 Azure Cosmos DB 帳戶,寫入延遲相當於任兩個最遠區域之間來回行程時間 (RTT) 的兩倍,再加上第 99 個百分位數的 10 毫秒。 區域之間的高網路 RTT 會轉譯成 Azure Cosmos DB 要求的較高延遲,因為強式一致性只會在確定已將作業認可至帳戶內的所有區域之後,才完成作業。

確切的 RTT 延遲是一個光速距離的函式和 Azure 網路拓撲。 雖然 Azure 網路不會為任兩個 Azure 區域之間的 RTT 提供任何延遲 SLA,但會發佈 Azure 網路來回行程延遲統計資料。 您 Azure Cosmos DB 帳戶的複寫延遲會顯示在 Azure 入口網站中。 您可以使用 Azure 入口網站,移至計量區段,然後選取一致性選項。 使用 Azure 入口網站,您可以監視與您 Azure Cosmos DB 帳戶相關聯的各個區域之間的複寫延遲。

重要

具有橫跨 5000 英哩 (8000 公里) 以上區域的帳戶由於高寫入延遲,因此預設會封鎖其強式一致性。 若要啟用這項功能,請連絡支援人員。

一致性層級和輸送量

  • 針對強式和限定過期,會對四個複本集中的兩個複本進行讀取 (少數仲裁) 來提供一致性保證。 工作階段、一致前置詞和最終則會進行單一複本讀取。 結果是,針對相同數量的要求單位,強式和限定過期的讀取輸送量是其他一致性層級的一半。

  • 針對指定類型的寫入作業 (例如,插入、取代、更新插入和刪除),對於要求單位的寫入輸送量會與所有一致性層級完全相同。 針對強式一致性,必須認可每個區域中的變更 (全域多數),至於其他所有一致性層級,則會使用本機多數 (四個複本集中的三個複本)。

一致性層級 仲裁讀取 仲裁寫入
強式 本機少數 全域多數
限定過期 本機少數 本機多數
工作階段 單一複本 (使用工作階段權杖) 本機多數
一致前置詞 單一複本 本機多數
最終 單一複本 本機多數

注意

本機少數讀取的讀取 RU/秒成本是較弱式一致性層級的兩倍,因為讀取是從兩個複本進行,以提供強式和限定的過期一致性層級保證。

一致性層級和資料持久性

在全域分散式資料庫環境內,當發生全區域中斷情況時,一致性層級與資料持久性之間具有直接關聯性。 當您開發商務持續性方案時,您必須了解在干擾性事件之後復原時,應用程式可忍受遺失的最近資料更新最大期間。 您可能經得起遺失的更新時間週期,也稱為復原點目標 (RPO)。

此資料表定義發生全區域中斷情況時,一致性模型與資料持久性之間的關聯性。

區域 複寫模式 一致性層級 復原點目標 (RPO)
1 單一或多個寫入區域 任何一致性層級 < 240 分鐘
>1 單一寫入區域 工作階段、開頭一致、最終 < 15 分鐘
>1 單一寫入區域 限定過期 K & T
>1 單一寫入區域 強式 0
>1 多重寫入區域 工作階段、開頭一致、最終 < 15 分鐘
>1 多重寫入區域 限定過期 K & T

K = 項目的版本數目K (也就是更新次數)。

T = 自上次更新後的時間間隔 "T"

針對單一區域帳戶,KT 的最小值為 10 個寫入作業或 5 秒。 針對多區域帳戶,KT 的最小值為 100,000 個寫入作業或 300 秒。 此值會定義使用限定過期時資料的最小 RPO。

強式一致性和多個寫入區域

使用多個寫入區域設定的 Azure Cosmos DB 帳戶無法設定為強式一致性,因為分散式系統無法提供零的 RPO 和零的 RTO。 此外,對多個寫入區域使用強式一致性並沒有任何寫入延遲優勢,因為必須將對任何區域的寫入覆寫和認可至帳戶內所有設定的區域。 此案例會產生與單一寫入區域帳戶相同的寫入延遲。

閱讀更多內容

若要深入了解一致性的概念,請閱讀下列文章: