什麼是資料庫的一致性?一致性弱意味著什麼?NoSQL 的弱一致性又為什麼是可以被接受的?
我的問題是,從直覺上來講,沒有一致性,那這個資料庫也沒有意義啊。。。
順便,有mysql經驗,如何快速熟悉nosql?
一致性就是數據保持一致,在分散式系統中,可以理解為多個節點中數據的值是一致的。而一致性又可以分為強一致性與弱一致性。強一致性可以理解為在任意時刻,所有節點中的數據是一樣的。同一時間點,你在節點A中獲取到key1的值與在節點B中獲取到key1的值應該都是一樣的。
弱一致性包含很多種不同的實現,目前分散式系統中廣泛實現的是最終一致性。
所謂最終一致性,就是不保證在任意時刻任意節點上的同一份數據都是相同的,但是隨著時間的遷移,不同節點上的同一份數據總是在向趨同的方向變化。也可以簡單的理解為在一段時間後,節點間的數據會最終達到一致狀態。對於最終一致性最好的例子就是DNS系統,由於DNS多級緩存的實現,所以修改DNS記錄後不會在全球所有DNS服務節點生效,需要等待DNS伺服器緩存過期後向源伺服器更新新的記錄才能實現。類似的,還有一些其它的弱一致性實現,下面摘自《NoSQL資料庫筆談》https://docs.google.com/View?id=dc23x53c_64db5px4f6Causal consistency(因果一致性)
如果Process A通知Process B它已經更新了數據,那麼Process B的後續讀取操作則讀取A寫入的最新值,而與A沒有因果關係的C則可以最終一致性。Read-your-writes consistency如果Process A寫入了最新的值,那麼Process A的後續操作都會讀取到最新值。但是其它用戶可能要過一會才可以看到。Session consistency此種一致性要求客戶端和存儲系統交互的整個會話階段保證Read-your-writes consistency.Hibernate的session提供的一致性保證就屬於此種一致性。Monotonic read consistency此種一致性要求如果Process A已經讀取了對象的某個值,那麼後續操作將不會讀取到更早的值。
Monotonic write consistency此種一致性保證系統會序列化執行一個Process中的所有寫操作。
關於有MySQL如何熟悉NoSQL,我只能說在與存儲設備打交道方面,很多東西是相通的。如果你對MySQL的底層機制很了解,這就很容易了。
如果你只是了解MySQL的用法或者是語法之類的,一個忠告是不要把RDBMS中的使用模式直接地硬套到NoSQL存儲上。作者的問題:我的問題是,從直覺上來講,沒有一致性,那這個資料庫也沒有意義啊
1.給出CAP理論的文章,鏈接地址:http://www.mysqlops.com/2011/03/31/nosql-cap.html
2.關於一致性,分為:強一致性、弱一致性、最終一致性,所以說一致性是肯定存在的,只是什麼程度而已;
3.資料庫的一致性肯定要分集中式資料庫 還是 分散式資料庫,若是集中式資料庫的一致性也是可以設置的,但是集中式與分散式資料庫的一致性就是天囊之別。
4.資料庫的作用主要不是為了實現一致性,而是為了資源共享,然後再引入很多新問題,比如你所提到的數據一致性,那麼就會藉助鎖等解決技巧。在我們的研究里探討了關於如何使用弱一致性,在什麼場合使用若一致性。建議看如下論文:
Making Geo-Replicated Systems Fast as Possible, Consistent when Necessary
弱一致性有兩個問題:一是容易造成副本之間的不一致,還有就是違背資料庫的完整性約束。所以我們認為只有操作在不損害這兩個原則的前提下才能使用弱一致性。如果完全不考慮資料庫的完整性約束,建議使用commutative replicated data types,這是一種新的概念,可以讓操作轉變成具有可互換性的操作。- 資料庫的一致性是指所有數據的變動都是同步的,簡單點就是現在有個值是10,然後修改為了20,如果是強一致性,後續的所有讀操作的結果都是20,如果是弱一致性,後面仍然可能讀到10的結果。
- 一致性弱意味著對某個值修改後,可能後續還會讀出來舊值。例子見上面。
- NoSQL不一定都是弱一致性的,這個和CAP原理有關:C指一致性,A指可用性,P指分區容錯性,任何分散式系統都無法滿足CAP中的三項。一般分散式系統都是選擇其中的兩個。如果某個NoSQL資料庫的設計模型選擇了CX,那她就是強一致性的。
NoSQL的弱一致性,只能用於某些一致性要求較低的場景。比如,在只讀操作中,一致性要求就不需要那麼高,遊戲中,你查看一個用戶的農場、裝備什麼的,如果你不對其進行操作,那麼延遲幾秒也沒有關係;如果你去偷菜,點擊「偷菜」的瞬間,會要求進行一致性檢查。
可以使用加鎖對NoSQL的弱一致性進行改進。
初識NoSQL,可以先從簡單的應用開始,比如先做簡單的數據緩存功能。待大致了解NoSQL後,然後進行選型,目前我們自己用的比較多的是memcached,redis,MongoDB等。看看cap理論吧,一致性弱不表示沒有一致性。
補充一下:數據的一致性應該分兩方面來看,從用戶角度和從資料庫角度。
數據一致性就是讀到最新更新的數據,比如java的volatile可以保證多線程讀取數據的強一致性,一致性分為三類:
?強一致
?當更新操作完成之後,任何多個後續進程或者線程的訪問都會返回最新的更新過的值。這種是對用戶最友好的,就是用戶上一次寫什麼,下一次就保證能讀到什麼。根據 CAP 理論,這種實現需要犧牲可用性。
?弱一致性
?系統並不保證續進程或者線程的訪問都會返回最新的更新過的值。系統在數據寫入成功之後,不承諾立即可以讀到最新寫入的值,也不會具體的承諾多久之後可以讀到。
?最終一致性
?弱一致性的特定形式。系統保證在沒有後續更新的前提下,系統最終返回上一次更新操作的值。在沒有故障發生的前提下,不一致窗口的時間主要受通信延遲,系統負載和複製副本的個數影響。DNS 是一個典型的最終一致性系統。
nosql的弱一致性為什麼能被接受?
根據CAP理論,一個分散式系統不可能滿足一致性,可用性和分區容錯性這三個需求,最多只能同時滿足兩個,而在一些場景下是接受弱一致性的,比如有一些緩存場景,即使數據更新延遲幾秒也不影響業務。
C: Consistency 數據一致更新,所有數據變動都是同步的
A: Availability 好的響應性能,穩定性
P: Tolerance of network Partition 分區容忍性(分散式)
常見的弱一致性的nosql資料庫有dunamo,cassandra等,附圖如下:
上面的寫的很好的了,跟帖一下。什麼是資料庫的一致性:數據一致性定義,看cap。說粗糙點,比如資料庫中的分散式索引,比如append了新數據,本地索引需要更新,而全局數據也需要更新,副本也需要更新,數據至少需要更新兩次,這個時候來了查詢怎麼辦?一致性弱意味著什麼:強一致性,也不是說立即更新完畢,可以是全部更新完畢後再提供查詢。弱一致性意味著不能確保任何時刻保證數據的一致性,但是犧牲了強一致性,可以提升可用性。
NoSQL 的弱一致性又為什麼是可以被接受的:應用場景不同,對一致性的要求不同,比如當前知乎評論,我寫完評論到你看到,這段時間內允許存在延遲。就是,實際已經有評論了,只是暫時你沒看到。實質上是我的評論經驗里有這條記錄,你的話題下暫時沒有這條評論。最後一答,存在爭議,用 @elgoog 的錢莊例子,更容易理解。小猿作答,歡迎拍磚。
你在某錢莊有50兩銀子,又存了100兩銀子,然後跑到另外一個地方遊山玩水,需要在當地的分庄把這100取出來,但是給分庄運錢的鏢局被人給劫了,所以當地分庄還不知道你已經存了100兩銀子進去,分庄老闆跟你說你賬戶餘額就只有50兩,哪涼快哪待著去,這時候你的同一個賬戶的餘額在不同地點就出現了不一致。
在分散式系統中,為了保證高可用性,通常給一份數據做多份副本放到不同機器上,但你沒辦法保證對所有副本同時更新,這樣就會造成不同client在讀不同副本的時候出現讀取的值不一致的情形。強一致性可以保證client讀取任何副本都得到同樣的值,弱一致性沒法做到這個保證。很多系統提供最終一致(eventual consistency)從而使得副本的值在一定的latency之後一致。強弱一致性的選擇要看應用的需求,比如銀行的系統,或者購物車需要很強的一致性,有的應用,在短時間內給用戶提供不一致的數據並不會造成太大影響,因而不需要太強的一致性。推薦閱讀:
※OnlineJudge系統的判題數據,用資料庫存、用文件存哪種比較好?
※如何理解資料庫的內部一致性和外部一致性?
※剛開始學習資料庫對資料庫概念一竅不通。?
※如何系統學習 MySQL?
※個人網站,資料庫如何設計存儲富文本文章比較好?