Topic
提供一串流式的记录。
Topic 就是数据主题,是数据记录发布的地方,可以用来区分业务系统。Kafka中的Topics总是多订阅者模式,一个topic可以拥有一个或者多个消费者来订阅它的数据。
分布式
日志的分区partition (分布)在Kafka集群的服务器上。每个服务器在处理数据和请求时,共享这些分区。每一个分区都会在已配置的服务器上进行备份,确保容错性.
每个分区都有一台 server 作为 “leader”,零台或者多台server作为 follwers 。leader server 处理一切对 partition (分区)的读写请求,而follwers只需被动的同步leader上的数据。当leader宕机了,followers 中的一台服务器会自动成为新的 leader。每台 server 都会成为某些分区的 leader 和某些分区的 follower,因此集群的负载是平衡的。
生产者
生产者可以将数据发布到所选择的topic(主题)中。生产者负责将记录分配到topic的哪一个 partition(分区)中。可以使用循环的方式来简单地实现负载均衡,也可以根据某些语义分区函数(例如:记录中的key)来完成。下面会介绍更多关于分区的使用。
消费者
消费者使用一个 消费组 名称来进行标识,发布到topic中的每条记录被分配给订阅消费组中的一个消费者实例.消费者实例可以分布在多个进程中或者多个机器上。
如果所有的消费者实例在同一消费组中,消息记录会负载平衡到每一个消费者实例.
如果所有的消费者实例在不同的消费组中,每条消息记录会广播到所有的消费者进程.
分区Partition
物理概念,Kafka下数据存储的基本单元。一个Topic数据,会被分散存储到多个Partition,每一个Partition是有序的
- 每一个Topic被切分为多个Partitions
- 消费者数目少于或等于Partition的数目
- Broker Group中的每一个Broker保存Topic的一个或多个Partitions
- Consumer Group中的仅有一个Consumer读取Topic的一个或多个Partitions,并且是唯一的Consumer
消息的分发策略
消息是kafka中最基本数据单元。一条消息由Key、Value两部分构成,其中,key可以指定也可以不指定。默认情况下,kafka 采用的是 hash 取模算法决定消息存储到哪个分区。如果Key 为 null,则会随机分配一个分区。
消息的消费策略
一个consumer group-0 里有3个consumer时,他们一起消费topic.test,这个test下有3个分区,怎么协调?
c1消费p0,c2消费p1,c3消费p2
kafka的策略是:一个分区只能由一个消费者消费。
分区分配策略:
范围分区(Range strategy 默认)
范围分区策略先对一个主题里面的分区按照序号排序,并对消费者按字母顺序排序。对于如上3个分区,3个消费者,排序后:
分区序列:0,1,2
消费者序列:C1-0,C2-0,C3-0
然后将分区数 / 消费者数 决定每个消费线程消费几个分区,最终
C1-0 : p0
C2-0:p1
C3-0:p2
如果2个主题,每个主题10个分区,group-0下的3个消费者怎么协调呢?
C1-0 将消费 T1 主题的 0, 1, 2, 3 分区以及 T2 主题的 0,1, 2, 3 分区
C2-0 将消费 T1 主题的 4, 5, 6 分区以及 T2 主题的 4, 5, 6 分区
C3-0 将消费 T1 主题的 7, 8, 9 分区以及 T2 主题的 7, 8, 9分区
轮询分配
轮询分区策略是把所有 partition 和所有 consumer 线程都列出来,按照 hashcode 进行排序。然后将所有分区依次轮流分配给所有consumer。
5. 什么时候触发消费分配策略?
消费者分区分配策略又叫 consumer rebalance。当:
一个consumer group里新增消费者
有消费者离开当前的consumer group
topic新增分区
消费者 <= 分区数,若大于分区数,就会有闲置的消费者
partition最好是consumer的整数倍
ConsumerGroup
逻辑概念,对于同一个topic,会广播给不同的group,一个group中,只有一个consumer可以消费该消息
Broker
物理概念,Kafka集群中的每个Kafka节点
Replication
同一个Partition可能会有多个Replica,多个Replica之间数据是一样的
- 当集群中有Broker挂掉的情况,系统可以主动地使用Replicas提供服务
- 系统默认设置每一个Topic的replication系数为1,可以在创建Topic时单独设置
- Replication的基本单位是Topic的Partition
- 所有的读和写都从Leader进,Followers只是做备份
- Followers必须能够及时复制Leader的数据
- 增加容错性与可扩展性
Replication Leader
一个Partition的多个Replica上,需要一个Leader负责该Partition上与Producer和Consumer交互
ReplicaManager
负责管理当前broker所有分区和副本的信息,处理KafkaController发起的一些请求,副本状态的切换、添加/读取消息等