文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
选举机制
控制器(Broker)选举
控制器就是一个Borker。
在Kafka集群中,有多个Broker节点,但是它们之间需要选举出一个Leader,其他的Broker充当Follower角色。
集群中第一个启动的Broker会通过在Zookeeper中创建临时节点
/controller
来让自己成为控制器。其他Broker启动时也会在Zookeeper中创建临时节点,但是发现节点已经存在,所以它们会收到一个异常,意识到控制器已经存在,那么就会在Zookeeper中创建Watch对象,便于它们收到控制器变更的通知。
优先副本选举
如果一个分区的Leader副本不可用,就意味着整个分区不可用,此时需要从Follower副本中选举出新的Leader副本提供服务。
优先副本
指一个分区所在的AR集合的第一个副本。
比如分区1,它的AR集合是
[2,0,1]
,表示分区1的优先副本就是在Broker2
上。
- 理想情况下,优先副本应该就是Leader副本。
对分区Leader副本进行选举的时候,尽可能让优先副本成为Leader副本。
控制器
控制器主要作用是在 ZooKeeper 的帮助下管理和协调整个 Kafka 集群。
集群中任意一台 Broker 都能充当控制器的角色,但是在运行过程中只能有一个 Broker 成为控制器。
Broker 在启动时,会尝试去 ZooKeeper 中创建 /controller
节点。
第一个成功创建
/controller
节点的 Broker 会被指定为控制器。
控制器的作用:
1.主题管理(创建、删除、增加分区)
2.分区重分配
3.Preferred 领导者选举
4.集群成员管理(新增 Broker、Broker 主动关闭、Broker 宕机)
自动检测新增 Broker、Broker 主动关闭及被动宕机。
- 比如,控制器组件会利用Watch 机制检查 ZooKeeper 的
/brokers/ids
节点下的子节点数量变更。目前,当有新 Broker 启动后,它会在
/brokers
下创建专属的 znode 节点。一旦创建完毕,ZooKeeper 会通过 Watch 机制将消息通知推送给控制器。
5.数据服务
向其他 Broker 提供数据服务。控制器上保存了最全的集群元数据信息,其他所有 Broker 会定期接收控制器发来的元数据更新请求,从而更新其内存中的缓存数据。
控制器故障转移(Failover)
当运行中的控制器突然宕机或意外终止时,Kafka 能够快速地感知到,并立即启用备用控制器来代替之前失败的控制器。
- 该过程是自动完成的。
幂等性
在 0.11.0.0
版本支持增加了对幂等的支持。幂等是针对生产者角度的特性。幂等可以保证上生产者发送的消息,不会丢失,而且不会重复。
开启幂等性配置
只需要把 Producer 的配置 enable.idempotence
设置为 true 即可
props.put(“enable.idempotence”, ture)
//或者
props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true)
底层具体实现原理就是用空间换时间的优化思路,即在broker端多存一些字段来标识数据的唯一性。
当Producer发送了具有相同字段值的消息后,broker会进行匹配去重,丢弃重复的数据。
他只能保证单分区上的幂等性,即一个幂等性Producer只能够保证某个topic的一个分区上不出现重复消息,无法实现多分区的幂等。此外,如果Producer重启,也会导致幂等重置。