KafKa資料儲存與資料一致性保證

2021-07-24 06:08:17 字數 2558 閱讀 4786

一類訊息稱為乙個topic

topic邏輯結構

topic可分為多個parition;

parition內部保證資料的有序,按照訊息寫入順序給每個訊息賦予乙個遞增的offset;

為保證資料的安全性,每個partition有多個replica

多parition的優點

併發讀寫,加快讀寫速度

多partition分布式儲存,利於集群資料的均衡

加快資料恢復的速率:當某台機器掛了,每個topic僅需恢復一部分的資料,多機器併發

缺點partition間msg無序,若想保證msg寫入與讀取的序不變,只能申請乙個partition

partition儲存結構

每個partition分為多個segment

每個segment包含兩個檔案:log檔案和index檔案,分別命名為start_offset.log和start_offset.index

log檔案包含具體的msg資料,每條msg會有乙個遞增的offset

index檔案是對log檔案的索引:每隔一定大小的塊,索引msg在該segment中的相對offset和在log檔案中的位置偏移量

根據offset查詢msg的過程

根據msg的offset和log檔名中的start_offset,找到最後乙個不大於msgoffset的segment,即為msg所在的segment;

根據對應segment的index檔案,進一步查詢msg在log檔案中的偏移量

從log檔案的偏移量開始讀取解析msg,比較msgoffset,找到所要讀取的msg

partition recovery過程

每個partition會在磁碟記錄乙個recoverypoint, 記錄已經flush到磁碟的最大offset。當broker fail 重啟時,會進行loadlogs。首先會讀取該partition的recoverypoint,找到包含recoverypoint的segment及以後的segment, 這些segment就是可能沒有完全flush到磁碟segments。然後呼叫segment的recover,重新讀取各個segment的msg,並重建索引

優點以segment為單位管理partition資料,方便資料生命週期的管理,刪除過期資料簡單

在程式崩潰重啟時,加快recovery速度,只需恢復未完全flush到磁碟的segment

通過命名中offset資訊和index檔案,大大加快msg查詢時間,並且通過分多個segment,每個index檔案很小,查詢速度更快

partition的多個replica中乙個為leader,其餘為follower

producer只與leader互動,把資料寫入到leader中

followers從leader中拉取資料進行資料同步

consumer只從leader拉取資料

isr:所有不落後的replica集合, 不落後有兩層含義:距離上次fetchrequest的時間不大於某乙個值或落後的訊息數不大於某乙個值,leader失敗後會從isr中選取乙個follower做leader

當producer向leader傳送資料時,可以通過acks引數設定資料可靠性的級別

0: 不論寫入是否成功,server不需要給producer傳送response,如果發生異常,server會終止連線,觸發producer更新meta資料;

1: leader寫入成功後即傳送response,此種情況如果leader fail,會丟失資料

-1: 等待所有isr接收到訊息後再給producer傳送response,這是最強保證

僅設定acks=-1也不能保證資料不丟失,當isr列表中只有leader時,同樣有可能造成資料丟失。要保證資料不丟除了設定acks=-1, 還要保證isr的大小大於等於2,具體引數設定:

request.required.acks:設定為-1 等待所有isr列表中的replica接收到訊息後採算寫成功;

min.insync.replicas: 設定為大於等於2,保證isr中至少有兩個replica

producer要在吞吐率和資料可靠性之間做乙個權衡

一致性定義:若某條訊息對client可見,那麼即使leader掛了,在新leader上資料依然可以被讀到

hw-highwatermark: client可以從leader讀到的最大msg offset,即對外可見的最大offset, hw=max(replica.offset)

對於leader新收到的msg,client不能立刻消費,leader會等待該訊息被所有isr中的replica同步後,更新hw,此時該訊息才能被client消費,這樣就保證了如果leader fail,該訊息仍然可以從新選舉的leader中獲取。

對於來自內部broker的讀取請求,沒有hw的限制。同時,follower也會維護乙份自己的hw,folloer.hw = min(leader.hw, follower.offset)

與kafka有幾點明顯不同:

資料分塊,比如以64m為乙個資料塊;

流水線複製:每個資料塊沒有leader和follower之分,採用流水線的方式進行資料複製;

就近讀取:為了減少讀取時的網路io,採用就近讀取,加快讀取速率

資料一致性

資料一致性通常指關聯資料之間的邏輯關係是否正確和完整。而資料儲存的一致性模型則可以認為是儲存系統和資料使用者之間的一種約定。如果使用者遵循這種約定,則可以得到系統所承諾的訪問結果。常用的一致性模型有 a 嚴格一致性 linearizability,strict atomic consistency ...

資料一致性

丟失更新 未確定的相關性 不一致的分析和幻想讀 事務a讀取與搜尋條件相匹配的若干行。事務b以插入或刪除行等方式來修改事務a的結果集,然後再提交。幻讀是指當事務不是獨立執行時發生的一種現象,例如第乙個事務對乙個表中的資料進行了修改,比如這種修改涉及到表中的 全部資料行 同時,第二個事務也修改這個表中的...

資料一致性

資料一致性通常指關聯資料之間的邏輯關係是否正確和完整。而資料儲存的一致性模型則可以認為是儲存系統和資料使用者之間的一種約定。如果使用者遵循這種約定,則可以得到系統所承諾的訪問結果。常用的一致性模型有 a 嚴格一致性 linearizability,strict atomic consistency ...