kafka broker
-
kafka broker工作流程
-
zookeeper存储的kafka信息
1)启动Zookeeper客户端 bin/zkCli.sh 2)通过ls命令可以查看kafka相关信息 ls /kafka
-
kafka broker总体工作流程
模拟Kafka上下线,Zookeeper中数据变化 1)查看/kafka/brokers/ids路径上的节点 ls /kafka/brokers/ids [0, 1, 2] 2)查看/kafka/controller路径上的数据 get /kafka/controller {"version":1,"brokerid":0,"timestamp":"1637292471777"} 3)查看/kafka/brokers/topics/first/partitions/0/state路径上的数据 get /kafka/brokers/topics/first/partitions/0/state {"controller_epoch":24,"leader":0,"version":1,"leader_epoch":18,"isr":[0,1,2]} 4)停止192.168.233.28上的kafka bin/kafka-server-stop.sh 5)再次查看/kafka/brokers/ids路径上的节点 ls /kafka/brokers/ids [0, 1] 6)再次查看/kafka/controller路径上的数据 get /kafka/controller {"version":1,"brokerid":0,"timestamp":"1637292471777"} 7)再次查看/kafka/brokers/topics/first/partitions/0/state路径上的数据 get /kafka/brokers/topics/first/partitions/0/state {"controller_epoch":24,"leader":0,"version":1,"leader_epoch":18,"isr":[0,1]} 8)启动192.168.233.28上的kafka bin/kafka-server-start.sh -daemon ./config/server.properties 9)再次观察(1)、(2)、(3)步骤中的内容
-
broker 重要参数
参数名称 描述 replica.lag.time.max.ms ISR中, 如果Follower长时间未向Leader发送通信请求或同步数据,则该 Follower将被踢出ISR。该时间阈值,默认30s。 auto.leader.rebalance.enable 默认是true。 自动Leader Partition 平衡。 leader.imbalance.per.broker.percentage 默认是10%。每个broker允许的不平衡的leader的比率。如果每个 broker超过了这个值,控制器会触发leader的平衡。 leader.imbalance.check.interval.seconds 默认值300秒。检查leader负载是否平衡的间隔时间。 log.segment.bytes Kafka中log日志是分成一块块存储的,此配置是指log日志划分 成 块的大小,默认值1G。 log.index.interval.bytes 默认4kb,kafka里面每当写入了4kb大小的日志(.log),然后就往 index文件里面记录一个索引。 log.retention.hours Kafka中数据保存的时间,默认7天。 log.retention.minutes Kafka中数据保存的时间,分钟级别,默认关闭。 log.retention.ms Kafka中数据保存的时间,毫秒级别,默认关闭。 log.retention.check.interval.ms 检查数据是否保存超时的间隔,默认是5分钟。 log.retention.bytes 默认等于-1,表示无穷大。超过设置的所有日志总大小,删除最早的 segment。 log.cleanup.policy 默认是delete,表示所有数据启用删除策略;如果设置值为 compact,表示所有数据启用压缩策略。 num.io.threads 默认是8。负责写磁盘的线程数。整个参数值要占总核数的50%。 num.replica.fetchers 副本拉取线程数,这个参数占总核数的50%的1/3 num.network.threads 默认是3。数据传输线程数,这个参数占总核数的50%的2/3 。 log.flush.interval.messages 强制页缓存刷写到磁盘的条数,默认是long的最大值, 9223372036854775807。一般不建议修改,交给系统自己管理。 log.flush.interval.ms 每隔多久,刷数据到磁盘,默认是null。一般不建议修改,交给系统 自己管理。
-
-
kafka副本
-
副本基本信息
(1)Kafka副本作用:提高数据可靠性。 (2)Kafka默认副本1个,生产环境一般配置为2个,保证数据可靠性;太多副本会增加磁盘存储空间,增加网络上数据传输,降低效率。 (3)Kafka中副本分为:Leader和Follower。Kafka生产者只会把数据发往Leader,然后Follower找Leader进行同步数据。 (4)Kafka分区中的所有副本统称为AR(Assigned Repllicas)。 AR = ISR + OSR ISR,表示和Leader保持同步的Follower集合。如果Follower长时间未向Leader发送通信请求或同步数据,则该Follower将被踢出 ISR。该时间阈值由replica.lag.time.max.ms参数设定,默认30s。Leader发生故障之后,就会从ISR中选举新的Leader。 OSR,表示Follower与Leader副本同步时,延迟过多的副本。
-
leader 选举流程
Kafka集群中有一个broker的Controller会被选举为Controller Leader,负责管理集群broker的上下线,所有topic的分区副本分配和Leader选举等工作。 Controller的信息同步工作是依赖于Zookeeper的 假设有kafka26、kafka27、kafka28、kafka29等4台服务器。 1)创建一个新的topic,4个分区,4个副本 bin/kafka-topics.sh --bootstrap-server kafka26:9092 --create --topic lpy1 --partitions 4 --replication-factor 4 2)查看Leader分布情况 bin/kafka-topics.sh --bootstrap-server kafka26:9092 --describe --topic lpy1 Topic: lpy1 TopicId: awpgX_7WR-OX3Vl6HE8sVg PartitionCount: 4 ReplicationFactor: 4 Configs: segment.bytes=1073741824 Topic: lpy1 Partition: 0 Leader: 3 Replicas: 3,0,2,1 Isr: 3,0,2,1 Topic: lpy1 Partition: 1 Leader: 1 Replicas: 1,2,3,0 Isr: 1,2,3,0 Topic: lpy1 Partition: 2 Leader: 0 Replicas: 0,3,1,2 Isr: 0,3,1,2 Topic: lpy1 Partition: 3 Leader: 2 Replicas: 2,1,0,3 Isr: 2,1,0,3 3)停止掉kafka29的kafka进程,并查看Leader分区情况 bin/kafka-server-stop.sh bin/kafka-topics.sh --bootstrap-server kafka26:9092 --describe --topic lpy1 Topic: lpy1 TopicId: awpgX_7WR-OX3Vl6HE8sVg PartitionCount: 4 ReplicationFactor: 4 Configs: segment.bytes=1073741824 Topic: lpy1 Partition: 0 Leader: 0 Replicas: 3,0,2,1 Isr: 0,2,1 Topic: lpy1 Partition: 1 Leader: 1 Replicas: 1,2,3,0 Isr: 1,2,0 Topic: lpy1 Partition: 2 Leader: 0 Replicas: 0,3,1,2 Isr: 0,1,2 Topic: lpy1 Partition: 3 Leader: 2 Replicas: 2,1,0,3 Isr: 2,1,0 4)停止掉kafka28的kafka进程,并查看Leader分区情况 bin/kafka-server-stop.sh bin/kafka-topics.sh --bootstrap-server kafka26:9092 --describe --topic lpy1 Topic: lpy1 TopicId: awpgX_7WR-OX3Vl6HE8sVg PartitionCount: 4 ReplicationFactor: 4 Configs: segment.bytes=1073741824 Topic: lpy1 Partition: 0 Leader: 0 Replicas: 3,0,2,1 Isr: 0,1 Topic: lpy1 Partition: 1 Leader: 1 Replicas: 1,2,3,0 Isr: 1,0 Topic: lpy1 Partition: 2 Leader: 0 Replicas: 0,3,1,2 Isr: 0,1 Topic: lpy1 Partition: 3 Leader: 1 Replicas: 2,1,0,3 Isr: 1,0 5)启动kafka29的kafka进程,并查看Leader分区情况 bin/kafka-server-start.sh -daemon config/server.properties bin/kafka-topics.sh --bootstrap-server kafka26:9092 --describe --topic atguigu1 Topic: atguigu1 TopicId: awpgX_7WR-OX3Vl6HE8sVg PartitionCount: 4 ReplicationFactor: 4 Configs: segment.bytes=1073741824 Topic: lpy1 Partition: 0 Leader: 0 Replicas: 3,0,2,1 Isr: 0,1,3 Topic: lpy1 Partition: 1 Leader: 1 Replicas: 1,2,3,0 Isr: 1,0,3 Topic: lpy1 Partition: 2 Leader: 0 Replicas: 0,3,1,2 Isr: 0,1,3 Topic: lpy1 Partition: 3 Leader: 1 Replicas: 2,1,0,3 Isr: 1,0,3 6)启动kafka28的kafka进程,并查看Leader分区情况 bin/kafka-server-start.sh --daemon config/server.properties bin/kafka-topics.sh --bootstrap-server kafka26:9092 --describe --topic lpy1 Topic: atguigu1 TopicId: awpgX_7WR-OX3Vl6HE8sVg PartitionCount: 4 ReplicationFactor: 4 Configs: segment.bytes=1073741824 Topic: lpy1 Partition: 0 Leader: 0 Replicas: 3,0,2,1 Isr: 0,1,3,2 Topic: lpy1 Partition: 1 Leader: 1 Replicas: 1,2,3,0 Isr: 1,0,3,2 Topic: lpy1 Partition: 2 Leader: 0 Replicas: 0,3,1,2 Isr: 0,1,3,2 Topic: lpy1 Partition: 3 Leader: 1 Replicas: 2,1,0,3 Isr: 1,0,3,2 7)停止掉kafka27的kafka进程,并查看Leader分区情况 bin/kafka-server-stop.sh bin/kafka-topics.sh --bootstrap-server kafka26:9092 --describe --topic lpy1 Topic: atguigu1 TopicId: awpgX_7WR-OX3Vl6HE8sVg PartitionCount: 4 ReplicationFactor: 4 Configs: segment.bytes=1073741824 Topic: lpy1 Partition: 0 Leader: 0 Replicas: 3,0,2,1 Isr: 0,3,2 Topic: lpy1 Partition: 1 Leader: 2 Replicas: 1,2,3,0 Isr: 0,3,2 Topic: lpy1 Partition: 2 Leader: 0 Replicas: 0,3,1,2 Isr: 0,3,2 Topic: lpy1 Partition: 3 Leader: 2 Replicas: 2,1,0,3 Isr: 0,3,2
-
leader和follower故障处理细节
-
follower处理故障
-
leader处理故障
-
-
文件存储
- topic数据的存储机制
-
topic数据到底存储在什么位置
1)启动生产者,并发送消息 bin/kafka-console-producer.sh --bootstrap-server kafka26:9092 --topic first >hello world 2)查看kafka26(或者kafka27、kafka28)的/opt/module/kafka/datas/first-1(first-0、first-2)路径上的文件 first-1]$ ls 00000000000000000092.index 00000000000000000092.log 00000000000000000092.snapshot 00000000000000000092.timeindex leader-epoch-checkpoint partition.metadata 3)直接查看log日志,发现是乱码。 first-1]$ cat 00000000000000000092.log 4)通过工具查看index和log信息。 kafka-run-class.sh kafka.tools.DumpLogSegments --files ./00000000000000000000.index Dumping ./00000000000000000000.index offset: 3 position: 152 first-1]$ kafka-run-class.sh kafka.tools.DumpLogSegments --files ./00000000000000000000.log Dumping datas/first-0/00000000000000000000.log Starting offset: 0 baseOffset: 0 lastOffset: 1 count: 2 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 0 CreateTime: 1636338440962 size: 75 magic: 2 compresscodec: none crc: 2745337109 isvalid: true baseOffset: 2 lastOffset: 2 count: 1 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 75 CreateTime: 1636351749089 size: 77 magic: 2 compresscodec: none crc: 273943004 isvalid: true baseOffset: 3 lastOffset: 3 count: 1 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 152 CreateTime: 1636351749119 size: 77 magic: 2 compresscodec: none crc: 106207379 isvalid: true baseOffset: 4 lastOffset: 8 count: 5 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 229 CreateTime: 1636353061435 size: 141 magic: 2 compresscodec: none crc: 157376877 isvalid: true baseOffset: 9 lastOffset: 13 count: 5 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 370 CreateTime: 1636353204051 size: 146 magic: 2 compresscodec: none crc: 4058582827 isvalid: true
-
index文件和log文件详解
日志存储参数配置 参数 描述 log.segment.bytes Kafka中log日志是分成一块块存储的,此配置是指log日志划分 成块的大小,默认值1G。 log.index.interval.bytes 默认4kb,kafka里面每当写入了4kb大小的日志(.log),然后就往index文件里面记录一个索 引。 稀疏索引。
-
文件清理策略
Kafka中默认的日志保存时间为7天,可以通过调整如下参数修改保存时间。 1:log.retention.hours,最低优先级小时,默认7天。 2:log.retention.minutes,分钟。 3:log.retention.ms,最高优先级毫秒 4:log.retention.check.interval.ms,负责设置检查周期,默认5分钟 那么日志一旦超过了设置的时间,怎么处理呢?Kafka中提供的日志清理策略有delete和compact两种 1)delete日志删除:将过期数据删除 log.cleanup.policy = delete 所有数据启用删除策略 (1)基于时间:默认打开。以segment中所有记录中的最大时间戳作为该文件时间戳。 (2)基于大小:默认关闭。超过设置的所有日志总大小,删除最早的segment。 log.retention.bytes,默认等于-1,表示无穷大。 2)compact日志压缩 ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/118e93f35b484ab997c837c7ed993d76.png#pic_center)
-
-
高效读写数据
1. Kafka本身是分布式集群,可以采用分区技术,并行度高。 2. 读数据采用稀疏索引,可以快速定位要消费的数据 3. 顺序写磁盘 1. Kafka的producer生产数据,要写入到log文件中,写的过程是一直追加到文件末端,为顺序写。官网有数据表明,同样的磁盘,顺序写能到600M/s,而随机写只有100K/s。这与磁盘的机械机构有关,顺序写之所以快,是因为其省去了大量磁头寻址的时间 4. 页缓存+零拷贝结束 1. ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d85820950dc54495b2d22e46b2554ebc.png#pic_center) 2. ``` 参数 描述 log.flush.interval.messages 强制页缓存刷写到磁盘的条数,默认是long的最大值,9223372036854775807。 一般不建议修改,交给系统自己管理。 log.flush.interval.ms 每隔多久,刷数据到磁盘,默认是null。一般不建议修改,交给系统自己管理。 ```