1.怎么尽可能保证 Kafka 的可靠性
kafka是可能会出现数据丢失问题的,Leader维护了一个动态的in-sync replica set(ISR),意为和 Leader保持同步的Follower+Leader集合(leader:0,isr:0,1,2)。
如果Follower长时间未向Leader发送通信请求或同步数据,则该Follower将被踢出ISR。该时间阈值由replica.lag.time.max.ms参数设定,默认30s。例如2超时,(leader:0, isr:0,1)。 这样就不用等长期联系不上或者已经故障的节点。
ISR: 可用的,存活的,Leader+Follower
如果分区副本设置为1个(只有一个leader),或者ISR里应答的最小副本数量 ( min.insync.replicas 默认为1)设置为1,和ack=1的效果是一样的,仍然有丢数的风险(leader:0,isr:0)。
• 数据完全可靠条件 = ACK级别设置为-1 + 分区副本大于等于2 + ISR里应答的最小副本数量大于等于2
副本数是2,但是ISR中不一定有两个,因为会挂掉。
2.Kafka中如何做到数据唯一,即数据去重
至少一次(At Least Once)= ACK级别设置为-1 + 分区副本大于等于2 + ISR里应答的最小副本数量大于等于2 可以保障数据可靠
• 最多一次(At Most Once)= ACK级别设置为0
• 总结:
At Least Once可以保证数据不丢失,但是不能保证数据不重复;
At Most Once可以保证数据不重复,但是不能保证数据不丢失。
• 精确一次(Exactly Once):对于一些非常重要的信息,比如和钱相关的数据,要求数据既不能重复也不丢失。 --幂等性和事务可以保障数据精确一次
Kafka 0.11版本以后,引入了一项重大特性:幂等性和事务。
幂等性:
幂等性就是指Producer不论向Broker发送多少次重复数据,Broker端都只会持久化一条,保证了不重复。
精确一次(Exactly Once) = 幂等性 + 事务+至少一次( ack=-1 + 分区副本数>=2 + ISR最小副本数量>=2) 。
幂等性有点类似于sql语句中的 distinct
重复数据的判断标准:具有 <PID, Partition, SeqNumber>相同主键的消息提交时,Broker只会持久化一条。其 中PID是Kafka每次重启都会分配一个新的;Partition 表示分区号;Sequence Number是单调自增的。
所以幂等性只能保证的是在单分区单会话(重启会话就是下一次了)内不重复。
如果kafka集群挂了,重启了,此时以前的数据还会发送一回,数据又重复了。
如何使用幂等性
开启参数 enable.idempotence 默认为 true,false 关闭。
幂等性只能保障服务器不挂掉的情况下,发送数据是唯一的,假如发送者服务器挂掉了,那么重启之后还是会发送重复的数据,所以需要使用事务。kafka事务原理如下图:
每一个broker都有一个事务协调器,如何知道本次事务是哪个broker对应的事务协调器呢,有一个算法,如上图所示。
3.生产者如何提高吞吐量
1、batch.size:批次大小,默认16k
2、linger.ms:等待时间,修改为5-100ms
3、compression.type:压缩snappy
4、 RecordAccumulator:缓冲区大小,修改为64m
4.zk在kafka集群中有何作用
zk中有一个节点 consumers 这个里面,老版本0.9版本之前,存放的是消费者的偏移量(offset,这次消费者消费到哪个地方了,下次从这个地方继续消费),新版本的根本没放在zk中,直接放在集群中了。
5.简述kafka集群中的Leader选举机制
1)每一个broker上线时,会在zk中进行注册
2)每个broker中都有一个controller,controller会争先抢占zk中 controller节点的注册权,谁先抢到,谁选举时说了算。假如broker0中的controller中抢到了,那它就是说了算的人。该controller一直监听ids节点是否有挂掉的节点。
3)选举规则是:在ISR中存活为前提,按照AR中排在前面的优先,例如 ar[1,0,2] ,isr[1,0,2],那么Leader会按照1,0,2 进行顺序的轮询。
4)选举出来的新节点,注册到zk中,将信息记录在zk中。
5)其他contorller将zk中的信息同步下来。
6)假定broker中的leader挂掉了,会进行重新的选举。
7)客户端发送消息给Leader,Leader记录数据,落盘,形成Log,Log底层使用的是Segment,Segment底层每一个G,是一个单独的文件,1G内的数据要想查找迅速又分成了两个文件 log和index
6.kafka是如何处理数据乱序问题的
-
分区保证顺序:Kafka 将消息按 分区 存储,每个分区内部的消息顺序是严格保证的。当消费者从一个分区消费消息时,消息的消费顺序与其写入顺序一致。
-
分区策略:生产者可以根据消息的
key
将消息发送到特定分区,确保同一个key
的消息始终发送到同一个分区,从而保持顺序。 -
消费者组管理:每个消费者组内部的每个消费者处理不同的分区。Kafka 确保每个分区只会有一个消费者来消费,从而避免了同一个分区的消息乱序。
-
幂等性和重试机制:为了避免消息丢失和乱序,Kafka 允许生产者启用幂等性,确保重复消息不会影响顺序,并且支持重试机制来保证消息成功传输。
7.kafka中节点如何服役和退役
服役:
创建一个新节点然后执行负载均衡流程。
负载均衡流程:
首先创建一个有kafka集群的新节点,创建一个要均衡的主题,即在kafka集群下创建一个json文件,里面记录着主题名字及版本信息。在一个新节点上生成一个负载均衡计划,生成的计划是一个json格式的文本,创建副本存储计划即将该文本复制到自己目录的一个json文件下,执行该计划并验证。
退役:
先按照退役一台节点,生成执行计划,然后按照服役时操作流程执行负载均衡。
8.Kafka中Leader挂了,Follower挂了,然后再启动,数据如何同步
Follower:由于数据同步的时候先进入Leader,随后同步给Follower,假如Follower挂掉了,Leader和其他的Follower 继续往前存储数据,挂掉的节点从ISR集合中剔除,此时挂掉的Follower又重启了,它会先从上一次挂掉的节点的HW开始同步数据,直到追上最后一个Follower为止,此时会重新回归ISR。
Leader:
9.kafka中初始化的时候Leader选举有一定的规律,如何打破这个规律呢
在生产环境中,每台服务器的配置和性能不一致,但是Kafka只会根据自己的代码规则创建对应的分区副本,就会导致个别服务器存储压力较大。所有需要手动调整分区副本的存储。
例如需求:创建一个新的topic,4个分区,两个副本,名称为three。将 该topic的所有副本都存储到broker0和broker1两台服务器上。
可以这样做:
创建一个新的 topic,名称为 three,查看分区副本存储情况,创建副本存储计划(所有副本都指定存储在 broker0、broker1 中),执行副本存储计划,验证副本存储计划