kafka broker

kafka broker

  1. kafka broker工作流程

    1. zookeeper存储的kafka信息
      在这里插入图片描述

      1)启动Zookeeper客户端  bin/zkCli.sh
      2)通过ls命令可以查看kafka相关信息 ls /kafka
      
    2. 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)步骤中的内容
      
    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。一般不建议修改,交给系统													自己管理。
      
  2. kafka副本

    1. 副本基本信息

      (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副本同步时,延迟过多的副本。
      
    2. 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
    
    1. leader和follower故障处理细节

      1. follower处理故障
        在这里插入图片描述

      2. leader处理故障

        在这里插入图片描述

    2. 文件存储

      1. topic数据的存储机制

      在这里插入图片描述

      1. 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
        
        
      2. index文件和log文件详解

        日志存储参数配置
        参数							描述
        log.segment.bytes			Kafka中log日志是分成一块块存储的,此配置是指log日志划分 成块的大小,默认值1G。
        log.index.interval.bytes	默认4kb,kafka里面每当写入了4kb大小的日志(.log),然后就往index文件里面记录一个索							    引。 稀疏索引。
        

        在这里插入图片描述

      3. 文件清理策略

        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)
        
        
        
  3. 高效读写数据

    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。一般不建议修改,交给系统自己管理。
          ```
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值