1、生产者produce的配置文件:
1、ack机制:设置发送数据是否需要服务端的反馈,有三个值0,1,-1
request.required.acks = -1
#0: producer不会等待broker发送ack
#1: 当leader接收到消息之后发送ack
-1: 当所有的follower都同步消息成功后发送ack.
2、在向producer发送ack之前,broker(kafka集群)允许等待的最大时间 ,如果超时,broker将会向producer发送一个error ACK.意味着上一次消息因为某种原因未能成功(比如follower未能同步成功)
request.timeout.ms=10000
3、消息发送模式:同步(sync)一条一条的发和异步(async)一批 一批的发
producer.type=async
异步模式下,那么就会在设置的时间缓存消息,并一次性发送
queue.buffering.max.ms =5000
异步模式下,每次发送的最大消息数,前提是触发了queue.buffering.max.messages或是queue.buffering.max.ms的限制
batch.num.messages=200
异步的模式下 最长等待的消息数
queue.buffering.max.messages =10000
#当消息在producer端沉积的条数达到"queue.buffering.max.meesages"后
#-1: 无阻塞超时限制,消息不会被抛弃
#0:立即清空队列,消息被抛弃
queue.enqueue.timeout.ms = -1
2、Server.properties配置文件说明
1、#segment文件保留的最长时间,超时将被删除(默认保留168小时=7天)
log.retention.hours=168
2、#滚动生成新的segment文件的最大时间 1小时
log.roll.hours=1
#日志文件中每个segment的大小,默认为1G
log.segment.bytes=1073741824
3、#partion buffer中,消息的条数达到阈值,将触发flush到磁盘 kafka的数据一开始就是存储在PageCache上的,定期flush到磁盘上的
log.flush.interval.messages=10000
#消息buffer的时间,达到阈值,将触发flush到磁盘
log.flush.interval.ms=3000
3、消费者consumer的配置文件:
#指定 消费者组id
group.id=
当consumer消费一定量的消息之后,将会自动向zookeeper提交offset信息
注意offset信息并不是每消费一次消息就向zk提交一次,而是现在本地保存(内存),并定期提交,默认true
auto.commit.enable=true
自动更新时间。默认60 * 1000
auto.commit.interval.ms=1000
如果zookeeper没有offset值或offset值超出范围。那么就给个初始的offset。
earliest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
latest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据
none:topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常
auto.offset.reset=earliest
4、产生数据丢失的两种情况:
0: producer不会等待broker发送ack
1: 当leader接收到消息之后发送ack
-1: 当所有的follower都同步消息成功后发送ack.
1)同步模式:有3种状态保证消息被安全生产,但是在配置为1(只保证写入leader成功)的话,如果刚好leader partition挂了,数据就会丢失。
-1: 无阻塞超时限制,消息不会被抛弃
#0:立即清空队列,消息被抛弃
2)异步模式:当缓冲区满了,如果配置为0(还没有收到确认的情况下,缓冲池一满,就清空缓冲池里的消息),数据就会被立即丢弃掉。
5、如何避免kafka数据丢失的方法:
1)同步模式:确认机制设置为-1,也就是让消息写入leader和所有的副本。
2)异步模式:如果消息发出去了,但还没有收到确认的时候,缓冲池满了,在配置文件中设置成(-1)不限制阻塞超时的时间,也就说让生产端一直阻塞,这样也能保证数据不会丢失。
在数据消费时:避免数据丢失的方法:如果使用了storm,要开启storm的ackfail机制。
如果没有使用storm,确认数据被完成处理之后,再更新offset值。低级API中需要手动控制offset值。