分布式实时消息队列Kafka(五)

2021-12-07 11:01:40 浏览数 (1)

分布式实时消息队列Kafka(五)

知识点01:课程回顾

  1. 一个消费者组中有多个消费者,消费多个Topic多个分区,分区分配给消费者的分配规则有哪些?
    • 分配场景
      • 第一次消费:将分区分配给消费者
      • 负载均衡实现:在消费过程中,如果有部分消费者故障或者增加了新的消费
    • 基本规则
      • 一个分区只能被一个消费者所消费
      • 一个消费者可以消费多个分区
    • 分配规则
      • 范围分配
        • 规则:每个消费者消费一定范围的分区,尽量均分,如果不能均分,优先分配给标号小的
        • 应用:消费比较少的Topic,或者多个Topic都能均分
      • 轮询分配
        • 规则:按照所有分区的编号进行顺序轮询分配
        • 应用:所有消费者消费的Topic都是一致的,能实现将所有分区轮询分配给所有消费者
      • 黏性分配
        • 规则:尽量保证分配的均衡,尽量避免网络的IO,如果出现故障,保证 每个消费者依旧消费原来的分区,将多出来的分区均分给剩下的消费者
        • 应用:建议使用分配规则
  2. Kafka写入数据过程是什么?
    • step1:生产者提交写入请求给Kafka:Topic、K、V
    • step2:Kafka根据Topic以及根据Key的分区规则,获取要写入的分区编号
    • step3:Kafka要获取元数据【ZK】找到对应分区所在的Broker
    • step4:先写入Broker对应的PageCache,添加Offset
    • step5:OS会进行同步将PageCache中的数据写入磁盘文件:最新Segment对应.log文件中
    • step5:Follower副本到Leader副本中同步数据
  3. Kafka读取数据过程是什么?
    • step1:消费者消费请求提交Kafka:Topic、Partition、Offset
    • step2:根据Topic以及Partition来获取要读取的分区编号
    • step3:根据分区编号从元数据中找到这个分区对应的leader副本
    • step4:先读取Broker对应的PageCache,如果有,使用零拷贝机制读取内存中的数据
    • step5:没有就读取Segment,先根据offset决定读取哪个Segment
    • step6:先读.index文件,从索引中获取offset对应在这个文件中的最近位置
    • step7:根据最近位置读取.log文件,获取要读取的数据
  4. 为什么Kafka读写会很快?
      • 先写PageCache:内存缓冲机制
      • 实现了顺序写的过程
      • 先读PageCache,使用零拷贝机制
      • 按照offset顺序读取数据
      • 划分Segment
      • 构建index索引
  5. 为什么要设计Segment?
    • 设计原因
      • 加快查询效率
      • 增加删除效率:避免一条一条删除,按照整个Segment进行删除
    • 如何实现:一对文件
      • .log
      • .index
    • 划分规则
      • 时间:7天
      • 大小:1G
    • 命名规则:每个文件中存储最小offset
  6. Kafka的如何实现数据清理?
    • delete:时间

知识点02:课程目标

  1. Kafka数据安全的保障机制【重要】
    • 集群数据安全:副本机制
      • AR
      • ISR
      • OSR
      • HW
      • LEO
    • Leader副本的选举:Kafka Crontroller
    • 一次性语义:保证数据不丢失、不重复
      • 生产
        • 不丢失:acks retry
        • 不重复
      • 消费:通过自己手动管理Offset,消费分区成功、处理分区成功、手动提交offset存储
        • 不丢失
        • 不重复
  2. Kafka Eagle:基于网页版本的可视化工具
    • 用于监控Kafka集群
    • 自动实现Kafka集群负载的报表

知识点03:Kafka分区副本概念:AR、ISR、OSR

知识点04:Kafka数据同步概念:HW、LEO

  • 目标了解Kafka副本同步过程及同步中的概念
  • 路径
    • 什么是HW、LEO?
    • Follower副本如何与Leader进行同步的?
  • 实施
    • 什么是HW、LEO?
    • HW:当前这个分区所有副本同步的最低位置 1,消费者能消费到的最大位置
    • LEO:当前Leader已经写入数据的最新位置 1
    • 数据写入Leader及同步过程
      • step1:数据写入分区的Leader副本
      • step2:Follower到Leader副本中同步数据
  • 小结
    • HW:所有副本都同步的位置,消费者可以消费到的位置
    • LEO:leader当前最新的位置

知识点05:Kafka分区副本Leader选举

知识点06:消息队列的一次性语义

  • 目标了解消息队列的三种一次性语义
  • 路径
    • 什么是一次性语义?
  • 实施
    • at-most-once:至多一次
      • 会出现数据丢失的问题
    • at-least-once:至少一次
      • 会出现数据重复的问题
    • exactly-once:有且仅有一次
      • 只消费处理成功一次
      • 所有消息队列的目标
  • 小结
    • Kafka从理论上可以实现Exactly Once
    • 大多数的消息队列一般不能满足Exactly Once就满足at-least-once

知识点07:Kafka保证生产不丢失

知识点08:Kafka保证生产不重复

知识点09:Kafka保证消费一次性语义

知识点10:Kafka集群常用配置

  • 目标了解Kafka集群、生产者、消费者的常用属性配置
  • 路径
    • 有哪些常用的集群配置?
    • 有哪些常用的生产者配置?
    • 有哪些常用的消费者配置?
  • 实施
    • 集群配置:server.properties 属性值含义broker.idint类型Kafka服务端的唯一id,用于注册zookeeper,一般一台机器一个host.namehostname绑定该broker对应的机器地址port端口Kafka服务端端口:9092log.dirs目录kafka存放数据的路径zookeeper.connecthostname:2181zookeeper的地址zookeeper.session.timeout.ms6000zookeeper会话超时时间zookeeper.connection.timeout.ms6000zookeeper客户端连接超时时间num.partitions1分区的个数default.replication.factor1分区的副本数log.segment.bytes1073741824单个log文件的大小,默认1G生成一个log.index.interval.bytes4096log文件每隔多大生成一条indexlog.roll.hours168单个log文件生成的时间规则,默认7天一个loglog.cleaner.enabletrue开启日志清理log.cleanup.policydelete,compact默认为delete,删除过期数据,compact为合并数据log.retention.minutes分钟值segment生成多少分钟后删除log.retention.hours小时值segment生成多少小时后删除【168】,7天log.retention.ms毫秒值segment生成多少毫秒后删除log.retention.bytes-1删除文件阈值,如果整个数据文件大小,超过阈值的一个segment大小,将会删除最老的segment,直到小于阈值log.retention.check.interval.ms毫秒值【5分钟】多长时间检查一次是否有数据要标记删除log.cleaner.delete.retention.ms毫秒值segment标记删除后多长时间删除log.cleaner.backoff.ms毫秒值多长时间检查一次是否有数据要删除log.flush.interval.messagesLong.MaxValue消息的条数达到阈值,将触发flush缓存到磁盘log.flush.interval.msLong.MaxValue隔多长时间将缓存数据写入磁盘auto.create.topics.enablefalse是否允许自动创建topic,不建议开启delete.topic.enabletrue允许删除topicreplica.lag.time.max.ms10000可用副本的同步超时时间replica.lag.max.messages4000可用副本的同步记录差,该参数在0.9以后被删除unclean.leader.election.enabletrue允许不在ISR中的副本成为leadernum.network.threads3接受客户端请求的线程数num.io.threads8处理读写硬盘的IO的线程数background.threads4后台处理的线程数,例如清理文件等
    • 生产配置:producer.properties 属性值含义bootstrap.servershostname:9092KafkaServer端地址poducer.typesync同步或者异步发送,0,1,allmin.insync.replicas3如果为同步,最小成功副本数buffer.memory33554432配置生产者本地发送数据的 缓存大小compression.typenone配置数据压缩,可配置snappypartitioner.classPartition指定分区的类acks1指定写入数据的保障方式request.timeout.ms10000等待ack确认的时间,超时发送失败retries0发送失败的重试次数batch.size16384批量发送的大小metadata.max.age.ms300000更新缓存的元数据【topic、分区leader等】
    • 消费配置:consumer.properties 属性值含义bootstrap.servershostname:9092指定Kafka的server地址group.idid消费者组的 名称consumer.id自动分配消费者idauto.offset.resetlatest新的消费者从哪里读取数据latest,earliestauto.commit.enabletrue是否自动commit当前的offsetauto.commit.interval.ms1000自动提交的时间间隔
  • 小结
    • 常用属性了解即可

知识点11:可视化工具Kafka Eagle部署及使用

知识点12:Kafka数据限流

Kafka核心:Kafka理论

  • Kafka中分布式架构以及概念
  • Kafka读写流程:为什么很快
  • Kafka怎么保证一次性语义
    • 生产不丢失不重复
    • 消费不丢失不重复
      • 自己管理offset
  • Kafka使用
    • Topic的管理:分区、副本
    • 生产者:数据采集工具或者分布式计算程序
    • 消费者:分布式流式计算程序

Scala:提前预习

1、变量、循环、判断

目的:开发Spark或者Flink程序

Scala:提前预习

1、变量、循环、判断

目的:开发Spark或者Flink程序

0 人点赞