避免咱們不是在製造永動機,在分佈式系統設計前,幾個理論必須瞭解。CAP、BASE、ACID、一致性以及五分鐘理論。html
C: Consistency 一致性數據庫
A: Availability 可用性(指的是快速獲取數據)緩存
P: Tolerance of network Partition 分區容忍性(分佈式)網絡
CAP理論最先是在2000年7月19號,由Berkeley的Eric Brewer教授在ACM PODC會議上的一個開題演講中提出,PPT在此。此後,MIT的Seth Gilbert和Nancy Lynch,理論上證實了Brewer猜測是正確的,CAP理論在學術上正式做爲一個定理出現了。數據庫設計
NoSQL必定程度上就是基於這個理論提出來的,由於傳統的SQL數據庫(關係型數據庫)都是都是具備ACID屬性,對一致性要求很高,所以下降了A(availability)和P(partion tolerance),所以,爲了提升系統性能和可擴展性,必須犧牲C(consistency),推翻關係型數據庫中ACID這一套。分佈式
依據CAP理論,從應用的需求不一樣,咱們對數據庫時,能夠從三方面考慮:性能
· 考慮CA,這就是傳統上的關係型數據庫(RMDB).網站
· 考慮CP,主要是一些Key-value數據庫,典型表明爲google的Big Tablegoogle
· 考慮AP,主要是一些面向文檔的適用於分佈式系統的數據庫,如SimpleDB。spa
而對大型網站尤爲是SNS網站,對於數據的短時間存儲,可用性與分區容忍性優先級要高於數據一致性,通常會盡可能朝着 A、P 的方向設計,而對於數據的持久存儲,能夠經過傳統的SQL來保證一致性(最終一致性)。
CAP理論出現後,不少大規模的網站,尤爲是SNS網站的數據庫設計都利用其思想,包括Amazon,Facebook和Twitter這幾個新興的IT巨頭,所以,必定程度上來說,他們都是CAP的信徒。另外一方面,他們從實踐上證實了CAP理論的正確性。
各個系統在CAP理論中的詳細體現能夠參考上一節的圖:
http://www.cnblogs.com/jacksu-tencent/p/3426605.html
有趣的是,ACID的意思是酸,而BASE倒是鹼的意思,所以這是一個對立的東西。其實,從本質上來說,酸(ACID)強調的一致性(CAP中的C),而鹼(BASE)強調是可用性(CAP中的A)。
傳統關係型數據庫系統的事務都有ACID的屬性,即原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。英文爲:
· Atomic: Everything in a transaction succeeds or the entire transaction is rolled back.
· Consistent: A transaction cannot leave the database in an inconsistent state.
· Isolated: Transactions cannot interfere with each other.
· Durable: Completed transactions persist, even when servers restart etc.
中譯爲:
· 原子性: 整個事務中的全部操做,要麼所有完成,要麼所有不完成,不可能停滯在中間某個環節。事務在執行過程當中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務歷來沒有執行過同樣。
· 一致性: 在事務開始以前和事務結束之後,數據庫的完整性約束沒有被破壞。
· 隔離性: 兩個事務的執行是互不干擾的,一個事務不可能看到其餘事務運行時,中間某一時刻的數據。 兩個事務不會發生交互。
· 持久性: 在事務完成之後,該事務所對數據庫所做的更改便持久的保存在數據庫之中,並不會被回滾。
在數據庫系統中,事務的ACID屬性保證了數據庫的一致性,好比銀行系統中,轉帳就是一個事務,從原帳戶扣除金額,以及向目標帳戶添加金額,這兩個數據庫操做的總和構成一個完整的邏輯過程,不可拆分,爲原子,從而保證了整個系統中的總金額沒有變化。
然而,這些ACID特性對於大型的分佈式系統來講,適合高性能不兼容的。好比,你在網上書店買書,任何一我的買書這個過程都會鎖住數據庫直到買書行爲完全完成(不然書本庫存數可能不一致),買書完成的那一瞬間,世界上全部的人均可以看到熟的庫存減小了一本(這也意味着兩我的不能同時買書)。這在小的網上書城也許能夠運行的很好,但是對Amazon這種網上書城卻並非很好。
而對於Amazon這種系統,他也許會用cache系統,剩餘的庫存數也許是以前幾秒甚至幾個小時前的快照,而不是實時的庫存數,這就捨棄了一致性。而且,Amazon可能也捨棄了獨立性,當只剩下最後一本書時,也許它會容許兩我的同時下單,寧願最後給那個下單成功卻沒貨的人道歉,而不是整個系統性能的降低。
其實,上面的思想是從CAP理論獲得的啓發,在CAP理論中:
在設計分佈式服務中,一般須要考慮三個應用的屬性:一致性、可用性以及分區寬容性。可是在實際的設計中,不可能這三方面同時作的很好。
因爲CAP理論的存在,爲了提升性能,出現了ACID的一種變種BASE:
· Basic Availability:基本可用
· Soft-state :軟狀態/柔性事務,能夠理解爲」無鏈接」的, 而 「Hard state」 是」面向鏈接」的
· Eventual consistency:最終一致性,最終整個系統(時間和系統的要求有關)看到的數據是一致的。
在BASE中,強調可用性的同時,引入了最終一致性這個概念,不像ACID,並不須要每一個事務都是一致的,只須要整個系統通過必定時間後最終達到是一致的。好比Amazon的賣書系統,也許在賣的過程當中,每一個用戶看到的庫存數是不同的,但最終買完後,庫存數都爲0。再好比SNS網絡中,C更新狀態,A也許能夠1分鐘纔看到,而B甚至5分鐘後纔看到,但最終你們均可以看到這個更新。
爲了更好的描述客戶端一致性,咱們經過如下的場景來進行,這個場景中包括三個組成部分:
• 存儲系統
存儲系統能夠理解爲一個黑盒子,它爲咱們提供了可用性和持久性的保證。
• Process A
ProcessA主要實現從存儲系統write和read操做
• Process B 和ProcessC
ProcessB和C是獨立於A,而且B和C也相互獨立的,它們同時也實現對存儲系統的write和read操做。
下面以上面的場景來描述下不一樣程度的一致性:
• 強一致性
強一致性(即時一致性) 假如A先寫入了一個值到存儲系統,存儲系統保證後續A,B,C的讀取操做都將返回最新值
• 弱一致性
假如A先寫入了一個值到存儲系統,存儲系統不能保證後續A,B,C的讀取操做能讀取到最新值。此種狀況下有一個「不一致性窗口」的概念,它特指從A寫入值,到後續操做A,B,C讀取到最新值這一段時間。
• 最終一致性
最終一致性是弱一致性的一種特例。假如A首先write了一個值到存儲系統,存儲系統保證若是在A,B,C後續讀取以前沒有其它寫操做更新一樣的值的話,最終全部的讀取操做都會讀取到最A寫入的最新值。此種狀況下,若是沒有失敗發生的話,「不一致性窗口」的大小依賴於如下的幾個因素:交互延遲,系統的負載,以及複製技術中replica的個數(這個能夠理解爲master/salve模式中,salve的個數),最終一致性方面最出名的系統能夠說是DNS系統,當更新一個域名的IP之後,根據配置策略以及緩存控制策略的不一樣,最終全部的客戶都會看到最新的值。
在1987 年,Jim Gray 與Gianfranco Putzolu 發表了這個"五分鐘法則"的觀點,簡而言之,若是一條記錄頻繁被訪問,就應該放到內存裏,不然的話就應該待在硬盤上按須要再訪問。這個臨界點就是五分鐘。 看上去像一條經驗性的法則,實際上五分鐘的評估標準是根據投入成本判斷的,根據當時的硬件發展水準,在內存中保持1KB 的數據成本至關於硬盤中存據400 秒的開銷(接近五分鐘)。這個法則在1997 年左右的時候進行過一次回顧,證明了五分鐘法則依然有效(硬盤、內存實際上沒有質的飛躍),而此次的回顧則是針對SSD 這個"新的舊硬件"可能帶來的影響。