- Zookeeper帮助kafka集群运行:存储一些元数据,还会帮助kafka集群进行管理(选主)
- 存储关于消费者消费了哪些topic到那个进度的数据。
存在的问题:kafka在0.8以前的版本中,并不提供high available机制,一旦一个或者多个broker宕机,则宕机期间其上的partition都无法继续提供服务。若该broker永远不能回复或磁盘故障,则其上数据丢失。但是对于分布式来说尤其是集群上升到一定规模,一台或者多台机器宕机的可能性大大提高,对failover要求非常高。因此kafka开始在0.8版本以后提供高可用机制。
解决的问题:Kafka的HA就是在数据层面上,即丢失一份数据,Consumer仍然可以正常消费(也表示一个broker宕机了,其上面的数据不会丢失)。
解决的方案:使用replication(副本,对同一个数据进行数据备份)。其中副本之间有主副本和从副本之分(由zookeeper选出),每一个broker都会存储一些主副本,保证kafka集群的负载均衡。
- 使用zookeeper给多个副本的broker进行选主,选出一个leader
这个leader相当于zookeeper中的一个临时节点,如果leader宕机之后,zookeeper会再次选主,如果ISR列表中所有的follower都宕机了,此时会等待,等待ISR列表有一个follower重新可以使用的时候,这是就将这个follower变成leader。(ISR是kafka在zookeeper中维护的一个可使用的集群节点列表)
- 在进行写数据的时候,首先向leader写入数据(主副本)
- 其他的broker(follower)到leader中fetch数据(从副本)
- 数据抓取完成后,会向leader返回(ack)信息
解释 :在leader中会维护一个ISR(同步副本的列表),列表中存放的是所有的有效的follwer, 在这个列表中如果follower的数据和leader的数据落后太多的话(默认是4000条数据)或者一定时间没有向leader发送fetch请求(默认是10秒),这时候会自动的将这个follwer剔除这个ISR列表中,在这个ISR列表中,每一个follower进行fetch完成数据,就会向leader发送数据,最终leader如果接受到所有的follower反馈,然后向producer进行反馈,发送ACK。
其中ACK表示Producer写入数据的返回级别:
0 表示只要producer发送数据,就表示写数据成功
1 表示只要leader写入成功,就表示写数据成功
all /-1 表示所有的副本写成功,才认为数据写入成功
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。