簡體   English   中英

什么時候數據一致性不是問題?

[英]When is data consistency not an issue?

我是學習分布式系統的新手,我閱讀了 CAP 定理,我對 Cassandra 等 AP 系統感興趣。

我的問題是在什么情況下你可以犧牲一致性? 實際上,我所說的是犧牲一致性意味着提供不准確的數據。 在什么情況下,您實際上會使用像 Cassandra 這樣的 AP 數據存儲? 我想不出任何我不希望我的閱讀保持一致的情況。

通過 AP 系統,我假設您至少會以確保最終一致性為目標。

想象一下,您正在開發一個社交網絡,其中用戶有朋友和他們自己的新聞提要。 特定用戶的提要是否偶爾滯后五分鍾並不重要(他的提要列表最終具有一致性)。 在這種情況下,新聞提要中缺少 2/3 的最近更新是可以的,只要這些提要最終會出現。 事實上,Facebook 使用 Cassandra 構建了它的新聞提要。

想象一個分布式鍵值存儲緩存系統,其中更新非常少。 如果幾乎沒有更新操作,則無需確保強一致性,因此您可以專注於可用性。 偶爾的緩存未命中(鍵值條目尚未填充)和由於最終一致性對數據庫的請求應該沒問題。

我的問題是在什么情況下你可以犧牲一致性?

一種情況是構建推薦引擎數據集並使用 Cassandra 為其提供服務。 這些數據集本質上是許多用戶的聚合,以確定購買/查看模式。

例如:如果我將 Rey Star Wars 人偶添加到我的購物車中,基礎推薦引擎會根據其他人也購買了 Rey 人偶的人偶來運行查詢,以獲取類似的結果購買模式。 該查詢返回前 5 個產品結果,並將它們放在頁面底部。

這5件退回的產品是對之前數千次購買的分析和匯總的結果。 讓我們假設其中一些數據不一致,導致返回的 5 種產品出現差異。 這真的是一件大事嗎?

tl;博士; 要問的真正問題; 在不到 10 毫秒內獲得 5 個產品推薦的有點准確的列表,是否比在 100 毫秒內獲得 5 個產品推薦的 100% 准確列表更好?

這兩個結果集都將有助於推動銷售。 但返回速度不夠快,它不妨礙用戶體驗的一個更加優選。

CAP 中的“C”指的是線性化,這是一種非常強的一致性形式,您在大多數情況下都不需要。

線性化是一種新近度保證,它使數據看起來只有一個副本。 一旦您對數據進行了更改,所有后續讀取都將返回更改后的數據。 這種級別的一致性代價高昂,而且不能很好地擴展。 然而在某些情況下,我們需要線性化,即。

  1. 領導選舉
  2. 允許最終用戶創建他們唯一的用戶 ID
  3. 分布式鎖等

當你有這些用例時,你會使用像 ZooKeeper、etcd 等的東西。 Cassandra 也有輕量級事務 (LWT),它使用經典 Paxos 算法的擴展來實現線性化。 此功能可用於解決那些必須具有線性化和可序列化性的罕見用例,但它很昂貴。 在絕大多數情況下,稍微弱一點的一致性就可以了,以獲得更好的可擴展性和性能。 您可以用可擴展性和性能來換取一點一致性。

一些電子商務網站向客戶發送道歉信,因為他們無法完成訂單。 這是因為由於缺乏和線性化,該產品的最后一個副本已出售給多個客戶。 他們更願意處理這個問題,而不是無法與客戶群一起擴展,也無法在嚴格的 SLA 內響應他們的請求。

據說 Cassandra 具有可調整的一致性。 您可能希望記錄用戶點擊或活動以進行分析。 如果丟失了一些數據,你可以,但你不能在性能上妥協。 您可能會在啟用提示的情況下使用 ANY 的寫入一致性級別(草率的法定人數)。

如果您想要更多的一致性,您可以使用 QUORUM 一致性級別來讀取和寫入提示以及讀取修復。 在絕大多數情況下,所有節點都會立即更新。 即使一兩個節點宕機,大多數節點都會有數據,故障節點會在他們回來時使用提示、讀取修復、反熵修復進行修復。

Cassandra 對於您不會對同一數據進行多次並發更新的情況特別有用。 原因是,與 dynamo 架構不同,它不使用矢量時鍾來解決副本之間的沖突。 相反,它使用基於時間戳的 Last Write Wins (LWW)。 如果時間戳相同,則使用字典順序。 由於節點上的時間即使在存在 NTPD 的情況下也無法准確,因此存在數據丟失的可能性,盡管 Cassandra 已采取一些措施來避免這種情況 - 例如,客戶端時間戳而不是服務器端時間戳。

CAP 定理說,給定分區容忍度,您可以選擇分布式數據庫中的可用性或一致性(在任何情況下都沒有人願意放棄分區容忍度)。 因此,如果您想獲得最大的可用性,就必須放棄一致性。 這當然取決於業務的重要性。

您在 SO 上回答了一些問題,但在您訪問該頁面時沒有顯示答案? 可以忍受。 所以正在下降? 不能。 關鍵金融系統寧願具有強一致性而不是可用性。 每隔一段時間,當我嘗試付款時,我銀行的服務器就會脫機。

通常,您選擇可用性和最終一致性。 您寫到 SO 中的答案最終會出現。

除了上面提到的數據不一致的情況是可以容忍的,還有一些場景我們可以交給用戶來解決不一致的問題。

例如,如果我們在數據庫中發現某人地址的兩個不同版本,我們可以提示用戶識別正確的地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM