摘要:每一次寫操作都分發(fā)到所有副本只有大部分節(jié)點(diǎn)應(yīng)答才能提交寫缺點(diǎn)隨著副本數(shù)的增加集群中需要的節(jié)點(diǎn)數(shù)量比較多存儲元數(shù)據(jù)數(shù)據(jù)量不是很大使用比較合適對于一次寫的提交要求當(dāng)前中的所有成員都才算提交寫成功的大小是可配置的和副本數(shù)量沒有關(guān)系比如個(gè)副本可以
Every write operation goes to all replicas, but only responses
from a majority quorum are necessary to commit the write.
每一次寫操作都分發(fā)到所有副本,只有大部分節(jié)點(diǎn)應(yīng)答才能提交寫
缺點(diǎn):隨著副本數(shù)的增加,集群中需要ack的節(jié)點(diǎn)數(shù)量比較多(n/2-1)
存儲元數(shù)據(jù),數(shù)據(jù)量不是很大,使用ZooKeeper比較合適
The ISR scheme of Kafka requires all the members of the current ISR to respond
對于一次寫的提交,要求當(dāng)前ISR中的所有成員都ack, 才算提交寫成功
ISR的大小是可配置的,和副本數(shù)量沒有關(guān)系.比如11個(gè)副本可以配置ISR=3, 如果用quorum,則需要6個(gè)節(jié)點(diǎn)ack
場景1: 節(jié)點(diǎn)掛掉后重新和Leader同步數(shù)據(jù)
場景2: 普通節(jié)點(diǎn)和Leader節(jié)點(diǎn)都掛了,選舉新的Leader
Partition
每條消息都有一個(gè)的offset. 一個(gè)Topic分成多個(gè)Partition
每個(gè)Partition中消息offset都是一直增加, LEO表示最后一條消息的offset
可以認(rèn)為一個(gè)Partition內(nèi)的offset是全局有序的,一個(gè)Partition分成多個(gè)Segment, 每個(gè)Segment的offset也都是有序的
Segment與Segment之間的offset也是有序的, 所有這些Segment組成的一個(gè)Partition就是全局有序的
Replication
Leader宕機(jī), 新的Leader一定是從先前Leader的ISR中選舉出來的
ISR是所有副本的子集, 是那些能夠及時(shí)地復(fù)制Leader日志的節(jié)點(diǎn)
每個(gè)Partition的Leader通過計(jì)算每個(gè)副本和它相比落后的數(shù)量來跟蹤(更新)ISR列表
當(dāng)生產(chǎn)者生產(chǎn)一條消息給Broker,寫到Leader節(jié)點(diǎn), 并且復(fù)制到Partition的所有副本
但只有全部復(fù)制到ISR列表中的每個(gè)節(jié)點(diǎn)(ISR節(jié)點(diǎn)必須都ack), 這條消息才算被提交
復(fù)制到一個(gè)不在ISR列表中的節(jié)點(diǎn), 即使沒有ack也沒有關(guān)系(因?yàn)樗旧砭捅容^慢了)
如果一個(gè)節(jié)點(diǎn)落后太多, 就會從ISR中移除. 這樣復(fù)制延遲取決于ISR中最慢的節(jié)點(diǎn)
所以如果ISR中最慢的節(jié)點(diǎn)還不爭氣,也會被剔除掉, 最終在ISR中的節(jié)點(diǎn)一般都很快
假設(shè)副本數(shù)=3, 有三個(gè)Broker, 已經(jīng)有三條消息committed了, 初始時(shí)所有的副本(包括Leader)都在ISR中
并且replica.lag.max.messages=4, 只要follower落后于Leader不超過3條消息, 就不會從ISR中移除
replica.lag.time.max.ms=500, 只要follower每隔500ms(或者更快)向Leader獲取消息(fetch request)
就不會被標(biāo)記為DEAD, 也就不會從ISR中移除(如果沒有落后太多,但是長時(shí)間沒fetch,也會被移除的).
lag.max.messages: detect slow replicas
lag.time.max: detect halted or dead replicas
Producer向Leader發(fā)送了一條消息, Leader的LEO增加了一.
這個(gè)時(shí)候Broker3由于某種原因卡住了, 無法從Leader上及時(shí)獲取這條消息
而Broker2則正常地從Leader上同步了這條消息到自己本地.
由于一條消息被成功地提交的必要條件是: 在ISR中的所有節(jié)點(diǎn)都復(fù)制了這條消息.
Broker3還在ISR中, 只要它沒有復(fù)制這條消息, 那么這條消息就不會被committed.
由于現(xiàn)在Broker3才落后Leader一條消息 < replica.lag.max.messages=4
所以它并不會從ISR中移除, 所以只能靜靜地等Broker3…
要么再多落后幾條消息, 從ISR中移除
要么趕快恢復(fù)過來, 然后從Leader復(fù)制消息, 及時(shí)趕上Leader,不要落后太多
假設(shè)Broker3在100ms后恢復(fù)過來, 然后從Leader同步這條稍微延遲的消息
現(xiàn)在兩個(gè)follower都復(fù)制了消息3, 由于ISR的所有節(jié)點(diǎn)都復(fù)制了消息3,
現(xiàn)在Leader的committed(HW)可以向后移動到消息3了.
如果Producer發(fā)送一批4條消息 = lag.max.messages = 4
所有的follower都落后于leader太多了, 它們會從ISR中刪除
由于所有的follower都是alive的, 它們會在下次fetch request時(shí)趕上Leader的LEO
即復(fù)制這批消息, 現(xiàn)在落后的消息已經(jīng)被補(bǔ)上了, 于是就會被重新加入到ISR中,
于此同時(shí)由于follower都復(fù)制了這批消息, committed也增加到的便宜位置
這種大批量的生產(chǎn)消息, 造成follower不斷地shuttle in and out of ISR (移除后又添加)
而且需要根據(jù)topic的期望流量猜測正確的值, 看起來并不是很好控制!
現(xiàn)在統(tǒng)一只使用一個(gè)配置: replica.lag.time.max.ms 來控制stuck和slow的replica.
不過它的含義變?yōu)? follower上的副本和Leader相比out-of-sync的時(shí)間
stuck replica含義仍然不變:如果沒有及時(shí)發(fā)送fetch request, 會被認(rèn)為Dead,并移除
slow replica: 副本從剛開始落后與Leader, 直到超過這個(gè)時(shí)間,說明它太慢了也會移除
這樣即使有突增流量或一直都是大批消息, 除非副本一直落后與Leader太長的時(shí)間
否則如果副本只要在這個(gè)時(shí)間內(nèi)能趕上Leader, 就不會出現(xiàn)刪除后又添加到ISR的現(xiàn)象
Ref
http://www.confluent.io/blog/distributed-consensus-reloaded-apache-zookeeper-and-replication-in-kafka
http://www.confluent.io/blog/hands-free-kafka-replication-a-lesson-in-operational-simplicity/
歡迎加入本站公開興趣群軟件開發(fā)技術(shù)群
興趣范圍包括:Java,C/C++,Python,PHP,Ruby,shell等各種語言開發(fā)經(jīng)驗(yàn)交流,各種框架使用,外包項(xiàng)目機(jī)會,學(xué)習(xí)、培訓(xùn)、跳槽等交流
QQ群:26931708
Hadoop源代碼研究群
興趣范圍包括:Hadoop源代碼解讀,改進(jìn),優(yōu)化,分布式系統(tǒng)場景定制,與Hadoop有關(guān)的各種開源項(xiàng)目,總之就是玩轉(zhuǎn)Hadoop
QQ群:288410967?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/4189.html
摘要:前提好幾周沒更新博客了,對不斷支持我博客的童鞋們說聲抱歉了。熟悉我的人都知道我寫博客的時(shí)間比較早,而且堅(jiān)持的時(shí)間也比較久,一直到現(xiàn)在也是一直保持著更新狀態(tài)。 showImg(https://segmentfault.com/img/remote/1460000014076586?w=1920&h=1080); 前提 好幾周沒更新博客了,對不斷支持我博客的童鞋們說聲:抱歉了!。自己這段時(shí)...
摘要:項(xiàng)目地址前言大數(shù)據(jù)技術(shù)棧思維導(dǎo)圖大數(shù)據(jù)常用軟件安裝指南一分布式文件存儲系統(tǒng)分布式計(jì)算框架集群資源管理器單機(jī)偽集群環(huán)境搭建集群環(huán)境搭建常用命令的使用基于搭建高可用集群二簡介及核心概念環(huán)境下的安裝部署和命令行的基本使用常用操作分區(qū)表和分桶表視圖 項(xiàng)目GitHub地址:https://github.com/heibaiying... 前 言 大數(shù)據(jù)技術(shù)棧思維導(dǎo)圖 大數(shù)據(jù)常用軟件安裝指...
摘要:在元素被插入之前生效,在元素被插入之后的下一幀移除。在整個(gè)進(jìn)入過渡的階段中應(yīng)用,在元素被插入之前生效,在過渡動畫完成之后移除。這個(gè)類可以被用來定義進(jìn)入過渡的過程時(shí)間,延遲和曲線函數(shù)。版及以上定義進(jìn)入過渡的結(jié)束狀態(tài)。 基本概念 Vue 在插入、更新或者移除 DOM 時(shí),提供多種不同方式的應(yīng)用過渡效果 在 CSS 過渡和動畫中自動應(yīng)用 class 可以配合使用第三方 CSS 動畫庫,如...
摘要:在元素被插入之前生效,在元素被插入之后的下一幀移除。在整個(gè)進(jìn)入過渡的階段中應(yīng)用,在元素被插入之前生效,在過渡動畫完成之后移除。這個(gè)類可以被用來定義進(jìn)入過渡的過程時(shí)間,延遲和曲線函數(shù)。版及以上定義進(jìn)入過渡的結(jié)束狀態(tài)。 基本概念 Vue 在插入、更新或者移除 DOM 時(shí),提供多種不同方式的應(yīng)用過渡效果 在 CSS 過渡和動畫中自動應(yīng)用 class 可以配合使用第三方 CSS 動畫庫,如...
摘要:在元素被插入之前生效,在元素被插入之后的下一幀移除。在整個(gè)進(jìn)入過渡的階段中應(yīng)用,在元素被插入之前生效,在過渡動畫完成之后移除。這個(gè)類可以被用來定義進(jìn)入過渡的過程時(shí)間,延遲和曲線函數(shù)。版及以上定義進(jìn)入過渡的結(jié)束狀態(tài)。 基本概念 Vue 在插入、更新或者移除 DOM 時(shí),提供多種不同方式的應(yīng)用過渡效果 在 CSS 過渡和動畫中自動應(yīng)用 class 可以配合使用第三方 CSS 動畫庫,如...
閱讀 3110·2019-08-30 15:56
閱讀 1259·2019-08-29 15:20
閱讀 1600·2019-08-29 13:19
閱讀 1514·2019-08-29 13:10
閱讀 3412·2019-08-26 18:27
閱讀 3092·2019-08-26 11:46
閱讀 2256·2019-08-26 11:45
閱讀 3799·2019-08-26 10:12