1 Kafka 是什么
- 类似JMS消息队列,结合JMS中的两种模式,可以有多个消费者主动拉取数据,在JMS中只有点对点模式才有消费者拉取数据。
- kafka 是一个生产-消费模型。
Producer
:生产者,只负责数据生产,生产者的代码可以集成到任务系统中,数据的分发策略由producer 决定,默认是 defaultPatition ,Utils.abs(key.hashCode) % numPartitions
Broker
:当前服务器 kafka 进程,只管数据存储,不管是是谁生产,不管是谁消费。在集群中每个 broker都有唯一的 brokerId,不能重复Topic
: 目标发送的目的地,这是一个逻辑上的概念。落到磁盘上是一个 partition的目录,partition 的目录中有多个segment组合(index,log)。一个Topic 对应多个 partition(0,1,2,3),一个partition对应多个segment组合,一个segment有默认的大小是 1G 。每个partition 可以设置多个副本(replication-factor 1),会从所有的副本中选取一个leader来进行。这和 mysql 中的主从有区别,mysql 做主从是为了读写分离,在kafka中读写操作都是 leaderconsumer
,可以有多个,每个 consumer 消费的数据都是一样的。ConsumerGroup
,可以有多个,每个ConsumerGroup消费的数据都是一样的。 可以把多个consumer 线程划分为一个组,组里面所有成员共同消费一个 topic 的数据,组员之间不能重复消费。
2 Kafka 生产数据时的分组策略
- 默认是 defaultPatition ,
Utils.abs(key.hashCode) % numPartitions
- key 是 producer 发送数据时传入的,
produer.send(KeyedMessage(topic,myPartitionKey,messageContent))
3 Kafka 如何保证数据的完全生产
- ack 机制,broker 表示发来的数据已确认接收无误,表示数据已经存到磁盘。
0
: 不等待 broker 返回确认消息1
: 等待 topic 中某个 partition leader 保存成功的状态反馈-1
: 等待 topic 中某个partition 所有副本都保存成功的状态反馈
4 broker 如何 保存数据
在理论环境下,broker 按照 顺序读写机制,可以每秒保存 60M的数据。主要通过 pagecache 机制,尽可能利用当前物理机器上的空闲内存做缓存。当前 topic 所属的broker,必定有一个该 topic 的 partition,partition是一个磁盘目录,partition目录中有多个 segment组合(index,log)。
5 broker 和 partition 的关系
int i = 0
list{kafka01,kafka02,kafka03}
for(int i=0;i<5;i++){
brIndex = i%broker;
hostName = list.get(brIndex)
}
6 consumerGroup 的组员 和 partition之间如何负载均衡
最好是一一对应。如果consumer 的数量太多,必然有空闲的 consumer。
算法:
假如topic1,具有如下partitions: P0,P1,P2,P3
group中,有如下consumer: C1,C2
首先根据partition索引号对partitions排序: P0,P1,P2,P3
根据consumer.id排序: C0,C1
计算倍数: M = [P0,P1,P2,P3].size / [C0,C1].size,本例值M=2(向上取整)
然后依次分配partitions: C0 = [P0,P1],C1=[P2,P3],即Ci = [P(i * M),P((i + 1) * M -1)]
7 如何保证 kafka 消费者消费数据的全局有序
如果要保证消费有序,必须保证生产有序,存储有序,消费有序。
由于生产可以集群,存储就可以分片,消费可以设置为一个 consumerGroup ,要保证全局有序,就需要保证每个环节都有序。只有一个可能,就是一个生产者,一个 partition,一个消费者,这种场景和大数据应用场景相悖。