狀態(tài)一致性有三種級別:
- 最多一次 (AT-MOST-ONCE) : 只處理一次 , 遇到故障就會丟失 , 優(yōu)點(diǎn) : 處理快
- 至少一次 (AT-LEAST-ONCE) : 不會丟失數(shù)據(jù) , 但存在重復(fù)數(shù)據(jù)
- 精確一次(EXACTLY-ONCE) : 不會丟失數(shù)據(jù) , 也不會重復(fù)數(shù)據(jù)
實(shí)現(xiàn)要求 :
- 端到端 (end-to-end) 的狀態(tài)一致性 : 數(shù)據(jù)源、流處理器、外部存儲系統(tǒng)都要有保證機(jī)制
- at-least-once 級別 : 數(shù)據(jù)源能重放數(shù)據(jù)
端到端精確一次
端到端精確一次 (end-to-end exactly-once) 的關(guān)鍵點(diǎn) :
- 輸入端 : 數(shù)據(jù)能重放數(shù)據(jù) (如 : Kafka)
- Flink 靠檢查點(diǎn)機(jī)制 , 能實(shí)現(xiàn)
exactly-once
一致性語義 - 輸出端 : 冪等 (主鍵) , 事務(wù) (倆階段提交)
輸入端
輸入端 :
- 要實(shí)現(xiàn)端到端一致性 , 要輸入數(shù)據(jù)源能重放數(shù)據(jù)
socket/Kafka 區(qū)別 :
- socket : 當(dāng)故障后 , 無法重新發(fā) , 就會丟失數(shù)據(jù)
- kafak : 當(dāng)故障后 , 能通過位點(diǎn) , 重新獲取數(shù)據(jù) , 就能保證不丟失數(shù)據(jù)
輸出端
要保證 exactly-once 一致性 , 需要輸出支持 :
- 冪等寫入 (idempotent) : 重復(fù)執(zhí)行,只會導(dǎo)致一次結(jié)果修改 , 如 : Redis , MySQL 更新操作
- 事務(wù)寫入 (transactional) : 事務(wù)隨著檢查點(diǎn) , 提交或回滾
事務(wù)寫入的思想 :
- 事務(wù)控制數(shù)據(jù)向外部系統(tǒng)的寫入 , 并與檢查點(diǎn)綁定
- 當(dāng) Sink 任務(wù)遇到 barrier 時,就保存狀態(tài), 并開啟一個事務(wù)
- 當(dāng)當(dāng)前檢查點(diǎn)保存完畢,就提交事務(wù)
- 當(dāng)出現(xiàn)故障,狀態(tài)就回退到上個檢查點(diǎn),事務(wù)也回滾
事務(wù)寫入的倆個實(shí)現(xiàn)方式 :
- 預(yù)寫日志 (write-ahead-log , WAL)
- 兩階段提交 (two-phase-commit , 2PC) : 先預(yù)提交 , 等檢查點(diǎn)完畢 , 再正式提交
預(yù)寫日志
預(yù)寫日志 (WAL) 的實(shí)現(xiàn)步驟 :
- 先把結(jié)果數(shù)據(jù)作為日志 (log) 狀態(tài)保存
- 在檢查點(diǎn)保存時,也將結(jié)果數(shù)據(jù)一起持久化存儲
- 當(dāng)收到檢查點(diǎn)完成的通知時,再將所有結(jié)果一次性寫入外部系統(tǒng)
- 當(dāng)寫入所有數(shù)據(jù)成功后,再次確認(rèn)相應(yīng)的檢查點(diǎn),并將確認(rèn)信息進(jìn)行持久化保存
缺點(diǎn) :
- 一次性寫入 , 有些性能問題
- 再次確定時出現(xiàn)故障 , 會導(dǎo)致重復(fù)寫入
兩階段提交
實(shí)現(xiàn)步驟 :文章來源:http://www.zghlxwxcb.cn/news/detail-502298.html
- 當(dāng)?shù)谝粭l數(shù)據(jù)到, 或收到檢查點(diǎn)的分界線時,Sink 就啟動事務(wù)
- 所有數(shù)據(jù)寫入 , 但事務(wù)未提交,都是 預(yù)提交 狀態(tài)
- 當(dāng) Sink 任務(wù)收到檢查點(diǎn)完成時,就提交事務(wù)
- 當(dāng)出故障 , 當(dāng)前事務(wù)就回滾 , 寫入數(shù)據(jù)就撤回
2PC 對外部系統(tǒng)的要求 :文章來源地址http://www.zghlxwxcb.cn/news/detail-502298.html
- 外部系統(tǒng)要提供事務(wù)支持,或 Sink 任務(wù)能模擬外部系統(tǒng)上的事務(wù)
- 檢查點(diǎn)的間隔時,能開啟事務(wù) , 并接受數(shù)據(jù)寫入
- 在收到檢查點(diǎn)完成之前,都是等待提交狀態(tài)
- Sink 任務(wù), 能在進(jìn)程失敗后 , 恢復(fù)事務(wù)
- 提交事務(wù)要冪等 : 事務(wù)的重復(fù)提交是無效的
到了這里,關(guān)于Flink 狀態(tài)一致性的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!