【这是一篇7月份躺在草稿箱的文章,今天翻出来整理一下。】
数据生产流程
1.发送到kafka的数据会封装为ProducerRecord对象,包含topic、partition、key、value信息;
2.调用send()方法后,将数据序列化为字节数组,如果没有指定分区 ,那么分区器会根据ProducerRecord 对象的键来计算一个分区;
3.当消息达到一个批次设定的量(消息放在缓冲区中),通过网络发送到不同的主题,不同的分区;
4.如果消息成功写入 Kafka,就返回 一 个
RecordMetaData 对象,它包含了主题和分区信息,以及记录在分区里的偏移量。如果写入
失败, 则告知生产者尝试重新发送消息,达到最大重试次数就抛出异常。
数据复制
第一个注册到Zookeeper的broker为Contrllor,除了具有一般 broker 的功能之外,还负责加入集群的broker上的分区首领的选举(以及离开集群的broker上的首领分区的重新选举)。
- kafka中,每一个partition,有一个leader(所以集群并不是一定只有一个leader,可能有多个leader),其他follower去拉取数据。
考虑到数据的一致性,Kafka中,消费者只能读取被commit的数据,因为如果允许消费者读取非commit的数据,考虑消费者1读取机器A中的数据,而该数据只有A和leader中有数据,其他flower还没与pull复制,这个时候leader和A挂了