Kafka学习笔记

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值