kafka相关知识点

一、基本概念

1.Broker:
	消息中间件所在的服务器
2.Topic:(主题)
	kafka发送消息必须指定的主题
3.Partition(分区)
	Partition是物理上的概念,体现在磁盘上面,每个Topic包含一个或多个Partition
4.Producer(生产者)
	负责发布消息到Kafka broker
5.Consumer(消费者) 
	消息消费者,向Kafka broker读取消息的客户端
6.Consumer Group(消费者群组)
	每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属
于默认的group)同一个主题可被不同组中的消费者消费,同一主题只能被同组中的一个消费者消费
7.offset(偏移量)
	是kafka用来确定消息是否被消费过的标识,在kafka内部体现就是一个递增的数字 
8.kafka发送消息的方式(配置文件)
	生产一条发送一条
	将消息缓存到客户端达到指定大小一起打包发送
	将消息压缩发送

二、安装&启动

安装:单机版官网下载解压即可
启动:进入kafka目录 先启动zk在启动kafka(这里启用自带zk)
1、bin/zookeeper-server-start.sh config/zookeeper.properties
2、bin/kafka-server-start.sh config/server.properties
关闭:
1、bin/zookeeper-server-stop.sh 
2、bin/kafka-server-stop.sh

三、优缺点

优点:
1、基于磁盘的数据存储
2、高伸缩性
3、高性能  

缺点
1、运维难度大 
2、偶尔有数据混乱的情况  
3、对zookeeper强依赖

应用场景
1、收集指标和日志    
2、提交日志   
3、流处理
4、多副本模式下对带宽有一定要求

四、基本操作命令

进入bin目录
1、列出所有主题
./kafka-topics.sh--zookeeper localhost:2181 --list
或
./kafka-topics.sh --list --zookeeper node1:2181,node2:2181,node3:2181

2、列出所有主题的详细信息
./kafka-topics.sh --zookeeper localhost:2181/kafka --describe
查看某个主题详情
./kafka-topics.sh  --describe --zookeeper node1:2181,node2:2181,node3:2181 --topic test01

3、创建主题(主题:my-topic,副本:1,分区:8./kafka-topics.sh --zookeeper localhost:2181 --create --replication-factor 1 --partitions 8 --topic my-topic
或
./kafka-topics.sh  --create --zookeeper node1:2181,node2:2181,node3:2181 --topic test01 --partitions 3  --replication-factor 2

4、删除topic
./kafka-topics.sh --delete --zookeeper node1:2181,node2:2181,node3:2181 --topic test01

5、测试写入的效率
./kafka-producer-perf-test.sh --topic test02 --num-records 5000000 --throughput -1 --record-size 1000 --producer-props bootstrap.servers=node1:9092,node2:9092,node3:9092 ack=1
属性说明:
	--topic 指定要将数据写入到那个topic中
	--num-records : 总写入消息量
	--throughput : 是否需要限流  -1表示不限制
	--record-size : 每条数据的大小(字节)
	--producer-props : 设置生产者的配置信息
		bootstrap.servers : 集群地址
		ack : 消息确认方案
		
6、测试读取效率
./kafka-consumer-perf-test.sh --broker-list node1:9092,node2:9092,node3:9092 --topic test02 --fetch-size 1048576 --messages 5000000

--fetch-size : 每次拉取的数据大小

五、server参数

log.dirs: 
	日志文件存储地址, 可以设置多个
num.recovery.threads.per.data.dir:
	用来读取日志文件的线程数量,对应每一个log.dirs 若此参数为2 log.dirs 为2个目录 那么就会有4个线程来读取
auto.create.topics.enable:
	是否自动创建tiopic
num.partitions: 
	创建topic的时候自动创建多少个分区 (可以在创建topic的时候手动指定)
log.retention.hours:
	 日志文件保留时间 超时即删除
log.retention.bytes: 
	日志文件最大大小
log.segment.bytes: 
	当日志文件达到一定大小时,开辟新的文件来存储(分片存储)
log.segment.ms: 
	同上 只是当达到一定时间时 开辟新的文件
message.max.bytes: 
	broker能接收的最大消息大小(单条) 默认1M

六、product参数

acks: 
	 至少要多少个分区副本接收到了消息返回确认消息 一般是 
	 0:只要消息发送出去了就确认(不管是否失败) 
	 1:只要 有一个broker接收到了消息 就返回 
	 all: 所有集群副本都接收到了消息确认
buffer.memory:   
	生产者缓存在本地的消息大小 : 如果生产者在生产消息的速度过快 快过了往 broker发送消息的速度 那么就会出现buffer.memory不足的问题 默认值为32M(单位是byte )大概3355000左右
max.block.ms: 
	 生产者获取kafka元数据(集群数据,服务器数据等) 等待时间 : 当因网络原因导致客户端与服务器通讯时等待的时间超过此值时 会抛出一个TimeOutExctption 默认值为 60000ms
retries:  
	设置生产者生产消息失败后重试的次数 默认值 3次
retry.backoff.ms:  
	设置生产者每次重试的间隔 默认 100ms
batch.size:  
	生产者批次发送消息的大小 默认16k 注意单位还是byte
linger.ms:  
	生产者生产消息后等待多少毫秒发送到broker 与batch.size 谁先到达就根据谁 默认值为0
compression.type: 
	kafka在压缩数据时使用的压缩算法 可选参数有:none、gzip、snappy none即不压缩 gzip,和snappy压缩算法之间取舍的话 gzip压缩率比较高 系统cpu占用比较大 但是带来的好处是 网络带宽占用少, snappy压缩比没有gzip高 cpu占用率不是很高 性能也还行, 如果网络带宽比较紧张的话 可以选择gzip 一般推荐snappy
client.id:  
	一个标识, 可以用来标识消息来自哪, 不影响kafka消息生产 
max.in.flight.requests.per.connection:  
	指定kafka一次发送请求在得到服务器回应之前,可发送的消息数量

七、consumer参数

fetch.min.bytes:
	该属性指定了消费者从服务器获取记录的最小字节数。
fetch.max.wait.ms:500ms
	指定 broker 的等待时间,默认是如果没有足够的数据流入Kafka,消费者获取最小数据量的要求就得不到满足,最终导致 500ms 的延迟。如果 fetch.max.wait.ms 被设为 100ms,并且 fetch.min.bytes 被设为 1MB,那么 Kafka 在收到消费者的请求后,要么返回 1MB 数据,要么在 100ms 后返回所有可用的数据,就看哪个条件先得到满足。 默认值为500ms(两者互补)
max.partition.fetch.bytes:1MB
	该属性指定了服务器从每个分区里返回给消费者的最大字节数。默认值是 1MB
session.timeout.ms : 10000ms
	消费者多久没有发送心跳给服务器服务器则认为消费者死亡/退出消费者组 默认值:10000ms
heartbeat.interval.ms :3000ms
 消费者往kafka服务器发送心跳的间隔 一般设置为session.timeout.ms的三分之一 默认值:3000ms
auto.offset.reset:latest
	当消费者本地没有对应分区的offset时 会根据此参数做不同的处理 默认值为:latest
latest 
	当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据 
earliest 
	当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费 
none 
	topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常
enable.auto.commit:true|false
	该属性指定了消费者是否自动提交偏移量,默认值是 true。为了尽量避免出现重复数据和数据丢失,可以把它设为 false,由自己控制何时提交偏移量。如果把它设为 true,还可以通过配置 auto.commit.interval.ms 属性来控制提交的频率。
partition.assignment.strategy
	PartitionAssignor 根据给定的消费者和主题,决定哪些分区应该被分配给哪个消费者。Kafka 有两个默认的分配策略。 
	1.Range:
		该策略会把主题的若干个连续的分区分配给消费者。
	2.RoundRobin:
		该策略把主题的所有分区逐个分配给消费者。
max.poll.records:500
  单次调用 poll() 方法最多能够返回的记录条数 ,默认值 500

receive.buffer.bytes:64k 
	默认值 64k 单位 bytes
send.buffer.bytes :128k
	默认值 128k 单位 bytes
 这两个参数分别指定了 TCP socket 接收和发送数据包的缓冲区大小。如果它们被设为 -1

八、问题解决方案

1.问题:(rebalance)分区再均衡时导致重复消费
	如何引发分区再均衡:
		a、主题分区数发生变化
		b、consumer加入、离开、掉线
	当触发rebalance时,kafka正在分配分区所有权,这时的消费者是不能消费的,也导致消费者消费时的偏移量没有来得及提交给分区,这时有可能会导致一个消息被多个消费者重复消费
解决方案:
	在消费者订阅时, 添加一个再均衡监听器, 也就是当kafka在做Rebalance 操作前后 均会调用再均衡监听器 那么这时候我们可以在kafka Rebalance之前提交我们消费者最后处理的消息来解决这个问题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值