轉載:http://www.aboutyun.com/thread-21104-1-1.htmlhtml
1.概述apache
目前,Kafka 官網最新版[0.10.1.1],已默認將消費的 offset 遷入到了 Kafka 一個名爲 __consumer_offsets 的Topic中。其實,早在 0.8.2.2 版本,已支持存入消費的 offset 到Topic中,只是那時候默認是將消費的 offset 存放在 Zookeeper 集羣中。那如今,官方默認將消費的offset存儲在 Kafka 的Topic中,同時,也保留了存儲在 Zookeeper 的接口,經過 offsets.storage 屬性來進行設置。
2.內容
其實,官方這樣推薦,也是有其道理的。以前版本,Kafka其實存在一個比較大的隱患,就是利用 Zookeeper 來存儲記錄每一個消費者/組的消費進度。雖然,在使用過程中,JVM幫助咱們完成了一些優化,可是消費者須要頻繁的去與 Zookeeper 進行交互,而利用ZKClient的API操做Zookeeper頻繁的Write其自己就是一個比較低效的Action,對於後期水平擴展也是一個比較頭疼的問題。若是期間 Zookeeper 集羣發生變化,那 Kafka 集羣的吞吐量也跟着受影響。
在此以後,官方其實很早就提出了遷移到 Kafka 的概念,只是,以前是一直默認存儲在 Zookeeper集羣中,須要手動的設置,若是,對 Kafka 的使用不是很熟悉的話,通常咱們就接受了默認的存儲(即:存在 ZK 中)。在新版 Kafka 以及以後的版本,Kafka 消費的offset都會默認存放在 Kafka 集羣中的一個叫 __consumer_offsets 的topic中。
固然,其實她實現的原理也讓咱們很熟悉,利用 Kafka 自身的 Topic,以消費的Group,Topic,以及Partition作爲組合 Key。全部的消費offset都提交寫入到上述的Topic中。由於這部分消息是很是重要,以致因而不能容忍丟數據的,因此消息的 acking 級別設置爲了 -1,生產者等到全部的 ISR 都收到消息後纔會獲得 ack(數據安全性極好,固然,其速度會有所影響)。因此 Kafka 又在內存中維護了一個關於 Group,Topic 和 Partition 的三元組來維護最新的 offset 信息,消費者獲取最新的offset的時候會直接從內存中獲取。安全