话不多说,线上一张基本名词思维导图
Broker:
Kafka集群中包含一个或者多个服务器,每个服务器节点称为一个broker。
Producer:
生产者。即消息的发布者,其会将某topic的消息发布到相应的partition中。
Topic:
主题、逻辑概念,一类消息的标识。Kafka可以同时负责多个topic的分发。
Partition:
kafka 中 Topic 被分成多个 Partition 分区。Topic 是一个逻辑概念,Partition 是最小的存储单元,掌握着一个 Topic 的部分数据。每个 Partition 都是一个单独的 log 文件,每条记录都以追加的形式写入。
1、 一个Topic可以配置几个Partition,
2、 Producer发送的消息分到不同的Partition中
3、 Consumer接收数据是按照 Consumer Group(消费组)来接接收,kafka确保每个Partition在同一个Consumer Group(消费组)只能由其中一个消费者消费。
Partitioner(分区器):
分区选择器,作用就是为消息分配分区。默认使用murmur2对key进行hash计算,然后对于总分区数去模,得到对应的分区号,然后消息就发往该分区。Producer可以实现自定义分区器,或者指定特定的分区。只需要实现Partitioner接口。
Partition Leader
Kafka为了到达高可用,每个分区(Partition)都会多个副本,其中有且仅有一个作为leader,leader负责当前消息的读写Partition。
Partition Follower
所有 Follower 都需要从 Leader 同步消息,Follower 与 Leader 始终保持消息同步。
partition leader 与 follower 是主备关系,而非主从。
AR
Assigned Replicas 同步副本,AR=ISR+OSR
ISR
ISR,In-Sync Replicas,是指及时副本同步列表,消息同步的频率或者时效达到一定要求副本。
OSR
Outof-Sync Replicas 消息同步存在滞后情况的副本集合
ProducerInterceptor(生产者拦截器)
拦截器功能最早出现在kafka0.10.0.0中,kafka一共两种拦截器:生产者拦截器、消费者拦截器。
生产者拦截器可以用来在消息发送前做一些处理,例如按照某个规则过滤不符合要求的消息、修改消息的内容等,也可以用来在发送回调逻辑前做一些定制化的需求。比如统计类的工作。
RecordAccumulator(消息收集器)
Kafka中的消息发送并不是一条一条发送的,因为一条条发送效率低,对网络带宽也有一定影响。因此kafka生产者(Producer)主线程,会建立一个消息缓存区,用于存储需要发送的消息,该缓存区的大小可以通过buffer.memory参数配置,默认值为33554432B,即32M。该缓存区会以分区为单位维护一个双端队列,将消息缓存起来。当达到一定的条件,会唤醒生产者(Producer)的Sender线程发送改缓存队列中的消息。如果生产者发送消息的速度超过发送到服务器的速度,则会导致空间不足。这个时候kafkaProducer的send()方法调用会被阻塞。要么抛出异常。
ProducerBatch:
消息批记录,双端队列的元素。及消息累加器中的最小单位。
Consumer:
消费者,一个消费者可以消费多个topic,同时还消费Topic中指定的分区(Partition)
Consumer Group(消费者组):
Consumer Group是kafka提供的可扩展的且具有容错性的消费者机制。组内可以有多个消费者,他们共享一个Group ID .组内的所有消费者会协调在一起平均消费订阅素有主题的所有分区。
Kafka可以保证在稳定的状态下,一个paritition中的消息只能被同一个Consumer Group中的一个Consumer消费,而一个组内的consumer只会消费某一个或特定几个paratition。一个消息可以同时被多个consumer group消费。
Serializer(序列化):
生产者通过(Serializer)序列化将将对象转换成字节数组,才能够通过网络发送给kafka 。而在消费端需要使用(DeSerializer)反序列化把接收到的字节数组转换成相应的对象。为了方便key和value都需要序列化。常见的序列化方式ByteArraySerializer、ByteBufferSerializer、BytesSerializer、Long(Double Integer String)Serializer。要自定义序列化的话需要实现Serializer接口。
offset :
消息偏移量,offset是consumer position,Topic的每个Partition都有各自的offset.
首先我们看下生产者Offset.
每个分区都有一个offset, 这个offset就是生产者的offset,同时也是这个分区的最新最大的offset。
消费者offset
这是某一个分区的offset情况,我们已经知道生产者写入的offset是最新最大的值也就是12,而当Consumer A进行消费时,他从0开始消费,一直消费到了9,他的offset就记录在了9,Consumer B就纪录在了11。等下一次他们再来消费时,他们可以选择接着上一次的位置消费,当然也可以选择从头消费,或者跳到最近的记录并从“现在”开始消费。
Rebalance
rebalance本质上是一种协议,规定了一个consumer group下的所有consumer如何达成一致来分配订阅topic的每个分区。比如某个group下有20个consumer,它订阅了一个具有100个分区的topic。正常情况下,Kafka平均会为每个consumer分配5个分区。这个分配的过程就叫rebalance,那在什么情况下会rebalance。
1、组成员发生变更(新consumer加入组、已有consumer主动离开组或已有consumer崩溃了——这两者的区别后面会谈到)
2、订阅主题数发生变更——这当然是可能的,如果你使用了正则表达式的方式进行订阅,那么新建匹配正则表达式的topic就会触发rebalance
3、订阅主题的分区数发生变更
Coordinator(协调者)
1、Transaction Coordinator
PID —通过—> Transaction Coordinator—获得—>Transaction ID
为了实现跨分区跨会话的事务,需要引入一个全局唯一的Transaction ID,并将Producer获得的PID和Transaction ID绑定。这样当Producer重启后就可以通过正在进行的Transaction ID获得原来的PID。
Kafka引入了一个新的组件Transaction Coordinator。Producer就是通过和Transaction Coordinator交互获得Transaction ID对应的任务状态。Transaction Coordinator还负责将事务所有写入Kafka的一个内部Topic,这样即使整个服务重启,由于事务状态得到保存,进行中的事务状态可以得到恢复,从而继续进行。
2、consumer coordinator
consumer coordinator存在的唯一目的就是保存consumer提交的位移offset。
consumer需要定期向Kafka提交自己的位置信息,这一过程称为位移提交(offset commit)。consumer会在所有的broker中选择一个broker作为consumer group的coordinator,用于实现组成员管理、消费分配方案制定以及位移提交等。选择该coordinator的依据就是kafka的内置topic(_consumer_offsets)。该topic与普通topic一样,配置多个分区,每个分区有多个副本,它存在的唯一目的就是保存consumer提交的位移。