CAP原則又稱CAP定理,指的是在一個分布式系統中, Consistency(一緻性)、 Availability(可用性)、Partition tolerance(分區容忍性),三者不可得兼。
一緻性(C):
- 在分布式系統中的所有資料備份,在同一時刻是否同樣的值。(等同于所有節點通路同一份最新的資料副本)
可用性(A):
- 在叢集中一部分節點故障後,叢集整體是否還能響應用戶端的讀寫請求。(對資料更新具備高可用性)
分區容忍性(P):
- 以實際效果而言,分區相當于對通信的時限要求。系統如果不能在時限内達成資料一緻性,就意味着發生了分區的情況,必須就目前操作在C和A之間做出選擇。
-
CAP原則的精髓就是要麼AP,要麼CP,要麼AC,但是不存在CAP。如果在某個分布式系統中資料無副本, 那麼系統必然滿足強一緻性條件,
因為隻有獨一資料,不會出現資料不一緻的情況,此時C和P兩要素具備,但是如果系統發生了網絡分區狀況或者當機,必然導緻某些資料不可以通路,此時可用性條件就不能被滿足,即在此情況下獲得了CP系統,但是CAP不可同時滿足。
-
是以在進行分布式架構設計時,必須做出取舍。目前一般是通過分布式緩存中各節點的最終一緻性來提高系統的性能,通過使用多節點之間的資料異步複制技術來實作叢集化的資料一緻性。通常使用類似
memcached 之類的 NOSQL 作為實作手段。雖然 memcached
也可以是分布式叢集環境的,但是對于一份資料來說,它總是存儲在某一台 memcached
伺服器上。如果發生網絡故障或是伺服器當機,則存儲在這台伺服器上的所有資料都将不可通路。由于資料是存儲在記憶體中的,重新開機伺服器,将導緻資料全部丢失。當然也可以自己實作一套機制,用來在分布式
memcached 之間進行資料的同步和持久化,但是實作難度是非常大的 [2] 。
可用的抉擇
- CAP理論就是說在分布式存儲系統中,最多隻能實作上面的兩點。而由于網絡硬體肯定會出現延遲丢包等問題,是以分區容錯性是我們必須需要實作的。是以我們隻能在一緻性和可用性之間進行權衡,沒有NoSQL系統能同時保證這三點。對于web2.0網站來說,關系資料庫的很多主要特性卻往往無用武之地。
- 資料庫事務一緻性需求
- 很多web實時系統并不要求嚴格的資料庫事務,對讀一緻性的要求很低,有些場合對寫一緻性要求并不高。允許實作最終一緻性。
資料庫的寫實時性和讀實時性需求
-
對關系資料庫來說,插入一條資料之後立刻查詢,是肯定可以讀出來這條資料的,但是對于很多web應用來說,并不要求這麼高的實時性,比方說發一條消息之
後,過幾秒乃至十幾秒之後,我的訂閱者才看到這條動态是完全可以接受的。
- 對複雜的SQL查詢,特别是多表關聯查詢的需求
-
任何大資料量的web系統,都非常忌諱多個大表的關聯查詢,以及複雜的資料分析類型的報表查詢,特别是SNS類型的網站,從需求以及産品設計角
度,就避免了這種情況的産生。往往更多的隻是單表的主鍵查詢,以及單表的簡單條件分頁查詢,SQL的功能被極大的弱化了。
與NoSQL的關系
- 傳統的關系型資料庫在功能支援上通常很寬泛,從簡單的鍵值查詢,到複雜的多表聯合查詢再到事務機制的支援。而與之不同的是,NoSQL系統通常注重性能和擴充性,而非事務機制(事務就是強一緻性的展現)。
- 傳統的SQL資料庫的事務通常都是支援ACID的強事務機制。A代表原子性,即在事務中執行多個操作是原子性的,要麼事務中的操作全部執行,要麼一個都不執行;C代表一緻性,即保證進行事務的過程中整個資料庫的狀态是一緻的,不會出現資料花掉的情況;I代表隔離性,即兩個事務不會互相影響,覆寫彼此資料等;D表示持久化,即事務一旦完成,那麼資料應該是被寫到安全的,持久化存儲的裝置上(比如磁盤)。
- NoSQL系統僅提供對行級别的原子性保證,也就是說同時對同一個Key下的資料進行的兩個操作,在實際執行的時候是會串行的執行,保證了每一個Key-Value對不會被破壞。
分布式系統
-
分布式系統(distributed
system)是建立在網絡之上的軟體系統。正是因為軟體的特性,是以分布式系統具有高度的内聚性和透明性。是以,網絡和分布式系統之間的差別更多的在于高層軟體(特别是作業系統),而不是硬體。在一個分布式系統中,一組獨立的計算機展現給使用者的是一個統一的整體,就好像是一個系統似的。系統擁有多種通用的實體和邏輯資源,可以動态的配置設定任務,分散的實體和邏輯資源通過計算機網絡實作資訊交換。系統中存在一個以全局的方式管理計算機資源的分布式作業系統。通常,對使用者來說,分布式系統隻有一個模型或範型。在作業系統之上有一層軟體中間件(middleware)負責實作這個模型。一個著名的分布式系統的例子是網際網路(World
Wide Web),在網際網路中,所有的一切看起來就好像是一個文檔(Web頁面)一樣。
- 在計算機網絡中,這種統一性、模型以及其中的軟體都不存在。使用者看到的是實際的機器,計算機網絡并沒有使這些機器看起來是統一的。如果這些機器有不同的硬體或者不同的作業系統,那麼,這些差異對于使用者來說都是完全可見的。如果一個使用者希望在一台遠端機器上運作一個程式,那麼,他必須登陸到遠端機器上,然後在那台機器上運作該程式。
最新2021整理收集的一些高頻面試題(都整理成文檔),有很多幹貨,包含mysql,netty,spring,線程,SpringBoot、Spring Cloud、jvm、源碼、算法等詳細講解,也有詳細的學習規劃圖,面試題整理等,需要擷取這些内容的朋友請加Q君羊:826021115