1.kafka
kafka是类jms消息队列,与jms不同的是,kafka可以有多个消费者consumer主动拉取数据。
2.topic
topic是逻辑上:一个目标发送目的地,物理上:一个磁盘上的partition的目录。
一个topic可以对应多个partition;
一个partition可以划分多个segment; 一个segment的默认值是1G;
一个segment包括index 和 log 文件。
注意点:
topic不仅可以设置partition,还可以设置replication number,并且在多个replication中选取leader。 该主从模式与mysql的主从不同,此模式下所有的读写操作均通过leader管理,而mysql的主从则是为了读写分离。在kafka中,读写操作都是leader; 在mysql中,leader负责写,follower负责读。
3.producer
producer负责数据生产到broker中,producer决定数据分发策略,默认使用key的哈希值对分区数取模算法,该算法和hdfs中partition算法相同。
4.broker
broker是当前服务器上运行的kafka的实例,在kafka集群中每一个broker对应一个唯一的ID,即brokerId。
broker不关心数据何时生产,何时消费,它只关心数据存储。
5.consumergroup
consumergroup是数据消费组,该组可以设置多个,组与组之间消费的数据都是一样的;
在同一个组内可以有多个consumer,在同一个组内的成员共同消费一个topic数据,组内成员不能重复消费数据。
分组策略:数据如何分组
默认是 (key.hashcode)%numPartitions。
安全策略:消息是否确认接收
ack机制,
0是不等待broker返回确认消息,
1是等待topic中某个partition的leader保存成功statement,
-1是等待topic中某个partition所有副本都保存成功statement。
保存策略:消息如何保存
在理论环境下,broker按照顺序读写的机制,可以每秒保存600M的数据。主要通过pagecache机制,尽可能的利用当前物理机器上的空闲内存来做缓存。当前topic所属的broker,必定有一个该topic的partition,partition是一个磁盘目录,partition的目录中有多个segment组合。
存放策略:partition与broker 关系
partition轮询依次访问broker,这样负载均衡在多个broker上。
消费策略:partition与consumergroup关系
理想策略是一个consumer对应一个partition;
若consumer数量大于partition数量,则会出现空闲的consumer;
若consumer数量小于partition数量,则使用如下算法:
假如topic, 具有如下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)]
有序策略:信息消费全局有序性
数据生产可以做producer集群,数据存储可以做broker集群,数据消费可以做consumergroup;
倘若保证消息消费的全局有序,则保证数据生产有序,数据存储有序,数据消费有序。