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机制:ISRin-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集中协调者。