**主要是總結以前學習過相關分佈式的知識點,能夠一塊兒學習,會有比較多口語化的詞,以前作的筆記,見諒。 文章末尾會貼出相關學習理論資料,能夠方便一塊兒學習交流 **算法
( 真的很氣,剛寫好的發到網站上,掛掉了,如今要從新總結一次~)docker
指的分佈式系統中的某個節點或者網絡分區出現了故障的時候,整個系統仍然能對外提供知足一致性和可用性的服務。也就是說部分故障不影響總體使用。數據庫
事實上咱們在設計分佈式系統是都會考慮到bug,硬件,網絡等各類緣由形成的故障,因此即便部分節點或者網絡出現故障,咱們要求整個系統仍是要繼續使用的安全
(不繼續使用,至關於只有一個分區,那麼也就沒有後續的一致性和可用性了)服務器
(網絡出現故障 這個集羣仍是可使用)markdown
P是必定要知足的,是基礎的! 必須是這個架構網絡
一直能夠正常的作讀寫操做。簡單而言就是客戶端一直能夠正常訪問並獲得系統的正常響應。用戶角度來看就是不會出現系統操做失敗或者訪問超時等問題。(不能超時,在合理的時間內返回正確的結果)架構
在分佈式系統完成某寫操做後任何讀操做,都應該獲取到該寫操做寫入的那個最新的值。至關於要求分佈式系統中的各節點時時刻刻保持數據的一致性。(也就是數據同步要快!能讀到最新的)分佈式
P和C一塊兒知足是能夠的! 若是在PC的基礎上 還要知足可用的話,基本上不可能; 爲何呢?(一致性的基礎上,A 和B數據進行同步的話,同步是須要一段時間進行同步的,就會有延遲,若是在延遲的時候 要返回數據 那麼就可能會形成可用性不能知足,必須等到同步完成! 或者說若是要知足可用性,那麼一致性就知足不了,由於必須在這麼短的時間內去處理!)學習
總結:不能同時知足 C(一致性)和A(可用性) 只能在裏面選一個 ,由於知足C的時候,若是正在作同步,那麼讀取的速度就會很慢 ; 要麼作一致性要麼作可用性
最終一致性:在當下某個時間內 雖然沒有同步,可是最後的狀態必須是一致的。
犧牲強一致性來得到可用性!
弱一致性:最終一致性(DNS)
強一致性:同步,Paxos,Raft,ZAB
1.Paxos
裏面的learner是兩個備份數據庫,中間的Acctpor是數據庫節點(最重要的Server),proposer只是服務器?
第一輪接收提案以後去投票,投票經過 Acctpor會寫log,而後最後的learner也會去備份
第一輪proposer會選主,當老大 無論client有沒有提案過來
一開始一輪RPC選總統,兩輪RPC; 後面都是一輪RPC,只有惟一一個Leader proposer,提出來就必須經過
第一個主機成爲Leader,其與的都是slave 簡化角色
Follower只是服從的角色,遵從Leader的指揮,Candidate是Leader掛了後填補的
第一輪進行競選,而後投票
全部的請求先通過寫入到Leader,而後同步,何時寫系統文件呢? 要等待Follower確認以後,或者大多數確認;其餘的Follower也要寫
會有一個心跳機制 timeout,在必定時間內 若是沒有Leader發送信息過來,那麼就知道這個集羣裏是沒有Leader的 ,能夠競選Leader
有Leader以後timeout刷新,而後Leader會發送心跳包過來,數據會跟着心跳包一塊過來,每次發送心跳 都會更新那個定時器
若是Leader掉了,timeout到期 就會去競選Leader
若是兩個節點都想成爲Leader,平票怎麼辦?隨機的timeout,短的會很快去競選,長的就會放棄;
全部的寫請求都要通過Leader,而後Leader把數據報夾雜着心跳發送給 Follower,知道大多數Follower提交成功之後,本身就會寫log到文件系統
分區的狀況:
單數個節點
合併的話,會按照最新的系統來作Leader
如何保證安全性的:失敗了會什麼行爲(另一個Leader會競選,從新提升服務),分區了什麼行爲
若是某個宕機一段時間,數據後面會補上
沒有達到多數派的話,是不會寫log的
少數派的leader更新實際上是不會成功的
可能會丟失數據,覆蓋掉以前的leader數據,可是整個系統的共識仍是沒有問題的!須要客戶端達到的!
其實也作不到徹底的強一致性!
leader掛掉了,在選舉的時候 若是來了請求,怎麼處理! 這個時候會超時,實現一致性確定會犧牲一點可用性的; 能夠失敗,只要保持一致性就能夠了
很方便! 優點很大! 容器的管理 直接去拉那種環境就能夠了
這麼多節點由誰來負責隨機呢?假設有專門的節點負責隨機選舉leader,又怎麼保證這個節點掛掉後集羣能正常工做。