一.kafka基本架构术语
Producer(生产者):kafka生产者向 kafka broker 发消息的客户端;
Consumer(消费者):kafka消费者向 kafka broker 取消息的客户端;
Consumer Group (消费者组):消费者组是由多个Consumer组成。不同消费者组之间可以同时消费数据,同一个消费者组之间按顺序消费数据
Broker:一个borke可以容纳多个topic(主题),一个kafka服务器就是一个borker。即消息处理结点。
Topic(主题):就是一个消息队列,生产者和消费者都面向一个topic
Partition:一个topic由多个partition组成,每个partition都是一个有序的队列
segment(段):由index和data文件组成,两个文件成对出现,分别存储索引和数据。
offset:是用于定位 位于segment里的唯一消息 ,相当于索引值;它是确定kafka消费者在消费数据的进度位置。
二.kakfa工作流程
数据可靠性的保证:为保证 producer (生产者) 发送的数据,能可靠的发送到指定的 topic,topic 的每个 partition 收到producer 发送的数据后,都需要向 producer (生产者) 发送 ack(acknowledgement 确认收到),如果producer 收到 ack,就会进行下一轮的发送,否则重新发送数据。
ack副本数据同步策略:
一:当follower半数以上同步完成,即可发送ack。
优点:延迟低
缺点:当选举新的leader时,如果有n台节点故障,需要2n+1台副本正常
二:当follower全部完成同步,才发送ack(比较常用)
优点:当选举新的leader时,如果有n台节点故障,需要n+1台副本正常
缺点:网络延迟比较高
kafka选择了第二种方案:因为第一种方法会造成大量数据的冗余,而第二种方案虽然网络延迟比较高,但是对kakfa影响比较小
ISR机制:
问题提出:当我们选择第二种方案之后,如果其中有一个follwer发生故障,那leader要 一直等待,直到同步完成才能发送adc。
问题解决:Leader 维护了一个动态的 in-sync replica set 称(ISR),和 leader 保持同步的 follower 集合。当follwer长时间为向lader同步数据,该follower将被踢出ISR 。该时间的值是由replica.lag.time.max.ms参数设定。Leader发生故障之后就会从ISR中选举新的leader。
acks参数配置:
acks=0:有可能造成数据丢失
acks=1:也有可能造成数据丢失
acks=-1:不会造成数据丢失,但会造成数据重复(特殊情况下:当ISR中只有一个leader时也会造成数据丢失,这种情况很少见)
三.分区分配策略
上面提到一个消费者组(consumer group)有多个消费者(consumer),而一个主题(topic)有多个partition组成。所以就会涉及到Partition的分配问题,即确定那个 partition 由哪个 consumer 来消费。
kafka有两种分配策略:第一种是RoundRobin,第二种是Range。
RoundRobin:轮巡分配,按照每个分区挨个的分配给每个消费者
好处:每个消费者之间插值比较小,最多差一个
缺点:当前消费者 消费的订阅的主题必须是一样的
Range(默认):按照单个主题来分的
缺点:消费者消费的数据不对等问题