版權聲明:本套技術專欄是做者(秦凱新)平時工做的總結和昇華,經過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和集羣環境容量規劃等內容,請持續關注本套博客。版權聲明:禁止轉載,歡迎學習。QQ郵箱地址:1120746959@qq.com,若有任何商業交流,可隨時聯繫。node
一致性算法
any read operation that begins after a write operation completes must
return that value, or the result of a later write operation
經過某個節點的寫操做結果對後面經過其它節點的讀操做可見
強一致性:
若是更新數據後,併發訪問狀況下後續讀操做可當即感知該更新,稱爲強一致性。
弱一致性:
若是容許以後部分或者所有感知不到該更新,稱爲弱一致性。
最終一致性:
若在以後的一段時間(一般該時間不固定)後,必定能夠感知到該更新,稱爲最終一致性。
複製代碼
可用性(Availability)併發
every request received by a non-failing node in the system must result in a response
任何一個沒有發生故障的節點必須在有限的時間內返回合理的結果。
複製代碼
分區容忍性(Partition Tolerance)分佈式
the network will be allowed to lose arbitrarily many messages sent from one node to another
部分節點宕機或者沒法與其它節點通訊時,各分區間還可保持分佈式系統的功能。
複製代碼
悖論總結:性能
可用性限定在不管是否集羣節點宕機,只要有活着的節點,就會當即返回請求結果。若要限制返回結果必須是最近一次寫的結果,就比較悲劇,若容許分區容忍性 => 分佈式系統分區之間就存在數據同步機制,那麼就有可能由於分區心跳切斷,致使數據不一致。學習
Kafka中topic的每一個partition有一個預寫式的日誌文件,雖然partition能夠繼續細分爲若干個segment文件,可是對於上層應用來講能夠將partition當作最小的存儲單元(一個有多個segment文件拼接的「巨型」文件),每一個partition都由一些列有序的、不可變的消息組成,這些消息被連續的追加到partition中。fetch
下圖展現了3個Partition把一個Topic主題數據流分紅三份,經過Partioner路由依次追加到分區的末尾中。若是partition規則設置的合理,全部消息能夠均勻分佈到不一樣的partition裏,這樣就實現了水平擴展。 優化
follower 副本專屬線程不斷地向leader副本所在broker發送FETCH請求。
leader 副本發送 FETCH response 給follower副本。
Follower 拿到response以後取出位移數據寫入到本地底層日誌中,在該過程當中其LEO值會被更新。
複製代碼
leader 端非本身副本對象 LEO值是在leader端broker處理FETCH請求過程當中被更新的。
複製代碼
Follower 副本對象更新HW是在其更新本地LEO以後。
一旦follower向本地日誌寫完數據後它就會嘗試更新其HW值。
算法爲取本地LEO與FETCH response中HW值的較小值
複製代碼
Leader 副本對象處理 Follower FETCH請求時在更新完leader 端非本身副本對象的LEO後將嘗試更新其本身HW值
producer 端寫入消息會更新leader Replica的LEO
副本被踢出ISR時
某分區變動爲leader副本後
複製代碼
第一次fetch請求僅得到了當前的數據,fetchOffset < Leader LEO, 由於leader 端的非本身的副本leo 是根據fetch請求肯定的,所以,只有第二次請求時,fetchOffset纔會和Leader LEO相等,進而更新 leader HW ,進而響應爲 leader HW,進而更新 Folloer HW。spa
本文實在麻煩,大牛的技術博客看起來總總有些詞不達意,我順便就直接口語化,但願帶來不一樣的效果。技術就是一層窗戶紙,看我把kafka和spark剖析的體無完膚。香港美景,一覽衆山小,技術道路上毅然前行!!線程