Kafka is a distributed streaming platform.
Kafka是一个分布式流式处理平台。
Confluent Apache Kafka & Streaming Platform for the Enterprise.
Confluent是Kafka三位作者离开LinkedIn后创办了Confluence.io后商业化Kafka的产品。
基本概念和术语
broker
消息
采用ByteBuffer存储
Key:消息键,对消息做 partition 时使用,即决定消息被保存在某 topic 下的哪个 partition 。
Value:
Timestamp:
消息交付语义
at most once
at least once
exactly once
topic
auto.create.topics.enable
自动创建主题,默认值为true
delete.topic.enable
是否可以删除主题,默认值为false
partition
一个topic可以设置多个partition,可以实现负载
num .partitions
默认分区数,默认值为1
一个分区只能被一个消费者组中的一个消费者处理。
segment
partition被划分成多个segment来组织数据
一个segment写满,会新建一个segment,segment的名称以该segment的base offset为名称
包涵log和index文件
replication
default.replication.factor
默认副本数,默认值1,副本数不能大于broker集群节点数
leader和follower
partition leader election
AR
assigned replicas
ISR
in-sync replicas
OSR
out-of-sync replicas
offset
topic partition下的每一条消息都有一个offset,用于记录消息的位置。
消费者端也有一个offset,用于记录消费者消费的位置。
生产者
bootstrap.servers
group.id
key.serializer
value.serializer
acks
broker应答模式
0
1
all或-1
buffer.memery
缓冲区大小,单位:字节,默认值32MB
compression.type
压缩类型,可取值:none、gzip、snappy、lz4
retries
batch.size
批量提交大小,单位:字节,默认值16KB
linger.ms
延时提交,可以聚集成批后提交,减少交互,提高吞吐量
max.request.size
消息最大长度,单位:字节,默认值1048576B
request.timeout.ms
请求超时时间,默认值30秒
enable.idempotence
是否启用幂等性producer
分区器(Partitioner)
实现接口Partitioner
自定义分区
消费者
bootstrap.servers
group.id
key.deserializer
value.deserializer
session.timeout.ms
max.poll.interval.ms
auto.offset.reset
kafka-0.10.1.X版本之前: auto.offset.reset 的值为smallest和largest(offest保存在zk中)
kafka-0.10.1.X版本之后: auto.offset.reset 的值更改为earliest,latest和none (offest保存在kafka的一个特殊的topic名为:__consumer_offsets里面)
如果存在已经提交的offest
时,不管设置为earliest或者latest 都会从已经提交的offest处开始消费
如果不存在已经提交的offest
时,earliest 表示从头开始消费,latest 表示从最新的数据消费,也就是新产生的数据.
none:topic各分区都存在已提交的offset时,从提交的offest处开始消费;只要有一个分区不存在已提交的offset,则抛出异常
enable.auto.commit
auto.commit.interval.ms
自动提交时间间隔
fetch.max.bytes
max.poll.records
heartbeat.interval.ms
connections.max.idle.ms
消费者组
1个partition只能被同组的一个consumer消费,同组的consumer则起到均衡效果,即同组的不同consumer可以分别消费不同的partition。
事务
概要设计
吞吐量和延时
- 操作系统页缓存是在内存中分配的(page cache,默认flush时间间隔是5秒),所以消息写入的速度非常快。
- Kafka不必直接与底层的文件系统打交道。所有烦琐的 1/0 操作都交由操作系统来处理 。
- Kafka写入操作采用追加写入( append )的方式,避免了磁盘随机写操作。
- 使用以 sendfile 为代表的零拷贝技术加强网络间的数据传输效率。
持久化
负载均衡和故障转移
伸缩性
状态保存于zookeeper
快速开始
启动kafka自带的zookeeper
1 |
|
启动kafka
1 |
|
帮助信息
1 |
|
使用独立的zookeeper,需要修改kafka配置文件config/server.properties
中zookeeper.connect
1 |
|
在bin目录下新建kafka deamon启动脚本start-kafka.sh
1 |
|
创建topic
1 |
|
查看topic
1 |
|
发送消息
1 |
|
消费消息
1 |
|
生产者
老版本
使用scala编写,从0.9.0.0版本开始不再推荐使用
1 |
|
1 |
|
新版本
0.8.2.x
使用java编写
1 |
|
1 |
|
1 |
|
消费者
老版本
使用scala编写,从0.10.0.0版本开始不再推荐使用
kafka.consumer. Consumer.ConsumerConnector
1 |
|
新版本
0.9.0.x,org.apache.kafka.clients.consumer.KafkaConsumer
1 |
|
1 |
|
集群
在集群环境中创建多副本的topic
1 |
|
查看集群环境中topic的信息
1 |
|
–list
–alter
–delete
查看分区的消息数
1 |
|
伪集群
在一台服务器上部署3个节点,实现伪集群
config/server-1.properties:
1 |
|
config/server-2.properties:
1 |
|
config/server-2.properties:
1 |
|
真实集群
在三台服务器(192.168.7.100、192.168.7.101和192.168.7.102)上分别部署一个节点,实现真实集群
config/server.properties
1 |
|
Kafka Connect
Kafka Streams
工具
CMAK
Kafka Eagle
Kafka Tool
Kafka Manager
Kafka Web Console
Kafka Web Console已停止维护,推荐使用KafkaManager
KafkaOffsetMonitor
参考
《kafka并不难学!入门、进阶、商业实战》,kafka 0.10.2.0
《Kafka技术内幕》,kafka 0.10.0.0
《Kafka入门与实践》,kafka 0.10.1.1
《Apache Kafka 实战》,kafka 1.0.0,作者胡夕的个人博客
《Kafka权威指南》,kafka 0.9.0.1
《Apache Kafka源码剖析》,kafka 0.10.0
《深入理解Kafka:核心设计与实践原理》,kafka 2.0.0