Kafka竟然不支持讀寫分離!今天才知道!

在 Kafka 中,生產(chǎn)者寫入消息、消費者讀取消息的操作都是與 leader 副本進行交互的,從 而實現(xiàn)的是一種主寫主讀的生產(chǎn)消費模型。數(shù)據(jù)庫、Redis 等都具備主寫主讀的功能,與此同時還支持主寫從讀的功能,主寫從讀也就是讀寫分離,為了與主寫主讀對應(yīng),這里就以主寫從讀來稱呼!

Kafka 并不支持主寫從讀,這是為什么呢?

從代碼層面上來說,雖然增加了代碼復(fù)雜度,但在 Kafka 中這種功能完全可以支持。對于 這個問題,我們可以從“收益點”這個角度來做具體分析。主寫從讀可以讓從節(jié)點去分擔主節(jié) 點的負載壓力,預(yù)防主節(jié)點負載過重而從節(jié)點卻空閑的情況發(fā)生。但是主寫從讀也有 2 個很明顯的缺點:

  • 數(shù)據(jù)一致性問題。數(shù)據(jù)從主節(jié)點轉(zhuǎn)到從節(jié)點必然會有一個延時的時間窗口,這個時間 窗口會導致主從節(jié)點之間的數(shù)據(jù)不一致。某一時刻,在主節(jié)點和從節(jié)點中 A 數(shù)據(jù)的值都為 X, 之后將主節(jié)點中 A 的值修改為 Y,那么在這個變更通知到從節(jié)點之前,應(yīng)用讀取從節(jié)點中的 A 數(shù)據(jù)的值并不為最新的 Y,由此便產(chǎn)生了數(shù)據(jù)不一致的問題。
  • 延時問題。類似 Redis 這種組件,數(shù)據(jù)從寫入主節(jié)點到同步至從節(jié)點中的過程需要經(jīng) 歷網(wǎng)絡(luò)→主節(jié)點內(nèi)存→網(wǎng)絡(luò)→從節(jié)點內(nèi)存這幾個階段,整個過程會耗費一定的時間。而在 Kafka 中,主從同步會比 Redis 更加耗時,它需要經(jīng)歷網(wǎng)絡(luò)→主節(jié)點內(nèi)存→主節(jié)點磁盤→網(wǎng)絡(luò)→從節(jié) 點內(nèi)存→從節(jié)點磁盤這幾個階段。對延時敏感的應(yīng)用而言,主寫從讀的功能并不太適用。

現(xiàn)實情況下,很多應(yīng)用既可以忍受一定程度上的延時,也可以忍受一段時間內(nèi)的數(shù)據(jù)不一致的情況!

那么對于這種情況,Kafka 是否有必要支持主寫從讀的功能呢?

主寫從讀可以均攤一定的負載卻不能做到完全的負載均衡,比如對于數(shù)據(jù)寫壓力很大而讀 壓力很小的情況,從節(jié)點只能分攤很少的負載壓力,而絕大多數(shù)壓力還是在主節(jié)點上。而在 Kafka 中卻可以達到很大程度上的負載均衡,而且這種均衡是在主寫主讀的架構(gòu)上實現(xiàn)的。我們來看 一下 Kafka 的生產(chǎn)消費模型,如下圖所示:

Kafka竟然不支持讀寫分離!今天才知道!

在 Kafka 集群中有 3 個分區(qū),每個分區(qū)有 3 個副本,正好均勻地分布在 3個 broker 上,灰色陰影的代表 leader 副本,非灰色陰影的代表 follower 副本,虛線表示 follower 副本從 leader 副本上拉取消息。當生產(chǎn)者寫入消息的時候都寫入 leader 副本,對于上圖中的情形,每個 broker 都有消息從生產(chǎn)者流入;當消費者讀取消息的時候也是從 leader 副本中讀取 的,對于圖 8-23 中的情形,每個 broker 都有消息流出到消費者。

我們很明顯地可以看出,每個 broker上的讀寫負載都是一樣的,這就說明 Kafka 可以通過 主寫主讀實現(xiàn)主寫從讀實現(xiàn)不了的負載均衡。上圖展示是一種理想的部署情況,有以下幾種 情況(包含但不僅限于)會造成一定程度上的負載不均衡:

  • (1)broker 端的分區(qū)分配不均。當創(chuàng)建主題的時候可能會出現(xiàn)某些 broker 分配到的分區(qū)數(shù) 多而其他 broker 分配到的分區(qū)數(shù)少,那么自然而然地分配到的 leader 副本也就不均。
  • (2)生產(chǎn)者寫入消息不均。生產(chǎn)者可能只對某些 broker 中的 leader 副本進行大量的寫入操 作,而對其他 broker 中的 leader 副本不聞不問。
  • (3)消費者消費消息不均。消費者可能只對某些 broker 中的 leader 副本進行大量的拉取操 作,而對其他 broker 中的 leader 副本不聞不問。
  • (4)leader 副本的切換不均。在實際應(yīng)用中可能會由于 broker 宕機而造成主從副本的切換, 或者分區(qū)副本的重分配等,這些動作都有可能造成各個 broker 中 leader 副本的分配不均。

對此,我們可以做一些防范措施。

針對第一種情況,在主題創(chuàng)建的時候盡可能使分區(qū)分配 得均衡,好在 Kafka 中相應(yīng)的分配算法也是在極力地追求這一目標,如果是開發(fā)人員自定義的 分配,則需要注意這方面的內(nèi)容。對于第二和第三種情況,主寫從讀也無法解決。對于第四種 情況,Kafka 提供了優(yōu)先副本的選舉來達到 leader 副本的均衡,與此同時,也可以配合相應(yīng)的 監(jiān)控、告警和運維平臺來實現(xiàn)均衡的優(yōu)化。

在實際應(yīng)用中,配合監(jiān)控、告警、運維相結(jié)合的生態(tài)平臺,在絕大多數(shù)情況下 Kafka 都能 做到很大程度上的負載均衡。

總的來說,Kafka 只支持主寫主讀有幾個優(yōu)點:

可以簡化代碼的實現(xiàn)邏輯,減少出錯的可能;將負載粒度細化均攤,與主寫從讀相比,不僅負載效能更好,而且對用戶可控;沒有延時的影響;

在副本穩(wěn)定的情況下,不會出現(xiàn)數(shù)據(jù)不一致的情況。為此,Kafka 又何必再去實現(xiàn)對它而言毫無收益的主寫從讀的功能呢?這一切都得益于 Kafka 優(yōu)秀的架構(gòu)設(shè)計,從某種意義上來說,主寫從讀是由于設(shè)計上的缺陷而形成的權(quán)宜之計。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在 Kafka 中,生產(chǎn)者寫入消息、消費者讀取消息的操作都是與 leader 副本進行交互的,從 而實現(xiàn)的是一種主...
    java伯爵閱讀 384評論 0 0
  • 在 Kafka 中,生產(chǎn)者寫入消息、消費者讀取消息的操作都是與 leader 副本進行交互的,從 而實現(xiàn)的是一種主...
    Java機械師閱讀 396評論 0 0
  • 4. 設(shè)計思想 4.1 動機 我們設(shè)計的 Kafka 能夠作為一個統(tǒng)一的平臺來處理大公司可能擁有的所有實時數(shù)據(jù)饋送...
    瘋狂的橙閱讀 1,149評論 1 4
  • 簡介 Kafka從0.8.x版本開始引入副本機制,這樣可以極大的提高集群的可靠性和穩(wěn)定性。不過這也使得Kafka變...
    朱小廝閱讀 2,039評論 0 1
  • 林娜娜看著漆黑的夜空,多想放聲大哭一場,發(fā)泄內(nèi)心的無奈與郁悶。然而,她壓抑了內(nèi)心的最真感受,深深吸一口,把一...
    檸檬大媽閱讀 353評論 0 3

友情鏈接更多精彩內(nèi)容