Apache Kafka的4個混沌工程實驗 | IDCF

來源:混沌工程實踐 作者:李大山 原文作者:Andree Newman 原文來源:Gremlin.com 原文標(biāo)題:The first 4 chaos experiments to run on Apache Kafka
Apache Kafka是一個開放源代碼的分布式消息傳遞平臺,高吞吐量和低延遲交付數(shù)據(jù)。在規(guī)模上,它每天可以處理數(shù)萬億條記錄,同時還提供容錯、復(fù)制和自動災(zāi)難恢復(fù)功能。
盡管Kafka有許多不同的使用場景,但最常見的是作為應(yīng)用程序之間的消息broker。Kafka可以從多個上游源頭接收、處理和重新分配消息到多個下游使用者,而無需重新配置應(yīng)用程序。這就可以流式傳輸大量數(shù)據(jù),同時保持應(yīng)用程序的松散耦合,支持諸如分布式計算、日志記錄和監(jiān)控、網(wǎng)站活動跟蹤以及物聯(lián)網(wǎng)(IoT)設(shè)備通信之類的場景。
由于Kafka提供了應(yīng)用程序之間的關(guān)鍵管道,因此可靠性至關(guān)重要。我們需要計劃來減輕幾種可能的故障模式,包括:
消息broker中斷和其他不正常的群集狀況; Apache ZooKeeper失效,這是Kafka的關(guān)鍵依賴項; 上游和下游應(yīng)用程序中的故障。
一、Apache Kafka架構(gòu)概述
二、為何要對Kafka進行混沌工程?
三、在Kafka上運行混沌實驗
第一步:設(shè)定假說要回答的問題以及預(yù)期結(jié)果是什么。例如,如果實驗是測試承受broker中斷的能力,則假說可能會指出:“如果broker節(jié)點發(fā)生故障,則消息會自動路由到其他broker,而不會丟失數(shù)據(jù)?!?/span> 第二步:定義爆炸半徑,受實驗影響的基礎(chǔ)架構(gòu)組件。減小爆炸半徑限制了實驗可能對基礎(chǔ)架構(gòu)造成的潛在危害,同時還可以將精力集中在特定系統(tǒng)上。我們強烈建議從盡可能小的爆炸半徑開始,然后隨著對進行混沌實驗的適應(yīng)性提高,將其增大。另外,還應(yīng)該定義幅度,即注入攻擊的規(guī)?;蛴绊懥?。例如,低幅度的實驗可能是在生產(chǎn)者和broker之間的網(wǎng)絡(luò)流量中增加20毫秒的延遲。大幅度的實驗可能是增加500毫秒的延遲,因為這將對性能和吞吐量產(chǎn)生顯著的影響。與爆炸半徑一樣,從低幅度開始,然后逐漸增大。 第三步:監(jiān)控基礎(chǔ)架構(gòu)。確定哪些指標(biāo)將助力得出有關(guān)假說的結(jié)論,在測試之前進行觀測以建立基線,并在整個測試過程中記錄這些指標(biāo),以便可以監(jiān)測預(yù)期和意外的變化。借助Confluent平臺,我們可以使用Control Center從Web瀏覽器實時直觀地觀察群集的性能。 第四步:運行實驗。Gremlin允許以簡單、安全和可靠的方式在應(yīng)用程序和基礎(chǔ)架構(gòu)上運行實驗。我們通過運行注入攻擊來做到這一點,它提供了各種向系統(tǒng)中注入故障的方法。我們還要定義中止條件,這是我們應(yīng)該停止測試以避免意外損壞的條件。使用Gremlin,我們可以將狀態(tài)檢查定義為場景的一部分。通過狀態(tài)檢查,我們可以在進行注入攻擊時驗證服務(wù)狀態(tài)。如果基礎(chǔ)架構(gòu)運行不正常,并且狀態(tài)檢查失敗,將自動停止實驗。另外,我們可以使用內(nèi)置的暫停按鈕立即停止實驗。 第五步:從觀察結(jié)果得出結(jié)論。它是否證實或反駁了原先的假設(shè)?使用收集的結(jié)果來修改基礎(chǔ)架構(gòu),然后圍繞這些改進設(shè)計新的實驗。隨著時間的推移,重復(fù)此過程將有助于使Kafka部署更具韌性。本文中介紹的實驗絕不是詳盡無遺的,而應(yīng)將其作為在系統(tǒng)上進行實驗的起點。請記住,盡管我們正在Confluent平臺上運行這些實驗,但它們可以在任何Kafka集群上執(zhí)行。

假設(shè):磁盤I/O的增加將導(dǎo)致吞吐量的相應(yīng)下降。 結(jié)論:即使將磁盤I/O增加到150 MB/s以上,技術(shù)攻擊也不會對吞吐量或延遲產(chǎn)生明顯影響。兩項指標(biāo)均保持穩(wěn)定,我們的broker均未失去同步或復(fù)制不足,也沒有消息丟失或損壞。

使用更快的存儲設(shè)備,例如更高的RPM磁盤或固態(tài)存儲; 使用更有效的壓縮算法,例如Snappy或LZ4。
比追隨者低的時間間隔,發(fā)送連續(xù)的消息流,啟動實驗,并尋找使用者輸出中的空白(replica.fetch.wait.max.ms)。 發(fā)送消息后,立即使用Gremlin API從生產(chǎn)者應(yīng)用程序觸發(fā)混沌實驗。
假設(shè):由于領(lǐng)導(dǎo)者失敗,我們將丟失一些消息,但是Kafka將迅速選出新的領(lǐng)導(dǎo)者,并再次成功復(fù)制消息。 結(jié)果:盡管領(lǐng)導(dǎo)者突然失敗,消息列表仍顯示所有成功通過的消息。由于實驗前后記錄了額外的消息,因此我們的管道總共產(chǎn)生了336個事件,每個消息在上一個事件之后大約有100毫秒的時間戳。消息沒有按時間順序顯示,但這很好,因為Kafka不保證分區(qū)之間消息的順序。這是輸出示例:



假設(shè):Kafka的吞吐量將暫時停止,但是兩個broker節(jié)點都將重新加入群集,而不會出現(xiàn)問題。 結(jié)果:控制中心仍列出了三個broker,但顯示其中兩個不同步且分區(qū)復(fù)制不足。這是預(yù)料之中的,因為節(jié)點已經(jīng)失去了與其余broker和ZooKeeper的聯(lián)系。




假設(shè):Kafka可以忍受短期的ZooKeeper中斷,而不會崩潰,丟失數(shù)據(jù)或損壞數(shù)據(jù)。但是,直到ZooKeeper重新聯(lián)機之前,對群集狀態(tài)的任何更改都將無法解決。 結(jié)果:運行實驗對消息吞吐量或broker可用性沒有任何結(jié)果。正如我們所假設(shè)的,可以繼續(xù)產(chǎn)生和使用消息而不會出現(xiàn)意外問題。
四、進一步提高Kafka的可靠性


評論
圖片
表情

