2017-10-28 109 views
1

在使用持久狀態存儲託管KafkaStream(0.10.2.1)實例的多個節點的部署中,推薦重新啓動所有方法同時避免重播整個狀態存儲變更日誌主題?這必須在不改變application.id的情況下完成,因爲我不想丟失我已經在州商店中擁有的數據。如何以避免從其更改日誌主題重新創建狀態存儲的方式重新啓動KafkaStreams使用者組

我增加了session.timeout.ms,這樣當代理開始重新分配分區時,所有節點都會啓動,並避免調用KafkaStreams.stop來防止不必要的分區重新分配,因爲我在部署期間重新啓動所有節點。

當代理開始重新分配分區時(在所有節點都啓動後),看起來KafkaStreams實例正在重放整個狀態存儲更改日誌主題,而不是從重新啓動之前它們到達的偏移量中取出。

我想,爲了從最新的挑抵消這些條件必須滿足:

1)分區將被分配到含有與其相配套的持久化存儲的實例。

2)KafkaStreams將從changelog主題中的最新偏移量中選取,而不是重播整個更改日誌。

有沒有辦法做到這一點?

回答

2

Kafka Streams寫入用於跟蹤狀態存儲的健康狀況的本地狀態和本地檢查點文件。如果缺少檢查點文件,則表示損壞的狀態存儲庫,因此Kafka Streams通過重播狀態存儲庫的更改日誌主題從頭開始清除存儲並重新創建它。

這些本地檢查點文件僅在0.10.2.1的乾淨關閉時寫入。因此,因爲你不打電話給KafakStreams#close(),你不會得到一個乾淨的關機(這可能會破壞你的狀態,因爲有些寫操作可能沒有刷新到磁盤)。

在Kafka 0.11.0.x中,本地檢查點文件寫在每次提交時允許更積極地重用本地狀態存儲。

我強烈建議升級到0.11.0.1或1.0.0(即將發佈) - 它包含許多有關狀態存儲處理和重新平衡的改進。請注意,您不必升級您的經紀人爲此,卡夫卡流與舊經紀人兼容,太(參見https://docs.confluent.io/current/streams/upgrade-guide.html#compatibility

+0

我明白,但將分區重新分配給那些KafkaStreams實例管理伴隨狀態店?請注意,StandbyTasks與我重新啓動所有KafkaStreams實例無關。 –

+0

沒有保證,但我們使用「粘性分配」策略,試圖將分區重新分配到其以前的實例。 –

相關問題