producer采用push(推)的方式,将消息发布到broker中,每条消息都被追加到分区中,等待consumer拉取数据
保存数据是通过 消费者组+主题+分区 的格式保存
2、生产者ACk机制(生产数据)request.required.acks 参数为
0:可能数据丢失
生产者向leader发送数据,不管leader有没有接收到数据,都不会有任何返回值到producer,所以这种模式下可能造成数据丢失
1:可能数据重复
producer向leader发送数据,当leader收到数据,确认无误后返回ack到producer,然后producer会继续发送第二条数据。这种模式下的好处是不会造成数据丢失,但是缺点是,在leader收到数据后挂了,没有返回ack到producer,然后重试后leader重启了,producer没有收到ack,会认为没有收到数据,则会继续向leader发送数据,直到返回ack,所以可能会造成数据重复。
-1:和 isr 产生联系
第一种情况:比较少见,当在一个isr中只有一个leader和一个follower时,当leader挂掉,则会变成和参数1一样的情况,可能造成数据重复
第二种情况:一般情况,当参数设置为-1时,producer向leader发送数据,当leader接收到数据,并且向isr的每一个follower复制后才会向producer发送ack,接着才会发送第二条数据。
3、ISR(消费数据一致性问题)
**LEO:每个副本最大的offset**
HW:高水位
指的是消费者能见到的最大的offset,ISR队列最小的offset
高水位的设置规定了消费者看到的数据在任意一个副本上都是一致的,如果某一副本挂掉后,转移到其他副本上去不会造成消费者拉取数据不一致。
(1)follower故障
follower发生故障后,会将该follower提出isr,等待follower恢复后,follower会读取磁盘 HW 上次保存的位置,并将 log 高于 hw 的切掉,然后从leader中向follower同步数据。等待该follower的LEO大于该分区的HW后,即可加入isr
(2)leader故障
leader发生故障后,会从 isr 中的副本选择任意一个 follower 作为 leader ,为了保证数据一致性,其余的 follower 会将高于 HW 的部分切掉,然后从新的 leader 同步数据(多切少补)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)