kafka

Kafka判断一个节点是否还活着的条件?

  1. 节点必须可以维护和ZooKeeper的连接,Zookeeper通过心跳机制检查每个节点的连接
  2. 如果节点是个follower,他必须能及时的同步leader的写操作,延时不能太久

kafka生产者是否能够指定partition传输

可以指定

在将发送数据包装成ProducerRecord的时候可以传入partition参数。

kafka如何保证读取有序

kafka可以保证区内(同一个partition)有序

kafka中ISR,HW,LEO分别是什么?

ISR:是一个数据保存的副本列表

HW:High watermark ,意思是一条数据的所有副本中可能会存在数据不一致的情况,hw代表的是副本中最低的偏移位置。

LEO:log end offest,区别于hw,leo代表的是所有副本中的最大偏移位置。

kafka如何保证精确一次

at Most once:至多一次,也就是ack设置为0的时候,只发送一次,不管是否能够接收到。不会再次发送。但是可以保证数据不重复。

at Least once:至少一次,ack设置为-1,保证数据从生产者到kafka不会丢失。但不能保证数据不重复。

Exactly once:精确一次。介于最多一次和至少一次之间。at Most once + 幂等性 = at Least once。其中幂等性简单来说就是通过去重方法保证数据不重复。

实现幂等性的方法是生产者在连接broker时,broker会分配一个pid,发送的每一条数据都会附带一个序列号,作为主键的key会在broker进行缓存,传入数据时进行判断,重复则不执行持久话操作。

但是 。。该方法只能是保证同一分区中数据不重复,跨区,跨session都不能保证。

kafka消费的方式

kafka的消费者采用从partition中拉取的方式。

拉取的优势

  1. 拉取能够避免不同消费者不同消费速率造成的数据积压问题。

不足之处

  1. 拉取操作会不停询问kafka是否有新数据,在kafka中没有数据时,会陷入循环之中,返回空数据。

kafka的生产分区策略

对于多个partition的topic,消费者生产数据到kafka时,kafka自动采取负载均衡策略。将消息轮询发给不同的partition。

kafka的消费分区策略

  1. 存在两种分区策略,默认是范围分配

  2. 轮询
    按组分配
    轮询是将该消费者所订阅的所有topic的partition当作一个整体进行哈希后的结果,轮询分配给消费者组的所有消费者。
    该方法容易出现问题

    1. 两个消费者同时消费两个topic的数据,经过分配之后每个消费者只能消费到一个topic的数据。
    2. 两个消费者消费三个topic的数据,A消费1和2,B消费2和3,因为kafka是把该消费者订阅的所有topic当作一个整体哈希后分配。经过分配后,A消费到3的数据,B消费到1的数据。
  3. 范围【默认】
    按topic分配
    该方法是针对订阅的每个topic进行处理。将topic的所有partition进行范围分配。
    该方法可能出现的问题
    两个消费者A,B,同时消费t1,t2。每个topic都存在三个parition,在范围分配时会出现这样的问题,
    A消费者分配到了t1的0,1,然后由分配到了t2的0,1。
    B只分配到了t1的2和t2的2。
    这种情况下,造成两个消费者的处理量级分配不均。

2.消费者发生变化时,会重新分配。

3.当消费者个数大于parition个数时会重新分配,最后会有剩余消费者没有被分配到。

kafka中offset的维护

kafka的offest会在broker中和zk中分别维护。根据版本的不同offest的保存位置不同。

0.9之前的版本保存在zk中,目录是consumergroup/topic/partition/

0.9之后保存在kafka的内置topic中。topic为_consumer_offsets.

  1. kafka_consumer_offsets这个topic中,消费者的消费操作相当于生产者,生产的数据是消费的偏移变化数据,不断的发送到该topic中。
  2. 然后消费者去消费数据时,会从该topic中再消费数据,通过<consumer group + topic + partition>作为key值,就能取到该消费者所在的组消费该topic该分区的偏移值。

维护的offest按照消费者组保存。不同消费者组不同topic不同分区会维护一个offest。具体为:

  1. <consumer group + topic + partition>
  2. 因为对于同一条数据,同一个消费者组只有一个消费者能够消费到。

kafka实现高效读写

  1. 顺序写磁盘减少寻址操作。与随机写数据不是一个量级。
  2. 零拷贝技术。

zk在kafka集群中的作用

在zookeeper中会维护一个controller

该controller是kafka集群中的某个broker。通过选举产生一个controller,负责管理broker集群的上下线,所有topic分区的副本分配和leader选举工作。

zookeeper负责controller的选举。