kafka中分区与主题,副本,AR,ISR,控制器,leader选举

主题和分区是kafka中两个核心概念,所有的相关操作都是围绕这两个来进行的。消费者和生产者的设计和相关操作都是对主题和分区层面的操作。分区是相对主题来说的,kafka中每个主题可以设置一个至多个分区,分区为kafka提供了伸缩和水平扩展的能力
kafka中为每个分区提供了一个到多个副本的,通过增加副本数量能够提高容灾能力。副本之间是一主多从关系,其中leader负责处理读写请求follower副本 只负责与leader副本同步消息,一般follower处于不同broker中,当leader副本出现故障的时候,按照一定逻辑从follower副本列表中选举一个副本成为新的leader继续对外提供读写服务。kafka通过多副本的机制实现了故障的自动转移,当某个broker节点出现故障时候仍然能够保证kafka服务可用。副本是相对分区来说的
AR:分区中的所有副本统称为AR(Assigned Replicas)
ISR:分区中与leader副本保持一定程度同步的副本成为ISR(In-Sybc Replicas)
HW:High WaterMak,高水位,一个特定的消息偏移量offset,消费者只能消费这个offset之前的消息
LEO:Log End Offset 当前日志文件中下一条待写入消息的offset。ISR副本中每个副本都会维护自身的LEO,而ISR副本集合中最小的LEO即为分区的HW
从底层上来说,主题和分区是一种相对逻辑上的概念,在底层实际上是每个副本对应一个日志文件。
kafka中分区与主题,副本,AR,ISR,控制器,leader选举_第1张图片
一般而言,副本需要在不同broker节点上,这样能够充分保证数据的可用性和有效的冗余。
创建主题:

sh bin/kafka-topics.sh --zookeeper 10.202.82.49:2181 --create --topic test-topic-002 --partitions 3 --replication-factor 3

列出主题:

sh bin/kafka-topics.sh --zookeeper 10.202.82.49:2181 --list

查看某一主题具体信息:

sh bin/kafka-topics.sh --zookeeper 10.202.82.49:2181 --describe --topic test-topic-002

删除主题:

sh bin/kafka-topics.sh --zookeeper 10.202.82.49:2181 --delete --topic test-topic-002

与主题相关配置参数在broker层面都有对应的参数:

主题端参数 对应broker端参数 描述
cleanup.policy log.cleanup.policy 日志压缩策略,默认为delete,还可配置为compact
compression.type compression.type 消息压缩类型,默认为producer,采用生产者使用的压缩类型,还可以配置为uncopressed,snappy,lz4,gzip
delte.retention.ms log.cleaner.delete.retention.ms 标识为删除的数据能够保留多久,默认为1天
file.delete.delay.ms log.segment.delete.delay.ms 删除文件前等待多长时间,默认为1分钟
flush.messages log.flush.interval.messages 需要收集多少消息才会强制刷新到磁盘,默认为Long.Max,建议不要修改此值
flush.ms llog.flush.interval.ms 需要等待多久才将消息强制刷新到磁盘,默认值为Long.Max,建议不要修改此值
follower.replication.throttled.replicas follower.replication.throttled.replicas 配置被限制速率的主体所对应的follower副本列表
index.interval.bytes log.index.interval.bytes 用来控制添加索引项的频率,每超过这个参数设置的消息字节数时,就添加一股恶索引项,默认为4096
leader.replication.throttled.replicas leader.replication.throttled.replicas 配置被限制速率的主体对应的leader副本列表
max.message.bytes message.max.bytes 消息的最大字节数
message.timestamp.difference.max.ms log.message.timestamp.difference.max.ms 消息中自带时间戳与broker收到消息时的时间戳的最大差值,默认为Long.Max,只有当设置了message.timestamp.type=CreateTime时才有效
message.timestamp.type log.message.timestamp.type 消息的时间戳类型,默认值为CreateTime,或者LogAppendTime
min.cleanable.dirty.ratio log.cleaner.min.cleanable.ratio 日志清理的最小污浊率,默认为0.5
min.compaction.lag.ms log.cleaner.min,compaction.lag.ms 日志被清理前保留的最小时间,默认为0
min.insync.replicas min.insync.replicas ISR副本汇总至少要有多少个副本,默认为1
preallocate log.preallocate 创建日志分段时是否预分配空间,默认为false
retention.bytes log.retention.bytes 分区中能保留消息的总量,默认值为-1,没有限制
retention.ms log.retention.ms 使用delete日志清理策略消息能够保留多长时间,默认为7天,如果设置为-1,则没有时间限制,一直保留
segment.bytes log.segments 日志分段的最大值,默认为1GB
segment.index.bytes log.segment.index.bytes 日志索引分段的最大值,默认为10MB
segment.jitter.ms log.roll.jitter.ms 滚动日志分段时,在segment.ms基础之上增加随机数,默认值为0
segment.ms log.roll.ms 最长多久滚动一次日志分段,默认为7天
unclean.leader.election.enable unclean.leader.election.anable 是否可以从非ISR集合中选举leader,默认为false,如果为true,可能造成数据丢失

在创建主题的时候,分区和副本会尽可能的均匀分布到各个broker节点上面,对应leader节点分配也比较均匀。我们知道,每个分区只有leader节点提供读写服务,因此如果leader都集中在一个broker节点上回导致负载不均衡或者说分区不平衡,为此kafka中引入了优先副本的概念,即AR集合列表中的第一个副本,优先副本的选举是通过一定的方式促使优先副本能够选举为leader副本。需要注意的是分区的平衡不意味着整个kafka集群的负载均衡
当有新broker节点加入集群时,新创建的分区才有可能被分配到这个节点上,之前已经创建好的分区并不会自动分配到新的节点上,这样会导致新节点的负载和原先节点的负载质检严重不均衡。另外当有节点下线时,希望将该节点的分区相关数据迁移到其他可用节点上。为了解决这个问题,需要对分区副本再次进行合理的分配,也就是所谓的分区重平衡,kafka提供了kafka-reassign-partitions.sh来进行分区重分配的工作。分区重分配的本质是数据复制,数据复制会占用额外资源,在流量高峰的时候会严重影响性能。可以通过复制限流来对数据复制进行流量限制。

控制器:在kafka集群中,会有一个broker节点会被选举为kafka集群控制器(Kafka Controller),负责管理整个集群中所有分区和副本的状态。当某个分区的leader副本出现故障时,控制器负责为该分区选举出一个新的leader,当检测到某个分区的ISR集合发生变化的时候,控制器会通知所有broker更新其元数据信息,当使用kafka-topics.sh脚本为某个topic增加分区数量时还是控制器负责分区的重新分配。

分区leader选举:分区leader副本的选举是由控制器具体负责的,一般选举策略为OfflinePartitionLeaderElectionStrategy策略,基本思路是:按顺序在AR副本集合中查找第一个存活的副本,并且这个副本在ISR中,如果ISR中没有可用的副本,还会检查配置参数unclean.leader.election.enable参数,如果为true表示可以从非ISR副本集合中选举leader,这样从AR副本集合中找到第一个存活的副本即为leader。当分区重分配的时候,也需要重新进行leader选举,采取的策略是ReassignPartitionLeaderElectionStrategy。基本思路是从重分配的AR副本集合中找到第一个存活的副本并且这个副本在ISR集合中。

参数名称 描述
broker.id broker节点唯一ID标识
log.dir kafka消息日志文件存放目录
log.dirs kafka消息日志文件存放目录列表,逗号分隔
message.max.bytes broker能接收的消息的最大值,1000012B,如果修改这个参数,还需要参考max.request.size(客户端参数),max.message.bytes(topic端参数)影响
zookeeper.connect zk地址,ip:port,ip:port多个用逗号分隔
auto.create.topics.enable 是否开启自动创建主题 ,默认为true
auto.leader.rebalance.enable 是否开启leader再均衡功能 ,默认为true
background.threads 后台执行任务的线程数,默认为10
compression.type 消息压缩类型,默认为producer,采用生产者压缩类型
delete.topic.enable 是否可以删除主题
leader.imbalance.check.interval.seconds 检查leader是否分配不均衡的后期,默认为300s,5分钟
leader.imbalance.per.broker.percentage 允许leader发生不均衡的比例,超过这个比例会触发leader在均衡操作,默认为10%
log.flush.interval.messages 如果缓存中的消息在存入磁盘前达到这个参数所设定的阈值的时候会强制刷新日志到磁盘中,在写入磁盘还会经历操作系统页缓存,如果发生掉电,会发生数据丢失,调低这个参数会增大消息可靠性但是会降低系统整体性能,默认值为Long.Max
log.flush.interval.ms 刷新日志文件的时间间隔,如果没有配置,会根据log.flush.scheduler.interval.ms
log.flush.scheduler.interval.ms 检查日志文件是否需要刷新的时间间隔,默认为Long.Max
log.retention.bytes 日志文件的最大保留大小
log.retention.hours 日志文件保留时间,默认值为7天,一般会有 log.retention.{hours.minutes,ms} ms优先级最高,其次是hours
log.roll.hours 经过多长时间会强制新建一个日志分段,默认值为7天
log.rolll.ms
log.segment.bytes 日志分段文件最大值,默认为1GB
log.segment.delete.delay.ms 从操作系统删除日志分段文件前的等待时间
min.insync.replicas ISR副本集合中最少副本数
num.io.threads 处理请求的线程数,包含磁盘IO,默认8
num.network.threads 处理请求和返回相应的线程数
log.cleaner.enable 是否开启日志清理,默认为true
log.cleaner.threads 日志清理后台线程个数,默认值为1
log.cleanup.policy 日志清理策略,默认为delete,删除,还设有compact,压缩
log.index.interval.bytes 每隔多少字节消息写入量就添加一条索引,默认为4096
log.index.size.max.bytes 索引文件最大值,默认为10MB
log.message.timestamp.typ 消息中时间戳类型,默认为CreateTime,消息创建时间,还有LogAppengTime,消息追加到日志中的时间
log.retention.check.interval.ms 日志清理检查周期,默认值为5分钟
num.partitions 主题默认分区数量,默认值为1
reserverd.broker.max.id broker.id能够配置的最大值,同时reserverd.broker.max.id+1也是自动穿件broker.id的起始大小,默认值为1000
create.topic.policy.class.name 创建主题时用来校验合法性的策略,实现org.apache.kafka.server.policy.CreateTopicPolicy接口
broker.id.generation.enable 是否开启自动生成broker id
broker.rack broker机架信息

你可能感兴趣的:(Kafka)