文章目录
kafka
对比Rocket:
- Nameserver:只有路由信息和各个节点信息储存、Brokers信息、topic和broke的信息
- broker:提供Topic和Queue机制,支持主从容错机制,主要负责Topic消息的存储、管理、分发,单个broke和- 所有Nameserver保持心跳关系
- master:主 可对应多个slave
- slave:从 只能对应一个master
- 主从存储相同的信息,当主挂掉之后,容错机制从接替主的任务
- producer:生产消息 (MQ.fault.Strage.selectOneMessAgeQueue()决定选择哪个消息队列负载均衡:不选择上次选过的broker,不选择容错机制内的)
- consumer:消费消息(doRebalance()负责负载均衡allocateMesasgeQueueStratage.allocate(),分页模式,手动配置模式,指定机房,就近机房,统一哈希,环形模式)
- broke选择把消息发送到同一条queue保证消息的顺序消费
kafka订阅模式:
- 点对点:一对一,消费者主动拉取数据,消息收到后消息清除
- 发布/订阅模式:一对多,将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息
kafka架构:
- 一个producer将消息发送给分布式架构的多个broke的同一个topic,
- broker上的topic会在不同的broker上备份复制消息数据,指定一个为leader,其余为follower
- 生产者消费者都是连接leader
- consumer group(视为一个大的消费者,提高并发):同一个分区的数据只能被一个消费者组的一个消费者所消费
- zookeeper:保证kafka集群的运行,保存producer、broker、consumer的生产消费位置信息,topic等各类信息
- 0.9之前offset存在Zookeeper,之后版本存储在kafka集群本地(某个系统topic)
Kafka基础命令
- 查看当前服务器所有topic:bin/kafka-topics.sh --zookeeper hadoop102:2181 --list
- 创建topic: bin/kafka-topics.sh --zookeeper hadoop102:2181 --create --replication-factor 3 --partitions 1 --topic first
- 删除topic: bin/kafka-topics.sh --zookeeper hadoop102:2181 --delete --topic first
- 启动命令行生产者:bin/kafka-console-producer.sh --broker-list hadoop102:9092 --topic first
- 启动命令行消费者:bin/kafka-console-consumer.sh --zookeeper hadoop102:2181 --topic first
- bin/kafka-console-consumer.sh --bootstrap-server hadoop102:2181 --topic first --from-beginning(会把该主题中以往所有数据都取出来)
- 查看某个topic的详情:bin/kafka-topics.sh --zookeeper hadoop102:2181 --describe --topic first
- 修改分区数: bin/kafka-topics.sh --zookeeper hadoop102:2181 --alter --topic first --partitions 6
基本概念
-
kafka中消息是以topic分类,topic是逻辑概念,partition是物理上的概念,每个partition都对应一个log文件,该文件存储的就是producer生产的数据,会不断的追加到log文件的末尾,并且每个数据都有自己offset,消费者组中的每个消费者都会记录消费的offset,方便出错恢复。
-
为了防止log文件过大导致数据定位效率低,kafka采用分片机制,每个partition的log分为不同的segment,
segment对应.log和.index两个文件分别是数据和索引。index里面的索引字段大小一样,所以可以直接快速定位索引字段 -
生产者分区策略:指定INT partition。根据key的hash值,轮询分配
-
kafka保证所有的ISR fellower备份完成之后发送ack(默认)
- ISR:(in-sync replica set)表示和leader保持同步的follower集合,当follow长时间未向leader同步数据,该follow会被踢出ISR集合
- ISR阈值由replica.lag.time.max.ms参数设定。leader发生故障后,ISR中选举新的leader(看通信同步时间和差距条数(被移除))
ack应答机制( acks配置参数):
- 0 producer不需要等待ack 直接发送数据(数据丢失)
- 1 producer 等待leader落盘后发送ack(如此时挂掉 可能丢失数据)
- -1 producer等待所有(ISR)落盘 再发送数据(可能造成数据重复)isr只有leader时如故障 也可能造成数据丢失
关键名词解释
- HW(high watermark):消费者可见数据的最大offset
- leo(log end offset):每个副本的最大offset
- offset:每次消费者只会在启动时从本地拉取offset,之后运行时的offset都是从内存自动保存的偏差拉取
- OSR:Out-of-Sync Replicas 脱离同步副本。 数据同步严重滞后的副本组成OSR(网络原因造成的等等),如果副本数为1或者副本同步进度差不多,那么这个可以为空
- AR:Assigned Replicas 总的分配副本
- HW:消费者可见的最大的offset
- LEO:每个分区内都有一个自己的offset
故障处理
- follow故障:被踢出,恢复后读取本地磁盘最后一个HW,然后从HW开始向leader读取数据,直到和leader同步之后加入ISR
- leader故障:从ISR中选出一个leader,其余的follow会将各自的log文件高于HW的部分截掉,从新leader同步数据
- (只能保证一致性,无法保证数据不丢失和重复问题)
exactly one
- 最少一次+幂等 = Exactly one
- 开启幂等的Producer在初始化的时候会分配一个pid,发往同一个partition的消息会附带SequenceNumber
Broker端会对Pid,partition,SeqNumber做缓存,主键相同时,Broker只会持久化一条,但是PID重启就会发生变化, - 不同的Partition也具有不同的主键,幂等不能保证跨分区跨会话的Exactly once
消费模式:
- consumer pull(拉取模式)保持轮询拉取队列数据,当partition无数据,consumer会等待一段时间后返回。这段时长即为timeout
- 消费者个数发生变化时会触发消费策略
- roundrobin:根据主题和分区的hash值轮询分配消费者组 (把不同主题当作整体来看)(当前消费者组订阅同一个主题)
- range:根据订阅的主题来分配消费者(默认)(可能导致消费不对等)
- 保存的offset是根据 组(group)-主题(topic)-分区(partition)来保存
zookeeper的作用
- broker中有一个会被选举为Controller。负责管理集群broker的上线下线,所有topic的分区副本分配和leader选举工作
- Controller的管理工作依赖于zookeeper
生产者事务
- 生产者事务:引入全局transactionID(client产生) 发生重启producer 就和transaction coordinator交互获得ID 取得对应 PID
其他知识
-
kafka如何体现自己的消息顺序:区内有序
-
分区器:序列化器:拦截器
- 执行顺序拦截器,序列化器,分区器
-
kafka生产者客户端整体结构:
- 2个线程,main()线程 经过拦截器,序列化器,分区器将数据写入共享区(已分好区)然后有个send线程发送数据
-
消费者提交消费位移时提交的时当前的消费的最新消息的是offset+1(存储的是下次要消费的offset)
-
ack问题是生产过程可能产生丢失数据或重复数据
- 重复消费:先处理数据再提交offset
- 漏消费:先提交offset 再处理数据
-
使用kafka创建(删除)一个topic,kafka的执行逻辑:
- 1)会在zookeeper中/Brokers/topics节点下创建一个新的topic节点
- 2)触发Controller监听程序
- 3)kafka Controller负责topic的创建工作,并更新metadata cache
-
topic分区可增不可减,根据可用的分区增加,不可减是因为数据存在无法处理
-
内部topic:consumer_offsets给普通消费者存储offsets
-
分区分配概念:range(根据主题分配给订阅该主题的consumer) roundrobin分配给组轮询)
-
kafka日志目录:.log和.index 二分查找找到index文件,然后扫描index找到数据在log里的具体物理偏移量找到数据
-
kafka Controller作用:和zookeeper交互,元数据的更新
-
Kafka选举:Controller,leader(isr)
-
kafka高性能:分布式,顺序写log,零拷贝(减少不必要的拷贝次数)直接磁盘数据到网络 网络数据到磁盘
-
kafka数据保存时间:7天
-
kafka一次拉取的数据量:默认500