自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Kafka的存儲機(jī)制以及可靠性

存儲 存儲軟件 大數(shù)據(jù) Kafka
kafka通過topic來分主題存放數(shù)據(jù),主題內(nèi)有分區(qū),分區(qū)可以有多個(gè)副本,分區(qū)的內(nèi)部還細(xì)分為若干個(gè)segment。所謂的分區(qū)其實(shí)就是在kafka對應(yīng)存儲目錄下創(chuàng)建的文件夾,文件夾的名字是主題名加上分區(qū)編號,編號從0開始。

目錄

1.Kafka簡介及安裝配置

2.Kafka的存儲機(jī)制以及可靠性

Kafka的存儲機(jī)制以及可靠性

一、kafka的存儲機(jī)制

kafka通過topic來分主題存放數(shù)據(jù),主題內(nèi)有分區(qū),分區(qū)可以有多個(gè)副本,分區(qū)的內(nèi)部還細(xì)分為若干個(gè)segment。

所謂的分區(qū)其實(shí)就是在kafka對應(yīng)存儲目錄下創(chuàng)建的文件夾,文件夾的名字是主題名加上分區(qū)編號,編號從0開始。

[[228394]]

1、segment

所謂的segment其實(shí)就是在分區(qū)對應(yīng)的文件夾下產(chǎn)生的文件。

一個(gè)分區(qū)會被劃分成大小相等的若干segment,這樣一方面保證了分區(qū)的數(shù)據(jù)被劃分到多個(gè)文件中保證不會產(chǎn)生體積過大的文件;另一方面可以基于這些segment文件進(jìn)行歷史數(shù)據(jù)的刪除,提高效率。

一個(gè)segment又由一個(gè).log和一個(gè).index文件組成。

1..log

.log文件為數(shù)據(jù)文件用來存放數(shù)據(jù)分段數(shù)據(jù)。

2..index

.index為索引文件保存對對應(yīng)的.log文件的索引信息。

在.index文件中,保存了對對應(yīng).log文件的索引信息,通過查找.index文件可以獲知每個(gè)存儲在當(dāng)前segment中的offset在.log文件中的開始位置,而每條日志有其固定格式,保存了包括offset編號、日志長度、key的長度等相關(guān)信息,通過這個(gè)固定格式中的數(shù)據(jù)可以確定出當(dāng)前offset的結(jié)束位置,從而對數(shù)據(jù)進(jìn)行讀取。

3.命名規(guī)則

這兩個(gè)文件的命名規(guī)則為:

partition全局的***個(gè)segment從0開始,后續(xù)每個(gè)segment文件名為上一個(gè)segment文件***一條消息的offset值,數(shù)值大小為64位,20位數(shù)字字符長度,沒有數(shù)字用0填充。

2、讀取數(shù)據(jù)

開始讀取指定分區(qū)中某個(gè)offset對應(yīng)的數(shù)據(jù)時(shí),先根據(jù)offset和當(dāng)前分區(qū)的所有segment的名稱做比較,確定出數(shù)據(jù)在哪個(gè)segment中,再查找該segment的索引文件,確定當(dāng)前offset在數(shù)據(jù)文件中的開始位置,***從該位置開始讀取數(shù)據(jù)文件,在根據(jù)數(shù)據(jù)格式判斷結(jié)果,獲取完整數(shù)據(jù)。

二、可靠性保證

1、AR

在Kafka中維護(hù)了一個(gè)AR列表,包括所有的分區(qū)的副本。AR又分為ISR和OSR。

AR = ISR + OSR。

AR、ISR、OSR、LEO、HW這些信息都被保存在Zookeeper中。

1.ISR

ISR中的副本都要同步leader中的數(shù)據(jù),只有都同步完成了數(shù)據(jù)才認(rèn)為是成功提交了,成功提交之后才能供外界訪問。

在這個(gè)同步的過程中,數(shù)據(jù)即使已經(jīng)寫入也不能被外界訪問,這個(gè)過程是通過LEO-HW機(jī)制來實(shí)現(xiàn)的。

2.OSR

OSR內(nèi)的副本是否同步了leader的數(shù)據(jù),不影響數(shù)據(jù)的提交,OSR內(nèi)的follower盡力的去同步leader,可能數(shù)據(jù)版本會落后。

最開始所有的副本都在ISR中,在kafka工作的過程中,如果某個(gè)副本同步速度慢于replica.lag.time.max.ms指定的閾值,則被踢出ISR存入OSR,如果后續(xù)速度恢復(fù)可以回到ISR中。

3.LEO

LogEndOffset:分區(qū)的***的數(shù)據(jù)的offset,當(dāng)數(shù)據(jù)寫入leader后,LEO就立即執(zhí)行該***數(shù)據(jù)。相當(dāng)于***數(shù)據(jù)標(biāo)識位。

4.HW

HighWatermark:只有寫入的數(shù)據(jù)被同步到所有的ISR中的副本后,數(shù)據(jù)才認(rèn)為已提交,HW更新到該位置,HW之前的數(shù)據(jù)才可以被消費(fèi)者訪問,保證沒有同步完成的數(shù)據(jù)不會被消費(fèi)者訪問到。相當(dāng)于所有副本同步數(shù)據(jù)標(biāo)識位。

在leader宕機(jī)后,只能從ISR列表中選取新的leader,無論ISR中哪個(gè)副本被選為新的leader,它都知道HW之前的數(shù)據(jù),可以保證在切換了leader后,消費(fèi)者可以繼續(xù)看到HW之前已經(jīng)提交的數(shù)據(jù)。

所以LEO代表已經(jīng)寫入的***數(shù)據(jù)位置,而HW表示已經(jīng)同步完成的數(shù)據(jù),只有HW之前的數(shù)據(jù)才能被外界訪問。

5.HW截?cái)鄼C(jī)制

如果leader宕機(jī),選出了新的leader,而新的leader并不能保證已經(jīng)完全同步了之前l(fā)eader的所有數(shù)據(jù),只能保證HW之前的數(shù)據(jù)是同步過的,此時(shí)所有的follower都要將數(shù)據(jù)截?cái)嗟紿W的位置,再和新的leader同步數(shù)據(jù),來保證數(shù)據(jù)一致。

當(dāng)宕機(jī)的leader恢復(fù),發(fā)現(xiàn)新的leader中的數(shù)據(jù)和自己持有的數(shù)據(jù)不一致,此時(shí)宕機(jī)的leader會將自己的數(shù)據(jù)截?cái)嗟藉礄C(jī)之前的hw位置,然后同步新leader的數(shù)據(jù)。宕機(jī)的leader活過來也像follower一樣同步數(shù)據(jù),來保證數(shù)據(jù)的一致性。

2、生產(chǎn)者可靠性級別

通過以上的講解,已經(jīng)可以保證kafka集群內(nèi)部的可靠性,但是在生產(chǎn)者向kafka集群發(fā)送時(shí),數(shù)據(jù)經(jīng)過網(wǎng)絡(luò)傳輸,也是不可靠的,可能因?yàn)榫W(wǎng)絡(luò)延遲、閃斷等原因造成數(shù)據(jù)的丟失。

kafka為生產(chǎn)者提供了如下的三種可靠性級別,通過不同策略保證不同的可靠性保障。

其實(shí)此策略配置的就是leader將成功接收消息信息響應(yīng)給客戶端的時(shí)機(jī)。

通過request.required.acks參數(shù)配置:

1:生產(chǎn)者發(fā)送數(shù)據(jù)給leader,leader收到數(shù)據(jù)后發(fā)送成功信息,生產(chǎn)者收到后認(rèn)為發(fā)送數(shù)據(jù)成功,如果一直收不到成功消息,則生產(chǎn)者認(rèn)為發(fā)送數(shù)據(jù)失敗會自動重發(fā)數(shù)據(jù)。

當(dāng)leader宕機(jī)時(shí),可能丟失數(shù)據(jù)。

0:生產(chǎn)者不停向leader發(fā)送數(shù)據(jù),而不需要leader反饋成功消息。

這種模式效率***,可靠性***。可能在發(fā)送過程中丟失數(shù)據(jù),也可能在leader宕機(jī)時(shí)丟失數(shù)據(jù)。

-1:生產(chǎn)者發(fā)送數(shù)據(jù)給leader,leader收到數(shù)據(jù)后要等到ISR列表中的所有副本都同步數(shù)據(jù)完成后,才向生產(chǎn)者發(fā)送成功消息,如果一只收不到成功消息,則認(rèn)為發(fā)送數(shù)據(jù)失敗會自動重發(fā)數(shù)據(jù)。

這種模式下可靠性很高,但是當(dāng)ISR列表中只剩下leader時(shí),當(dāng)leader宕機(jī)讓然有可能丟數(shù)據(jù)。

此時(shí)可以配置min.insync.replicas指定要求觀察ISR中至少要有指定數(shù)量的副本,默認(rèn)該值為1,需要改為大于等于2的值

這樣當(dāng)生產(chǎn)者發(fā)送數(shù)據(jù)給leader但是發(fā)現(xiàn)ISR中只有l(wèi)eader自己時(shí),會收到異常表明數(shù)據(jù)寫入失敗,此時(shí)無法寫入數(shù)據(jù),保證了數(shù)據(jù)絕對不丟。

雖然不丟但是可能會產(chǎn)生冗余數(shù)據(jù),例如生產(chǎn)者發(fā)送數(shù)據(jù)給leader,leader同步數(shù)據(jù)給ISR中的follower,同步到一半leader宕機(jī),此時(shí)選出新的leader,可能具有部分此次提交的數(shù)據(jù),而生產(chǎn)者收到失敗消息重發(fā)數(shù)據(jù),新的leader接受數(shù)據(jù)則數(shù)據(jù)重復(fù)了。

3、leader選舉

當(dāng)leader宕機(jī)時(shí)會選擇ISR中的一個(gè)follower成為新的leader,如果ISR中的所有副本都宕機(jī),怎么辦?

有如下配置可以解決此問題:

unclean.leader.election.enable=false

策略1:必須等待ISR列表中的副本活過來才選擇其成為leader繼續(xù)工作。

unclean.leader.election.enable=true

策略2:選擇任何一個(gè)活過來的副本,成為leader繼續(xù)工作,此follower可能不在ISR中。

策略1,可靠性有保證,但是可用性低,只有***掛了leader活過來kafka才能恢復(fù)。

策略2,可用性高,可靠性沒有保證,任何一個(gè)副本活過來就可以繼續(xù)工作,但是有可能存在數(shù)據(jù)不一致的情況。

4、kafka可靠性的保證

At most once:消息可能會丟,但絕不會重復(fù)傳輸。

At least once:消息絕不會丟,但可能會重復(fù)傳輸。

Exactly once:每條消息肯定會被傳輸一次且僅傳輸一次。

kafka最多保證At least once,可以保證不丟,但是可能會重復(fù),為了解決重復(fù)需要引入唯一標(biāo)識和去重機(jī)制,kafka提供了GUID實(shí)現(xiàn)了唯一標(biāo)識,但是并沒有提供自帶的去重機(jī)制,需要開發(fā)人員基于業(yè)務(wù)規(guī)則自己去重。

責(zé)任編輯:武曉燕 來源: oschina博客
相關(guān)推薦

2023-11-17 09:00:00

Kafka開發(fā)

2017-06-23 18:25:51

kafka數(shù)據(jù)可靠性

2010-12-28 19:50:21

可靠性產(chǎn)品可靠性

2010-01-15 09:44:52

嵌入式存儲交換技術(shù)

2019-11-29 09:49:34

Kafka系統(tǒng)監(jiān)控

2019-08-30 12:10:05

磁盤數(shù)據(jù)可靠性RAID

2010-12-28 19:55:20

軟件架構(gòu)可靠性

2020-12-06 14:51:23

物聯(lián)網(wǎng)可靠性IOT

2010-12-28 20:04:10

網(wǎng)絡(luò)的可靠性網(wǎng)絡(luò)解決方案可靠性

2011-05-25 19:31:07

Stratus信息化

2010-12-28 20:16:24

2025-03-03 03:00:00

2017-12-27 09:21:19

分布式存儲系統(tǒng)

2013-11-04 17:05:37

銀行容錯(cuò)

2011-05-04 19:17:36

VPLSVPN技術(shù)

2021-02-02 11:01:31

RocketMQ消息分布式

2024-02-28 10:26:04

物聯(lián)網(wǎng)數(shù)據(jù)存儲

2018-09-27 14:13:27

云服務(wù)可靠故障

2009-04-08 10:23:00

軟交換網(wǎng)絡(luò)可靠

2013-11-04 17:04:22

容錯(cuò)可靠
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號