Cassandra中數據一致性指的是數據行在各個復制節點(replicas)上的更新和同步程度。通過提供tunable consistency,Cassandra擴展了eventual consistency的概念。針對任何讀或寫操作,客戶端根據對反應時間和數據准確性的要求來決定數據的一致性程度(Per-Request Consistency)。
除了tunable consistency,Cassandra也提供若干built-in repair mechanisms以確保數據在各replicas上保持一致。
• Consistency:所有節點在同一時間看到的是同樣的數據
• Availability:確保每個請求收到成功還是失敗的回應
• Partition Tolerance:系統無視偶然的消息丟失持續運行
在分布式存儲系統中,同時滿足所有的特性是不可能的,最多能達到3個中的兩個。Cassandra允許用戶來決定每個請求的CAP特性,在一致性、性能和錯誤容忍度之間做出選擇。
寫操作一致性ABOUT WRITE CONSISTENCY)
寫操作一致性決定了在向客戶端確認寫操作成功之前,多少個節點必須被成功寫入(Commitlog and Memtable)。
假設:R=Nodes Read, W=Node Written, N=Replication Factor,Q=QUORUM=N/2+1。
ANY: 至少成功寫入一個節點,即使是一個Hinted Handoff
ONE: 至少成功寫入一個復制節點(replica node)
QUORUM: 至少成功寫入Q個復制節點(Q=N/2+1)
LOCAL_QUORUM: 至少在coordinator node所在的當前DC成功寫入Q個復制節點
EACH_QUORUM: 在每個DC成功寫入Q個復制節點
ALL: 成功寫入集群中的每個復制節點
ANY提供了絕對的write availability,但是是以犧牲一致性為代價(具有最差的一致性),因為不能保證被寫入的數據什么時候才可讀(取決於replicas當機了多長時間)。ANY只能用於寫操作。寫操作被發送到任何一個節點,隨后通過hinted handoff機制被重送到目的節點。ANY適用於不想丟失寫操作、不關心數據一致性和發送延遲的數據程序。
ALL具有最強的一致性,但最低的availability。
QUORUM是一種折中,具有強的一致性,但同時也容許一定程度的失敗。例如,如果replication_factor是3,Quorum就是2(允許在一個replica上失敗)。如果replication_factor是6,Quorum就是4(允許在二個replicas上失敗)。
讀操作一致性(ABOUT READ CONSISTENCY)
讀操作一致性程度決定了在將結果返回到客戶端之前,多少個replicas必須返回結果。
除了tunable consistency,Cassandra也提供若干built-in repair mechanisms以確保數據在各replicas上保持一致。
CAP定理(THEOREM)
• Consistency:所有節點在同一時間看到的是同樣的數據
• Availability:確保每個請求收到成功還是失敗的回應
• Partition Tolerance:系統無視偶然的消息丟失持續運行
在分布式存儲系統中,同時滿足所有的特性是不可能的,最多能達到3個中的兩個。Cassandra允許用戶來決定每個請求的CAP特性,在一致性、性能和錯誤容忍度之間做出選擇。
寫操作一致性ABOUT WRITE CONSISTENCY)
寫操作一致性決定了在向客戶端確認寫操作成功之前,多少個節點必須被成功寫入(Commitlog and Memtable)。
假設:R=Nodes Read, W=Node Written, N=Replication Factor,Q=QUORUM=N/2+1。
ANY: 至少成功寫入一個節點,即使是一個Hinted Handoff
ONE: 至少成功寫入一個復制節點(replica node)
QUORUM: 至少成功寫入Q個復制節點(Q=N/2+1)
LOCAL_QUORUM: 至少在coordinator node所在的當前DC成功寫入Q個復制節點
EACH_QUORUM: 在每個DC成功寫入Q個復制節點
ALL: 成功寫入集群中的每個復制節點
ANY提供了絕對的write availability,但是是以犧牲一致性為代價(具有最差的一致性),因為不能保證被寫入的數據什么時候才可讀(取決於replicas當機了多長時間)。ANY只能用於寫操作。寫操作被發送到任何一個節點,隨后通過hinted handoff機制被重送到目的節點。ANY適用於不想丟失寫操作、不關心數據一致性和發送延遲的數據程序。
ALL具有最強的一致性,但最低的availability。
QUORUM是一種折中,具有強的一致性,但同時也容許一定程度的失敗。例如,如果replication_factor是3,Quorum就是2(允許在一個replica上失敗)。如果replication_factor是6,Quorum就是4(允許在二個replicas上失敗)。
不同於正常的Column,對Counter的寫操作需要在后台做一次讀操作以確保分布式的Counter值在各個replicas上保持一致。如果使用的是Consistency level = ONE的寫操作,則隱含的讀操作不會對寫操作造成延遲。因此,Counter通常使用consistency level是ONE.
讀操作一致性(ABOUT READ CONSISTENCY)
讀操作一致性程度決定了在將結果返回到客戶端之前,多少個replicas必須返回結果。
假設:假設:R=Nodes Read, W=Node Written, N=Replication Factor,Q=QUORUM=N/2+1。
ONE: 從最近的復制節點返回結果(由snitch決定)。默認情況下Read Repair會在后台運行使其他節點保持一致。
QUORUM: 在Q((Q=N/2+1))個復制節點返回數據后,返回具有最新時間戳的記錄給客戶端
LOCAL_QUORUM: 在coordinator node所在的當前DC的Q個復制節點返回數據后,返回具有最新時間戳的記錄給客戶端
EACH_QUORUM: 在每個DC返回Q個復制節點的數據后,返回具有最新時間戳的記錄給客戶端
ALL: 在集群中的每個復制節點返回數據后,返回具有最新時間戳的記錄給客戶端。任何一個節點失敗都會導致讀操作失敗
ONE: 從最近的復制節點返回結果(由snitch決定)。默認情況下Read Repair會在后台運行使其他節點保持一致。
QUORUM: 在Q((Q=N/2+1))個復制節點返回數據后,返回具有最新時間戳的記錄給客戶端
LOCAL_QUORUM: 在coordinator node所在的當前DC的Q個復制節點返回數據后,返回具有最新時間戳的記錄給客戶端
EACH_QUORUM: 在每個DC返回Q個復制節點的數據后,返回具有最新時間戳的記錄給客戶端
ALL: 在集群中的每個復制節點返回數據后,返回具有最新時間戳的記錄給客戶端。任何一個節點失敗都會導致讀操作失敗