分布式实时消息队列Kafka(五)
知识点01:课程回顾
- 一个消费者组中有多个消费者,消费多个Topic多个分区,分区分配给消费者的分配规则有哪些?
- 分配场景
- 第一次消费:将分区分配给消费者
- 负载均衡实现:在消费过程中,如果有部分消费者故障或者增加了新的消费
- 基本规则
- 一个分区只能被一个消费者所消费
- 一个消费者可以消费多个分区
- 分配规则
- 范围分配
- 规则:每个消费者消费一定范围的分区,尽量均分,如果不能均分,优先分配给标号小的
- 应用:消费比较少的Topic,或者多个Topic都能均分
- 轮询分配
- 规则:按照所有分区的编号进行顺序轮询分配
- 应用:所有消费者消费的Topic都是一致的,能实现将所有分区轮询分配给所有消费者
- 黏性分配
- 规则:尽量保证分配的均衡,尽量避免网络的IO,如果出现故障,保证 每个消费者依旧消费原来的分区,将多出来的分区均分给剩下的消费者
- 应用:建议使用分配规则
- 范围分配
- 分配场景
- 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副本中同步数据
- Kafka读取数据过程是什么?
- step1:消费者消费请求提交Kafka:Topic、Partition、Offset
- step2:根据Topic以及Partition来获取要读取的分区编号
- step3:根据分区编号从元数据中找到这个分区对应的leader副本
- step4:先读取Broker对应的PageCache,如果有,使用零拷贝机制读取内存中的数据
- step5:没有就读取Segment,先根据offset决定读取哪个Segment
- step6:先读.index文件,从索引中获取offset对应在这个文件中的最近位置
- step7:根据最近位置读取.log文件,获取要读取的数据
- 为什么Kafka读写会很快?
- 写
- 先写PageCache:内存缓冲机制
- 实现了顺序写的过程
- 读
- 先读PageCache,使用零拷贝机制
- 按照offset顺序读取数据
- 划分Segment
- 构建index索引
- 写
- 为什么要设计Segment?
- 设计原因
- 加快查询效率
- 增加删除效率:避免一条一条删除,按照整个Segment进行删除
- 如何实现:一对文件
- .log
- .index
- 划分规则
- 时间:7天
- 大小:1G
- 命名规则:每个文件中存储最小offset
- 设计原因
- Kafka的如何实现数据清理?
- delete:时间
知识点02:课程目标
- Kafka数据安全的保障机制【重要】
- 集群数据安全:副本机制
- AR
- ISR
- OSR
- HW
- LEO
- Leader副本的选举:Kafka Crontroller
- 一次性语义:保证数据不丢失、不重复
- 生产
- 不丢失:acks retry
- 不重复
- 消费:通过自己手动管理Offset,消费分区成功、处理分区成功、手动提交offset存储
- 不丢失
- 不重复
- 生产
- 集群数据安全:副本机制
- Kafka Eagle:基于网页版本的可视化工具
- 用于监控Kafka集群
- 自动实现Kafka集群负载的报表
知识点03:Kafka分区副本概念:AR、ISR、OSR
知识点04:Kafka数据同步概念:HW、LEO
- 目标:了解Kafka副本同步过程及同步中的概念
- 路径
- 什么是HW、LEO?
- Follower副本如何与Leader进行同步的?
- 实施
- 什么是HW、LEO?
- 数据写入Leader及同步过程
- step1:数据写入分区的Leader副本
- step2:Follower到Leader副本中同步数据
- 小结
- HW:所有副本都同步的位置,消费者可以消费到的位置
- LEO:leader当前最新的位置
知识点05:Kafka分区副本Leader选举
知识点06:消息队列的一次性语义
- 目标:了解消息队列的三种一次性语义
- 路径
- 什么是一次性语义?
- 实施
- at-most-once:至多一次
- 会出现数据丢失的问题
- at-least-once:至少一次
- 会出现数据重复的问题
- exactly-once:有且仅有一次
- 只消费处理成功一次
- 所有消息队列的目标
- at-most-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程序