首先来看下Kafka的基本结构:
图1. kafka基本结构图
图2.(图片来自官网)
1.Broker:
一个Broker相当于Kafka集群中的一个节点,一个Broker中包含1个或者多个分区。
2.Topic:
相当于给每个消息打上标签,这个Topic的消息只能够由 这个Topic的消费者进行消费。
3.Partition:
在实际使用中,同一个Topic可能有多个生产者,如果这些生产者使用同一个队列的结构,那么数据的写入效率会比较低下,这时候使用多个分区的结构,数据的写入能够错开,这无疑提升了系统的写入效率,Kafka正式采用了这种思路,设计了Partition的概念,在同一个Topic中默认设置了50个分区,当然这个数值是可以更改的,可以通过设置:offsets.topic.num.partitions参数,进行更改,kafka默认会创建__consumer_offsets分区,用来存放消费者消费某一个主题的偏移量。
图3.(图片来自官网)
4.Replicas:副本是一种备份机制,集群中会通过选举机制选出一个Leader,然后将数据同步到不同的Follower上。
5.ISR:
ISR简单说就是一个列表,Leader通过这个列表中节点进行选举,用于标记当前的哪些Follower能够跟上Leader,Leader固定在这个列表中,如果有一个节点性能比较差,那么会被踢出ISR集合。
6.ConsumerGroup(消费者组)
图4. 消费者组消费topic01
为了保障消费的顺序,在Kafka中一个分区只能够被一个消费组里的某个消费者消费,也就是说同一个消费者组中的消费者是没有办法消费同一个分区的,具有互斥性。
7.ACK相关的概念与配置
消息在处理的过程中难免会存在重复或者丢失的问题,引入ACK机制能够很好的处理上述的问题,在Kafka中ACK有三个值,分别为1,0,-1;
当设置为-1时,leader收到消息并且和至少一台follower进行了数据同步,才会返回ack给消息的生产者,这种配置下系统的性能比较差,但是安全性比较好;
当设置为0时,这时候生产者就是一个“无情的生产机器”,只管发送数据,因为不管消息收到与否,都会收到ACK消息,这种情况下系统的性能比较好,但是安全性比较差。
当设置为1时,这时候相当于在前面两种情况中做了一个均衡,之要Leader收到了消息,并成功将消息写入log中才会返回ACK给生产者。
8.集群Controller
在kafka节点启动的时候会向zk注册一个临时的节点,然后会将顺序最小的那个节点作为集群的controller,主要负责集群leader的选举,同步消息给其他的broker等。
9. rebalance机制
Kafka集群创建之后,如果要增删分区,或者消费者组有变化,这时候会引入rebalance机制,分区分配方式主要有range
、round-robin
、sticky
三种。
- range策略:按照分区序号排序,前面的消费者是分区总数/消费者数量+1,之后的消费者是分区总数/消费者数量。
- round-robin策略:轮询分配。
- sticky策略:如果需要rebalance,会在之前已分配的基础上调整,不会改变之前的分配情况。如果这个策略没有开,那么就要进行全部的重新分配。
10.LEO以及HW
LEO:表示某个副本最后的消息位置
HW:标记已经完成同步的位置,当所有的broker都完成消息同步之后,hw才会发生变化。在HW更新之后,消费者才能消费掉这条消息,其数值一定是小于LEO的,如下图所示:
图5.(图片来自官网)
总结
本文主要是对kafka中的基础概念进行了总的一个概括,方便初学者对这一消息中间件有一个大致的认识,后续笔者将会补充若干文章,对kafka进行更加详细的介绍。