课程安排
Kafka
概念解析Kafka
结构设计Kafka
场景与应用Kafka
高级特性
2-1 什么是Kafka
Kafka 是一种高吞吐量、分布式、基于发布/订阅的消息系统,最初由 LinkedIn 公司开发,使用Scala 语言编写,目前是 Apache 的开源项目。
面向数据流的生产、转换、存储、消费为一体的流处理平台。
- 分布式流处理平台
Kafka
是基于Zookeeper
的分布式消息系统Kafka
具有高吞吐率、高性能、实时及高可靠等特点;
流平台有三个关键特性:
- 是发布和订阅数据的流,类似于消息队列。
- 是数据流存储的平台,并且具备容错。
- 当数据产生时对数据做处理。
Kafka
作用于什么?
- (数据传输)构建实时数据流管道,当系统之间有很强的数据依赖性时。
- (数据处理) 构建实时数据处理应用,能够转、换响应这个数据流。
3-1 Kafka
基本概念
Producer
:消息和数据的生产者,向Kafka
的一个topic
发布消息的进程/代码/服务。Consumer
: 消息和数据的消费者,订阅数据(Topic
)并且处理其发布的消息的进程/代码/服务。Consumer Group
:逻辑概念,对于同一个Topic
,会广播给不同的group
,一个group
中,只有一个consumer
可以消费该消息。消费者分组,每个Consumer
必须属于一个group
。Broker
:物理概念,Kafka
服务器,Kafka
集群中的每个Kafka
节点,负责消息存储和转发。Topic
: 逻辑概念,Kafka
消息的类别,Kafka
按照topic
来分类消息(对数据进行区分、隔离)。Partition
:物理概念,Kafka
下数据存储的基本单元。一个topic
数据,会被分散存储到多个Partition
,每个Partition
是有序的。- 每一个
Topic
被切分为多个Partition
。 - 消费者数目少于或等于
Partition
的数目。 Broker Group
中的每一个Broker
保存Topic
的一个或多个Partitions
(同一个Partition
不会被多个Broker
保存)。Consumer Group
中的仅有一个Consumer
读取Topic
的一个或多个Partitions
,并且是唯一的Consumer
。(1.容错:以Group
的方式消费Topic
;2.提高一定的性能)
- 每一个
Replication
: 同一Partition
可能会有多个Replica
,多个Replica
之间数据是一样的。- 当集群中有
Broker
挂掉的情况,系统可以主动地使Replicas
提供服务。 - 系统默认设置每一个
Topic
的Replication
系数为1(没有副本,节省空间),可以在建Topic
的时候单独使用。
- 当集群中有
Replication Leader
:一个Replication
的多个Replica
上,需要一个Leader
负责该Partition
上与Producer
和Consumer
交互。ReplicaManager
: 负责管理当前broker
所有分区和副本的信息,处理KafkaController
发起的一些请求,副本状态的切换、添加/读取消息等。
Replication
特点
Replication
的基本单位是Topic
的Partition
。- 所有的读和写都是从
Leader
进,Followers
只是作为备份。 Follower
必须能够及时复制Leader
的数据。- 增加容错性与可扩展性。
3-3 Kafka
基本结构
1.broker
的信息都存储在ZooKeeper
中。
2.Topic
和Partition
都是存储在ZooKeeper
中。
Kafka
消息结构
Offset
: 当前消息所处的偏移。
Lenght
:消息的长度。
CRC32
:校验字段,校验当前信息的完整性,避免消息不完整导致生产或消费失败。
Magic
: 固定值,Kafka
可以非常快速的判断该消息是不是Kafka
消息。
attributes
:可选,当前消息的属性,会有一个枚举值。
Timestamp
: 时间戳。
Key Length
: Key
的长度。
Key
: Key
。
3-4 Kafka
特点
分布式
- 多分区(
Partition
) - 多副本(
Replication
) - 多订阅者
- 基于
Zookeeper
调度
高性能
- 高吞吐量(每秒几十万)
- 低延迟
- 高并发
- 时间复杂度为
O(1)
持久性与扩展性
- 数据可持久化
- 容错性
- 在线水平扩展
- 消息自动平衡
4-1 Kafka
应用场景
- 消息队列
- 行为跟踪
- 元信息监控(运维数据)
- 日志收集
- 流处理
- 事件源
- 持久性日志
4-2 Kafka
简单案例
- 环境启动
-
下载与安装
-
启动
Zookeeper
/opt/zookeeper/zookeeper/bin/zkServer.sh start
现在可以连接到
Zookeeper
端口上,通过发送srvr
来验证Zookeeper
是否安装正确。- 启动验证方式
bin> ./zkCli.sh
> ps -ef | grep zookeeper
查看logs文件夹内容
> telnet localhost 2181
-
启动
Kafka
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties
-
创建
Topic
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
-
往测试主题上发布消息
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
-
往测试主题上读取消息
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
但是提示
from-begining is not a recognized option
-
查看Topic
./bin/kafka-topics --list --zookeeper localhost:2181
-
5-1Kafka
高级特性之消息事务
为什么要支持事务
- 满足"读取-处理-写入"模式
- 流处理需求的不断增强
- 不准确的数据处理的容忍度
数据传输的事务定义
- 最多一次:消息不会被重复发送,最多被传输一次,但也有可能一次不传输。
- 最少一次:消息不会被漏发送,最少被传输一次,但也有可能被重复传输。
- 精确的一次(Exactly once):不会漏传输也不会重复传输,每个消息都被传输一次而且仅仅被传输一次,这是大家所期望的。
保证Kafka
的事务
- 内部重试问题:
Procedure
幂等处理。 - 多分区原子写入。
事务保证-避免僵尸实例
- 每个事务
Producer
分配一个transactional.id
,在进程重新启动时能够识别相同的Producer
实例 Kafka
增加了一个与transactional.id
相关的epoch
,存储每个transactional.id
内部元数据。- 一旦
epoch
被触发,任何具有相同的transactional.id
和更旧的epoch
的Producer
被视为僵尸,Kafka
会拒绝来自这些Producer
的后续事务性写入。
5-2Kafka
高级特性之零拷贝
- 网络传输持久性日志块
Java NIO channel.transforTo()
方法Linux sendfile
系统调用