kafka
Kafka判断一个节点是否还活着的条件?
- 节点必须可以维护和ZooKeeper的连接,Zookeeper通过心跳机制检查每个节点的连接
- 如果节点是个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中拉取的方式。
拉取的优势
拉取能够避免不同消费者不同消费速率造成的数据积压问题。
不足之处
拉取操作会不停询问kafka是否有新数据,在kafka中没有数据时,会陷入循环之中,返回空数据。
kafka的生产分区策略
对于多个partition的topic,消费者生产数据到kafka时,kafka自动采取负载均衡策略。将消息轮询发给不同的partition。
kafka的消费分区策略
存在两种分区策略,默认是范围分配
轮询
按组分配
轮询是将该消费者所订阅的所有topic的partition当作一个整体进行哈希后的结果,轮询分配给消费者组的所有消费者。
该方法容易出现问题
- 两个消费者同时消费两个topic的数据,经过分配之后每个消费者只能消费到一个topic的数据。
- 两个消费者消费三个topic的数据,A消费1和2,B消费2和3,因为kafka是把该消费者订阅的所有topic当作一个整体哈希后分配。经过分配后,A消费到3的数据,B消费到1的数据。
范围【默认】
按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.
在kafka的_consumer_offsets这个topic中,消费者的消费操作相当于生产者,生产的数据是消费的偏移变化数据,不断的发送到该topic中。
然后消费者去消费数据时,会从该topic中再消费数据,通过<consumer group + topic + partition>作为key值,就能取到该消费者所在的组消费该topic该分区的偏移值。
维护的offest按照消费者组保存。不同消费者组不同topic不同分区会维护一个offest。具体为:
<consumer group + topic + partition>
因为对于同一条数据,同一个消费者组只有一个消费者能够消费到。
kafka实现高效读写
- 顺序写磁盘减少寻址操作。与随机写数据不是一个量级。
- 零拷贝技术。
zk在kafka集群中的作用
在zookeeper中会维护一个controller
该controller是kafka集群中的某个broker。通过选举产生一个controller,负责管理broker集群的上下线,所有topic分区的副本分配和leader选举工作。
zookeeper负责controller的选举。