Kafka 是一种高吞吐量、分布式、基于发布/订阅的消息系统,最初由 LinkedIn 公司开发,使用 Scala 语言编写,目前是Apache 的开源项目。【耐心读完,文末有读者福利!!!】服务器
1. broker:Kafka 服务器,负责消息存储和转发网络
2. topic :消息类别,Kafka 按照topic 来分类消息架构
3. partition :topic 的分区,一个 topic 能够包含多个 partition ,topic 消息保存在各个 partition 上app
4. offset:消息在日志中的位置,能够理解是消息在partition 上的偏移量,也是表明该消息的惟一序号负载均衡
5. Producer:消息生产者分布式
6. Consumer:消息消费者性能
7. Consumer Group:消费者分组,每一个Consumer 必须属于一个group大数据
8. Zookeeper :保存着集群broker、topic、partition 等meta 数据;另外,还负责broker 故 障发现,partition leader 选举,负载均衡等功能设计
partition 的数据文件 (offset,MessageSize,data)日志
partition 中的每条Message包含了如下三个属性:offset,MessageSize,data,其中offset表 示Message 在这个partition 中的偏移量,offset 不是该Message 在partition 数据文件中的实际存储位置,而是逻辑上一个值,它惟一肯定了partition 中的一条Message,能够认为offset是
partition 中Message 的id;MessageSize 表示消息内容data 的大小;data 为Message 的具体内容。
数据文件分段segment (顺序读写、分段命令、二分查找)
partition物理上由多个segment 文件组成,每一个segment 大小相等,顺序读写。每一个segment数据文件以该段中最小的offset 命名,文件扩展名为.log。这样在查找指定offset 的Message 的时候,用二分查找就能够定位到该Message 在哪一个segment 数据文件中。
数据文件索引 (分段索引、稀疏存储)
Kafka 为每一个分段后的数据文件创建了索引文件,文件名与数据文件的名字是同样的,只是文件扩展名为.index。index 文件中并无为数据文件中的每条 Message 创建索引,而是采用了稀疏存储的方式,每隔必定字节的数据创建一条索引。这样避免了索引文件占用过多的空间,从而能够将索引文件保留在内存中。
负载均衡 (partition 会均衡分布到不一样broker 上)
因为消息topic 由多个partition 组成,且partition 会均衡分布到不一样broker 上,所以,为了有效利用broker 集群的性能,提升消息的吞吐量,producer 能够经过随机或者hash 等方式,将消息平均发送到多个partition 上,以实现负载均衡。
是提升消息吞吐量重要的方式,Producer 端能够在内存中合并多条消息后,以一次请求的方式发送了批量的消息给broker,从而大大减小broker 存储消息的IO 操做次数。但也必定程度上影响了消息的实时性,至关于以时延代价,换取更好的吞吐量。
Producer 端能够经过GZIP 或Snappy 格式对消息集合进行压缩。Producer 端进行压缩以后,在Consumer 端需进行解压。压缩的好处就是减小传输的数据量,减轻对网络传输的压力,在对大数据处理上,瓶颈每每体如今网络上而不是CPU (压缩和解压会耗掉部分CPU 资源)。
同一Consumer Group 中的多个Consumer 实例,不一样时消费同一个partition,等效于队列模式。partition 内消息是有序的,Consumer 经过pull 方式消费消息。Kafka 不删除已消费的消息对于partition,顺序读写磁盘数据,以时间复杂度O(1)方式提供消息持久化能力。