Apache Cassandra 與 Azure Cosmos DB for Apache Cassandra 一致性層級

適用於: Cassandra

不同於 Azure Cosmos DB,Apache Cassandra 本質上不提供精確定義的一致性保證。 相反地,Apache Cassandra 會提供寫入一致性層級和讀取一致性層級,以實現高可用性、一致性和延遲的取捨。 使用 Azure Cosmos DB for Cassandra 時:

  • Apache Cassandra 的寫入一致性層級會對應到 Azure Cosmos DB 帳戶上設定的預設一致性層級。 無法根據每個要求來變更寫入作業 (CL) 的一致性。
  • Azure Cosmos DB 會動態對應 Cassandra 用戶端驅動程式指定的讀取一致性層級。 一致性層級會對應至在讀取要求上動態設定的其中一個 Azure Cosmos DB 一致性層級。

多重區域寫入與單一區域寫入的比較

Apache Cassandra 資料庫預設為多主機系統,不提供單一區域寫入搭配多重區域複寫的現成讀取選項。 不過,Azure Cosmos DB 提供能夠選擇單一區域或多重區域寫入設定的周全功能。 能夠在多個區域之間選擇單一區域寫入設定的優點之一,就是規避跨區域衝突案例,以及在多個區域之間維護強式一致性的選項。

有了單一區域寫入,您可以維護強式一致性,同時仍然可以使用服務受控容錯移轉在區域之間維護高可用性層級。 在此設定中,您仍然可以利用資料位置,藉由根據要求降級為最終一致性,來降低讀取延遲。 除了這些功能之外,Azure Cosmos DB 平台也提供在選取區域時啟用區域備援的選項。 因此,不同於原生 Apache Cassandra,Azure Cosmos DB 可讓您更細微地瀏覽 CAP 定理的取捨頻譜

對應一致性層級

Azure Cosmos DB 平台針對複寫提供五個定義完善、以商務使用案例為導向的一致性設定。 這些一致性設定的取捨是 CAP 定理和 PACLC 定理所定義。 由於此做法與 Apache Cassandra 大相逕庭,建議您花點時間檢閱並瞭解 Azure Cosmos DB 一致性。 或者,您可以在 Azure Cosmos DB 平台中觀看這段簡短的瞭解一致性設定影片指南。 下表說明使用 Cassandra 的 API 時,Apache Cassandra 與 Azure Cosmos DB 一致性層級之間的可能對應。 此表顯示了單一區域、多重區域讀取搭配單一區域寫入以及多重區域寫入的設定。

對應

注意

這些並不是完全對應。 相反地,我們提供了 Apache Cassandra 的最接近類比,並在最右邊的資料行中釐清任何質的差異。 如前所述,建議您檢閱 Azure Cosmos DB 的一致性設定

Apache Cassandra 中的 ALLEACH_QUOROMQUOROMLOCAL_QUORUMTHREE 寫入一致性

Apache 讀取一致性 讀取來源 最接近 Apache Cassandra 讀取/寫入設定的 Azure Cosmos DB 一致性層級
ALL 本機區域 Strong
EACH_QUOROM 本機區域 Strong
QUOROM 本機區域 Strong
LOCAL_QUORUM 本機區域 Strong
LOCAL_ONE 本機區域 Eventual
ONE 本機區域 Eventual
TWO 本機區域 Strong
THREE 本機區域 Strong

不同於 Apache 和 DSE Cassandra,預設上 Azure Cosmos DB 會永久認可仲裁寫入。 四個節點中至少三個 (3/4) 會將寫入認可至磁碟,而不只是記憶體內部認可記錄。

Apache Cassandra 中的 ONELOCAL_ONE、或 ANY 寫入一致性

Apache 讀取一致性 讀取來源 最接近 Apache Cassandra 讀取/寫入設定的 Azure Cosmos DB 一致性層級
ALL 本機區域 Strong
EACH_QUOROM 本機區域 Eventual
QUOROM 本機區域 Eventual
LOCAL_QUORUM 本機區域 Eventual
LOCAL_ONE 本機區域 Eventual
ONE 本機區域 Eventual
TWO 本機區域 Eventual
THREE 本機區域 Eventual

根據預設,適用於 Cassandra 的 Azure Cosmos DB API一律會永久認可仲裁寫入,因此可以使用所有讀取一致性。

Apache Cassandra 中的 TWO 寫入一致性

Apache 讀取一致性 讀取來源 最接近 Apache Cassandra 讀取/寫入設定的 Azure Cosmos DB 一致性層級
ALL 本機區域 Strong
EACH_QUOROM 本機區域 Strong
QUOROM 本機區域 Strong
LOCAL_QUORUM 本機區域 Strong
LOCAL_ONE 本機區域 Eventual
ONE 本機區域 Eventual
TWO 本機區域 Eventual
THREE 本機區域 Strong

Azure Cosmos DB 只對兩個節點不具寫入一致性概念,因此大部分情況下,我們會將此一致性視為類似仲裁。 對於讀取一致性 TWO,此一致性相當於透過 QUOROM 寫入和從 ONE 讀取。

Apache Cassandra 中的 SerialLocal_Serial 寫入一致性

Apache 讀取一致性 讀取來源 最接近 Apache Cassandra 讀取/寫入設定的 Azure Cosmos DB 一致性層級
ALL 本機區域 Strong
EACH_QUOROM 本機區域 Strong
QUOROM 本機區域 Strong
LOCAL_QUORUM 本機區域 Strong
LOCAL_ONE 本機區域 Eventual
ONE 本機區域 Eventual
TWO 本機區域 Strong
THREE 本機區域 Strong

序列僅適用於輕量型交易。 預設上 Azure Cosmos DB 會遵循永久認可的演算法,因此 Serial 一致性類似於仲裁。

單一區域寫入的其他區域

Azure Cosmos DB 會在配置單一區域寫入的多個區域間採用五項一致性設定,包含強式一致性在內。 只要不同區域彼此距離 2,000 英里內,就會採用這些設定。

Azure Cosmos DB 沒有 Apache Cassandra 適用的對應,因為所有節點/區域都是寫入,而且無法在所有區域中提供強式一致性保證。

多重區域寫入的其他區域

Azure Cosmos DB 只會對配置多重區域寫入的多個區域採用四項一致性設定:eventualconsistent prefixsessionbounded staleness

無論設定為何,Apache Cassandra 只會對其他區域提供讀取的最終一致性。

支援的動態覆寫

Azure Cosmos DB 帳戶設定 覆寫用戶端要求中的值 覆寫效果
Strong All 無效果 (維持為 strong)
Strong Quorum 無效果 (維持為 strong)
Strong LocalQuorum 無效果 (維持為 strong)
Strong Two 無效果 (維持為 strong)
Strong Three 無效果 (維持為 strong)
Strong Serial 無效果 (維持為 strong)
Strong LocalSerial 無效果 (維持為 strong)
Strong One Eventual 的一致性變更
Strong LocalOne Eventual 的一致性變更
Strong Any 不允許 (錯誤)
Strong EachQuorum 不允許 (錯誤)
Bounded stalenesssessionconsistent prefix All 不允許 (錯誤)
Bounded stalenesssessionconsistent prefix Quorum 不允許 (錯誤)
Bounded stalenesssessionconsistent prefix LocalQuorum 不允許 (錯誤)
Bounded stalenesssessionconsistent prefix Two 不允許 (錯誤)
Bounded stalenesssessionconsistent prefix Three 不允許 (錯誤)
Bounded stalenesssessionconsistent prefix Serial 不允許 (錯誤)
Bounded stalenesssessionconsistent prefix LocalSerial 不允許 (錯誤)
Bounded stalenesssessionconsistent prefix One Eventual 的一致性變更
Bounded stalenesssessionconsistent prefix LocalOne Eventual 的一致性變更
Bounded stalenesssessionconsistent prefix Any 不允許 (錯誤)
Bounded stalenesssessionconsistent prefix EachQuorum 不允許 (錯誤)

計量

如果您的 Azure Cosmos DB 帳戶設定了強式一致性以外的一致性層級,請參閱機率限定過期 (PBS) 計量。 此計量會擷取用戶端可能為您的工作負載取得強式一致性讀取的機率。 此計量在 Azure 入口網站中公開。 如需 PBS 計量的詳細資訊,請參閱監視機率限定過期 (PBS) 計量

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

Apache Cassandra 中寫入要求的全域強式一致性

Apache Cassandra,EACH_QUORUMQUORUM 的設定可提供強式一致性。 當寫入要求傳送至區域時,EACH_QUORUM 會將資料保存在每個資料中心的仲裁節點數中。 若要持續保存,需要每個資料中心都可讓寫入作業成功。 QUORUM 的嚴格度稍低,所有資料中心內的節點 QUORUM 數都需保存資料,認可寫入才能成功。

下圖說明區域 1 和 2 之間 Apache Cassandra 中的全域強式一致性設定。 將資料寫入區域 1 之後,必須先將寫入保存在區域 1 和區域 2 的仲裁數中,應用程式才會收到通知。

Diagram of global write consistency in Apache Cassandra.

Azure Cosmos DB for Apache Cassandra 中寫入要求的全域強式一致性

在 Azure Cosmos DB 中,一致性會在帳戶層級設定。 Azure Cosmos DB for Cassandra 若設定 Strong 一致性,資料會同步複寫至帳戶的讀取區域。 區域距離 Azure Cosmos DB 帳戶越遠,一致性寫入作業延遲越高。

Diagram of global write consistency in Azure Cosmos DB for Apache Cassandra.

區域數對讀取或寫入要求有何影響:

  • 兩個區域:使用強式一致性,仲裁 (N/2 + 1) = 2。 因此,如果讀取區域關閉,帳戶就無法再接受具有強式一致性的寫入,因為要將寫入複寫的區域仲裁數無法使用。
  • 三個或多個區域:針對 N = 3quorum = 2。 如果其中一個讀取區域關閉,寫入區域仍然可以將寫入複寫到符合仲裁需求的總共兩個區域。 同樣地,有四個區域,quorum = 4/2 + 1 = 3。 即使一個讀取區域關閉,也可以達到仲裁。

注意

如果所有寫入作業都需要全域強式一致性,Azure Cosmos DB for Cassandra 帳戶一致性就必須設定為強式。 無法針對 Azure Cosmos DB 中的每個要求,將寫入作業的一致性層級覆寫為較低的一致性層級。

Apache Cassandra 中寫入要求的弱式一致性

ANYONETWOTHREELOCAL_QUORUMSerialLocal_Serial 的一致性層級? 請思考在六節點資料中心內,具有 LOCAL_QUORUM 的寫入要求,其 RF4Quorum = 4/2 + 1 = 3.

Diagram of non-global write consistency in Apache Cassandra.

Azure Cosmos DB for Apache Cassandra 中寫入要求的弱式一致性

當寫入要求以低於 Strong 的任何一致性層級傳送時,只要本機區域將寫入保存在四個複本中的至少三個上,就會傳回成功回應。

Diagram of non-global write consistency in Azure Cosmos DB for Apache Cassandra.

Apache Cassandra 中寫入要求的全域強式一致性

使用 EACH_QUORUM 一致性,您可以在 Apache Cassandra 中達成一致的讀取。 在 EACH_QUORUM 多重區域設定中,如果每個區域都沒有達到節點的仲裁數,則讀取將會失敗。

Diagram of global read consistency in Apache Cassandra.

Azure Cosmos DB for Apache Cassandra 中讀取要求的全域強式一致性

讀取要求會從指定區域中的兩個複本提供服務。 由於寫入已負責區域仲裁數的保存 (如果每個區域都可供使用則負責所有區域),因此只要從指定區域中的兩個複本讀取即可提供強式一致性。 針對 Cosmos DB 帳戶的區域發出讀取,以及將帳戶預設一致性層級設為強式一致性時,此強式一致性要求在驅動程式中指定 EACH_QUORUM

Diagram of global read consistency in Azure Cosmos DB for Apache Cassandra.

Apache Cassandra 中的本機強式一致性

具有 TWOTHREELOCAL_QUORUM 一致性層級的讀取要求,可讓我們從本機區域獲得強式一致性讀取。 若使用 LOCAL_QUORUM 一致性層級,您需要指定資料中心內兩個節點的回應,才能成功讀取。

Diagram of local strong read consistency in Apache Cassandra.

Azure Cosmos DB for Apache Cassandra 中的本機強式一致性

在 Azure Cosmos DB for Cassandra 中,使用一致性層級 TWOTHREELOCAL_QUORUM 可為讀取要求提供本機強式一致性。 由於寫入路徑保證複寫到至少四個複本中的三個,所以讀取若來自指定區域的兩個複本,就能保證該區域中資料的仲裁讀取。

Diagram of local strong read consistency in Azure Cosmos DB for Apache Cassandra.

Apache Cassandra 中的最終一致性

一致性層級 LOCAL_ONEOneANY with LOCAL_ONE 會產生最終一致性。 當焦點著重於延遲時,會使用此一致性。

Diagram of eventual read consistency in Apache Cassandra.

Azure Cosmos DB for Apache Cassandra 中的最終一致性?

一致性層級 LOCAL_ONEONEAny 可為您提供最終一致性。 使用最終一致性時,只會從指定區域中的其中一個複本提供讀取。

Diagram of eventual read consistency in Azure Cosmos DB for Apache Cassandra.

覆寫 Azure Cosmos DB for Cassandra 中讀取作業的一致性層級

先前,讀取要求的一致性層級只能覆寫為低於帳戶預設的一致性。 例如,若使用預設強式一致性,預設上會以強式發出讀取要求,並將每個要求 (如果需要) 覆寫為比強式弱的一致性層級。 不過,如果覆寫後的一致性層級高於帳戶預設值,就無法發出讀取要求。 使用最終一致性的帳戶,無法接收一致性層級高於最終一致性 (在 Apache Cassandra 驅動程式中會轉譯為 TWOTHREELOCAL_QUORUMQUORUM) 的讀取要求。

Azure Cosmos DB for Cassandra 現在可將讀取要求上的一致性覆寫為高於帳戶預設的一致性。 例如,當 Cosmos DB 帳戶的預設一致性設為最終 (Apache Cassandra 中等同於 OneANY),可以針對每個要求將讀取要求覆寫為 LOCAL_QUORUM。 此覆寫可確保在傳回結果集之前,會先查詢指定區域內的複本仲裁數,如 LOCAL_QUORUM 所要求。

當只有讀取要求需要 Eventual 時,此選項也可避免將預設一致性設為高於此設定。

下一步

深入了解 Azure Cosmos DB 的全域散發和一致性層級: