文章目录
kafka概述
1. 引言
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。
kafka架构
1. 架构图
2. 组件及其功能
Broker
每个Kafka Server称之为一个Broker,多个Broker可以组成Kafka Clutser。
一个节点上可以有一个或者多个Broker,多个Broker连接到相同的zookeeper组成了Kafka集群。
Topic
Kafka是一个发布订阅消息系统
Topic就是消息类名,一个Topic中通常存放一类消息,每一个Topic都有一个或者多个订阅者,也就是消费者。
Producer 将消息推送到Topic,有订阅该Topic的Consumer从Topic中拉取消息。
Topic 和 Broker
一个Broker 上可以创建一个或者多个Topic,一个Topic可以分布在同一集群下的多个Broker。
Partition
kafka会为每个Topic维护多个分区(partititon),每个分区会映射到一个逻辑的日志(log)文件,一个Topic可以被划分为多个分区(自定义)
Partition Distribution
对于同一个partiton,它所在任何一个broker,都有能扮演两种角色:leader、follower。
每个partition的Leader用于处理到该partiton的读写请求。
每个partition的followers是用于异步的从它的leader中复制数据。
Kafka会动态维护一个与Leader保持一致的同步副本(in-sync replicas (ISR))集合,并且会将最新的同步副本(ISR )集合持久化到zookeeper。如果leader出现问题了,就会从该partition的followers中选举一个作为新的leader。
3. 角色及其功能
Producer
Producer的任务是向Broker发送数据。Kafka提供了两种Producer接口,一种是Low Level接口,使用该接口会向特定的Broker的某个Topic下的某个Partition发送数据,另一种是High Level接口,支持同步/异步发送数据,基于zookeeper的Broker自动识别和进行负载均衡(基于Partitioner)。
Consum
在Kafka中,同样有consumer group的概念,它是逻辑上将一些consumer分组。因为每个kafka consumer是一个进程。所以一个consumer group中的consumers将可能是由分布在不同机器上的不同的进程组成的。Topic中的每一条消息可以被多个consumer group消费,然而每个consumer group内只能有一个consumer来消费该消息。所以,如果想要一条消息被多个consumer消费,那么这些consumer就必须是在不同的consumer group中。所以也可以理解为consumer group才是topic在逻辑上的订阅者。
每个consumer可以订阅多个topic。
每个consumer会保留它读取到某个partition的offset。而consumer 是通过zookeeper来保留offset的
- 组内均分
- 组件广播
kafka特点
1. 高效数据传输
2. 无状态Broker
Broker没有副本机制,一旦Broker宕机,该Broker的消息都将不可用。Broker不保存订阅者的状态,由订阅者自己保存。
无状态导致消息的删除成为难题,(可能删除的消息正在被订阅),kafka采用基于时间的SLA(服务水平保证),消息一般保存7天后被删除。
消息订阅者可以Rewind Back到任意位置重新进行消费,当订阅者由故障时,可以选择最小的Offset重新读取消费信息。
3. Consumer Group
4. Zookeeper协调控制
管理Broker与Consumer的动态加入和离开。
触发负载均衡,当Broker或Consumer加入或离开时会触发负载均衡算法,使得一个Consumer Group内的多个Consumer的订阅负载均衡。
维护消费关系和每个Partiton的消费信息。
5. Zookeeper上的细节
6. 消息交付保证
kafka对消息的重复、丢失、错误以及顺序没有严格的要求。
kafka提供At-least-once Delivery,即当Consumer宕机后,有些消息可能会被重复Delivery(交货)。
因为每个Partition只会被Consumer Group内的一个Consemer消费,故kafka保证每个Partiton内的消息会被顺序的订阅。
kafka为每条消息计算CRC校验,用于错误检测,CRC校验不通过的消息会直接被丢弃掉。
kafka安装
1. 环境要求
- zookeeper正常启动
2. 安装(单机)
- 解压缩
tar -zxvf kafka_2.11-0.11.0.0.tgz -C /usr/kafka/
- 配置
vim config/server.properties
zookeeper.connect=localhost:2181
delete.topic.enable=true
log.dirs=/usr/kafka/kafka_2.11-0.11.0.0/kafka-logs
listeners = PLAINTEXT://SparkOnYarn:9092
- 启动zookeeper
./bin/zkServer.sh start conf/zk.cfg
- 启动kafka服务
./bin/kafka-server-start.sh config/server.properties
kafak的使用
创建topic
./bin/kafka-topics.sh --create --partitions 10 --replication-factor 1 --topic test --zookeeper localhost:2181
Created topic "test". # 创建成功
创建Producer
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
创建Consumer
./bin/kafka-console-consumer.sh --topic test --zookeeper localhost:2181
生产者幂等性和事务问题
生产者幂等性
在真正的生产环境中,往往会因为网络等种种原因,导致生产者会重复生产消息。生产者在重试的时候,往往可能前一个消息已经生产过了,但是仍然生了重复的消息。这样就会导致数据紊乱,比如在使用MongoDB的时候,如果不加控制的话有可能会出现了两个重复的用户。
所以为了应对此等场景,kafka也有其解决办法,那就是kafka的幂等性。
幂等:多次操作最终的影响等价与一次操作称为幂等性操作,所有的读操作一定是幂等的。所有的写操作一定不是幂等的,当生产者和broker默认有acks应答机制,如果当生产者发送完数据给broker之后如果没有在规定的时间内收到应答,生产者可以考虑重发数据,可以通过一下配置参数提升生产者的可靠性。
配置:
acks = all // 0 无需应答 n 应答个数 -1所有都需要
retries = 3 // 表示重试次数
request.timeout.ms = 3000 //等待应答超时时间
enable.idempotence = true //开启幂等性
生产者事务
kafka生产者事务指的是在发送多个数据的时候,保证多个Record记录发送的原子性。如果有一条发送失败就回退,但是需要注意在使用kafka事务的时候需要调整消费者的事务隔离级别设置为
read_committed
因为kafka默认的事务隔离策略是read_uncommitted
开启事务
transactional.id=transaction-1 //必须保证唯一
enable.idempotence=true //开启kafka的幂等性