一、基本概念
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之前提交我们消费者最后处理的消息来解决这个问题