Apache kafka简介

1,消息引擎系统

1)Kafka是消息引擎系统。两个重要因素: 消息设计、传输协议设计。
2)Kafka消息是结构化的二进制数据。消息本身一般都是结构化数据,xml、json、二进制或者其他自定义结构化类型。
3)kafka自己设计了:一套二进制的消息传输协议
4)两种模式:消息队列(message queue)和发布/订阅(pub/sub)模式
message queue:sender发送消息到指定queue,receiver从queue接受消息,一个消息只能被一个receiver接受。
pub/sub模式:有一个topic主题的概念,发布者(publisher)向topic发送消息,所有订阅了该topic的subscriber都能收到消息。(redis的pub/sub)
5)kafka consumer group:同时支持message queue和pub/sub。
6)使用MQ的优劣势
优势:系统解耦、异步调用、削峰平谷。
劣势:复杂度增高、可用性降低、一致性问题。

2,Kafka概要设计

1)零拷贝:Java 类库通过 java.nio.channels.FileChannel 中的 transferTo() 方法(底层sendfile系统调用)来在 Linux 和 UNIX 系统上支持零拷贝。
内核直接将数据从磁盘文件拷贝到socket套接字,而无需通过应用程序。
2)高吞吐量/低延时
micro-batch:批量发送消息。
操作系统页缓存:不直接写IO,直接写入页缓存;消费时大多命中缓存。
零拷贝:网络间数据传输使用sendfile的零拷贝。
顺序顺序磁盘:使用append追加方式,且不允许修改已有消息。
3)消息持久化
kafka broker收到数据,立即写入持久化日志文件中还是page cache内存中,并没有刷新到磁盘
log数据文件刷盘策略
每当producer写入10000条消息时,刷数据到磁盘
log.flush.interval.messages=10000
每间隔1秒钟时间,刷数据到磁盘
log.flush.interval.ms=1000
4)负载均衡和故障转移
通过partition leader election分区leader选举来实现负载均衡。
通过会话机制将自己注册到zookeeper上,当会话失效,集群选举另一个leader。
5)伸缩性
每台kafka 服务器broker上的状态,统一交由Zookeeper保管。

3,Kakfa基本概念

1)流式处理框架。kafka在0.10.0.0版本,正式推出了Kafka Stream
2)Kafka核心架构架构:
生产者发送消息给broker
消费者从broker拉取消息
broker使用zookeeper集群,进行服务器的协调管理
3)消息Message
Producer将ProducerRecord,通过key.serializer、value.serializer序列化成message
Consumer将message(KafkaStream),通过key.deserializer、value.deserializer反序列化成KafkaMessage,进而转成所需对象
Message完整格式:使用byte数组比Java堆内存节省空间,大量使用页缓存而非堆内存,避免broker崩溃时重热缓存。
message header:记录了key.size和value.size

image.png

Producer发送消息封装:
image.png

Consumer接收消息封装:
image.png

4,kafka数据结构

1)topic和partition
topic代表一类消息,用于区分业务
partition(文件夹)从0开始,有自己的编号;为了提升系统吞吐量,形成了topic-partition-message的三层结构
2)offset位移
topic partition下,每个消息都分配一个offset值,是固定的。
不同的消费者,正在消费的offset值,是变动的。
kafka每条消息,是一个<topic, partition, offset>的三元组,定位消息位置。
3)Segment段
每一个partition文件夹下,有多个大小相等的segment 数据文件(文件名:从0开始,后续为最后一条消息的offset)
包含.index索引文件.log数据文件

image.png

通过offset查找message:segment的.index文件名二分查找找到索引文件; 根据索引文件找到该offset消息的物理偏移量; 直接取出该位置的message。
4)replica 副本
利用冗余,唯一目的就是防止数据丢失,消费数据是从leader消费。
leader:对外提供服务(针对每一个partition,都有leader)
follower:作为备份同步(fetch)leader、挂掉后充当leader
个数:通常需要小于broker个数,partation个数通常要大于业务机器节点数。
5)数据commit机制:ISR in-sync replica,leader维护
与leader同步的replica集合,包含自己
replica落后leader replica.lag.time.max.ms(follower落后leader的ms) replica.lag.max.messages(0.9以后不再使用),则移除ISR。
producer ack : 0 不等broker确认直接发送;1 leader确认后就认为成功;ISR中所有的follower确认后,认为成功。

5,Kafka版本演进

1)版本列表

image.png

2)版本表示
kafka版本:
1.0.0之前0.<major>.<minor>.<patch>: 主版本.次版本.修订|补丁数
1.0.0之后<major>.<minor>.<patch>:去掉了0开头。
编译版本:
2.10、2.11是指scala语言的版本。
kafka_2.10、kafka_2.11、kafka_2.12
image.png

3)改动。0.9.0.0版本之后
image.png

consumer位移提交:不再保存在zk中,使用内部topic保存。
消费者组管理:不再使用zk,使用coordinator集中协调者。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容