Azure Cosmos DB 中的一致性層級

適用於:NoSQL MongoDB Cassandra Gremlin

依賴複寫來取得高可用性、低延遲或兩者之分散式資料庫,必須在 PACELC 定理所 定義的讀取一致性、可用性、延遲和輸送量之間做出基本取捨。 強式一致性模型的線性化是數據可程式設計的黃金標準。 但是,由於數據必須跨大距離復寫和認可,因此它增加了較高寫入延遲的大幅價格。 強式一致性也可能因為數據無法在每個區域中複寫和認可而降低可用性(在失敗期間)。 最終一致性可提供更高的可用性和更佳的效能,但較難對應用程式進行程式設計,因為數據可能無法在所有區域中保持一致。

目前市場上可用的大部分商業可用的分散式 NoSQL 資料庫僅提供強大且最終的一致性。 Azure Cosmos DB 提供五個定義完善的等級。 等級從最強到最弱分別為:

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

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

Diagram of consistency as a spectrum starting with Strong and going to higher availability & throughput along with lower latency with Eventual.

一致性層級和 Azure Cosmos DB API

Azure Cosmos DB 為熱門資料庫提供線路通訊協定相容 API 的原生支援。 其中包括 MongoDB、Apache Cassandra、Apache Gremlin 和 Azure 數據表 儲存體。 在適用於 Gremlin 或 Table 的 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」區域之後,當您從其他區域讀取數據時,您會收到最新的值:

Animation of strong consistency level using musical notes that are always synced.

限定過期一致性

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

在限定過期一致性中,任何兩個區域之間的數據延遲一律小於指定的數量。 數量可以是專案或 「T」 時間間隔的 「K」 版本(也就是「更新」,依第一次到達。 換句話說,當您選擇限定過期時,任何區域中數據的最大「過期」可以透過兩種方式進行設定:

  • 專案版本數 (K
  • 時間間隔 (T) 讀取可能會落後寫入

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

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

重要

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

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

重要

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

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

下圖說明與音符的限定過期一致性。 將數據寫入「美國西部 2」區域之後,「美國東部 2」和「澳大利亞東部」區域會根據設定的最大延遲時間或最大作業來讀取寫入的值:

Animation of bounded staleness consistency level using music notes that are eventually synced within a pre-defined delay of time or versions.

工作階段一致性

在會話一致性中,在單一用戶端會話內,保證讀取會接受讀取-your-writes,以及 write-follows-reads 保證。 此保證假設單一「寫入器」工作階段,或共用多個寫入器的會話令牌。

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

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

重要

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

Azure Cosmos DB 中的會話令牌是分割區系結的,這表示它們與一個分割區完全相關聯。 為了確保您可以讀取寫入,請使用上次針對相關項目產生的會話令牌。

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

重要

如果會話令牌是從某個用戶端實例傳遞至另一個用戶端實例,則不應該修改令牌的內容。

會話一致性是單一區域和全域分散式應用程式最廣泛使用的一致性層級。 其提供與最終一致性相當的寫入延遲、可用性和讀取輸送量。 會話一致性也提供一致性保證,以符合寫入以在用戶內容中操作的應用程式需求。 下圖說明與音樂筆記的會話一致性。 「美國西部 2 寫入器」和「美國東部 2 讀取器」會使用相同的會話(會話 A),讓兩者同時讀取相同的數據。 雖然「澳大利亞東部」區域使用「會話 B」,所以稍後會接收數據,但順序與寫入相同。

Animation of session consistency level using music notes that are synced within a single client session.

一致前置詞一致性

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

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

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

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

下圖說明與音樂筆記的一致性前置詞一致性。 在所有區域中,讀取永遠不會看到交易式寫入批次的排序寫入:

Animation of consistent prefix level using music notes that are synced eventually but as a transaction that isn't out of order.

最終一致性

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

在 [最終一致性] 中,用戶端會針對指定區域中四個複本中的任何一個發出讀取要求。 此復本可能會落後,而且可能會傳回過時或沒有數據。

最終一致性是最弱的一致性形式,因為用戶端可能會讀取比過去讀取的值還舊的值。 最終一致性是應用程式不需要任何排序保證的理想選擇。 範例包括 Retweets、Likes 或非線程批注計數。 下圖說明與音符的最終一致性。

Animation of eventual consistency level using music notes that are eventually synced, but not within a specific bound.

一致性保證應用

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

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

如果您的帳戶設定為強式一致性以外的一致性層級,您可以找出您的用戶端可能會為您的工作負載取得強式且一致的讀取機率。 您可以藉由查看 概率限定過期 (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 公里)之區域之帳戶的強式一致性,因為寫入延遲很高。 若要啟用此功能,請連絡支持人員。

一致性層級和輸送量

  • 針對強式和限定過期,讀取會針對四個副本集中的兩個複本進行,以提供一致性保證。 會話、一致前置詞和最終會讀取單一複本。 結果是,針對相同數目的要求單位,強式和限定過期的讀取輸送量是其他一致性層級的一半。

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

一致性層級 仲裁讀取 仲裁寫入
強式 當地少數民族 全球多數
限定過期 當地少數民族 本機多數
工作階段 單一複本 (使用工作階段令牌 ) 本機多數
一致前置詞 單一複本 本機多數
最終 單一複本 本機多數

注意

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

注意

相較於其他寬鬆的一致性層級,強式和限定過期一致性層級讀取的 RU 效能成本會耗用大約兩倍的 RU,同時執行讀取作業。

一致性層級和數據持久性

在全域分散式資料庫環境中,在全區域中斷的情況下,一致性層級和數據持久性之間有直接關聯性。 當您開發商務持續性計劃時,您必須瞭解應用程式可容許在干擾性事件之後復原時遺失的最新數據更新期間上限。 您可能負擔遺失的更新期間稱為 恢復點目標RPO)。

此數據表會定義一致性模型與數據持久性之間的關聯性,以在發生整個區域中斷的情況下。

Region(s) 複寫模式 一致性層級 復原點目標 (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。 此外,使用強式一致性與多個寫入區域沒有寫入延遲的優點,因為必須復寫至任何區域的寫入,並認可至帳戶內的所有已設定區域。 此案例會產生與單一寫入區域帳戶相同的寫入延遲。

閱讀更多內容

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

下一步

若要深入瞭解 Azure Cosmos DB 中的一致性層級,請閱讀下列文章: