目录
[2.1、server. properties](#2.1、server. properties)
[2.2、consumer. properties](#2.2、consumer. properties)
C++软件异常排查从入门到精通系列教程(核心精品专栏,订阅量已达600多个,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931C/C++实战专栏(重点专栏,专栏文章已更新480多篇,订阅量已达数百个,欢迎订阅,持续更新中...)https://blog.csdn.net/chenlycly/article/details/140824370C++ 软件开发从入门到实战(重点专栏,专栏文章已更新280多篇,欢迎订阅,持续更新中...)https://blog.csdn.net/chenlycly/category_12695902.htmlVC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件分析工具从入门到精通案例集锦(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/article/details/131405795开源组件及数据库技术(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_2276111.html
1、Kafka中的数据不丢失机制
1.1、生产者生产数据不丢失
发送消息方式
生产者发送给 kafka数据, 可以采用同步方式或异步方式
同步方式: 发送一批数据给 kafka后, 等待 kafka返回结果:
- 生产者等待10s,如果 broker没有给出 ack响应,就认为失败。
- 生产者重试3次, 如果还没有响应, 就报错。
异步方式: 发送一批数据给 kafka,只是提供一个回调函数:
- 先将数据保存在生产者端的 buffer中。 buffer大小是2万条 。
- 满足数据阈值或者数量阈值其中的一个条件就可以发送数据。
- 发送一批数据的大小是500条。
注: 如果 broker迟迟不给 ack,而 buffer又满了,开发者可以设置是否直接清空 buffer中的数据。
ack机制 (确认机制)
生产者数据发送出去, 需要服务端返回一个确认码, 即ack响应码;ack的响应有三个状态值0,1, -1
- 0: 生产者只负责发送数据, 不关心数据是否丢失, 丢失的数据, 需要再次发送。
- 1:partition的 leader收到数据,不管 follow是否同步完数据,响应的状态码为1。
- -1: 所有的从节点都收到数据, 响应的状态码为-1。
如果 broker端一直不返回 ack状态,producer永远不知道是否成功;producer可以设置一个超时时间10s, 超过时间认为失败。
1.2、broker中数据不丢失
在 broker中,保证数据不丢失主要是通过副本因子 (冗余) , 防止数据丢失。
1.3、消费者消费数据不丢失
在消费者消费数据的时候, 只要每个消费者记录好 offset值即可,就能保证数据不丢失。也就是需要我们自己维护偏移量( offset),可保存在 Redis中。
在这里,给大家重点推荐一下我的几个热门畅销专栏,欢迎订阅:(博客主页还有其他专栏,可以去查看)
专栏1: (该精品技术专栏的订阅量已达到580多个,专栏中包含大量项目实战分析案例,有很强的实战参考价值 ,广受好评!专栏文章已经更新到200篇以上,持续更新中!欢迎订阅!)
C++软件调试与异常排查从入门到精通系列文章汇总(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/article/details/125529931
本专栏根据多年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法 ,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的项目问题实战分析实例(很有实战参考价值),带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!
考察一个开发人员的水平,一是看其编码及设计能力,二是要看其软件调试能力 !所以软件调试能力(排查软件异常的能力)很重要,必须重视起来!能解决一般人解决不了的问题,既能提升个人能力及价值,也能体现对团队及公司的贡献!
**专栏中的文章都是通过项目实战总结出来的,包含大量项目问题实战分析案例,有很强的实战参考价值!**专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!
专栏2: (本专栏涵盖了C++多方面的内容,是当前重点打造的专栏,订阅量已达220多个,专栏文章已经更新到480多篇,持续更新中!欢迎订阅!)
C/C++实战进阶(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_11931267.html
以多年的开发实战为基础,总结并讲解一些的C/C++基础与项目实战进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域多个方面的内容,包括C++基础及编程要点(模版泛型编程、STL容器及算法函数的使用等)、数据结构与算法、C++11及以上新特性(不仅看开源代码会用到,日常编码中也会用到部分新特性,面试时也会涉及到)、常用C++开源库的介绍与使用、代码分享(调用系统API、使用开源库)、常用编程技术(动态库、多线程、多进程、数据库及网络编程等)、软件UI编程(Win32/duilib/QT/MFC)、C++软件调试技术(排查软件异常的手段与方法、分析C++软件异常的基础知识、常用软件分析工具使用、实战问题分析案例等)、设计模式、网络基础知识与网络问题分析进阶内容等。
专栏3:
C++常用软件分析工具从入门到精通案例集锦汇总(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/article/details/131405795
常用的C++软件辅助分析工具有SPY++、PE工具、Dependency Walker、GDIView、Process Explorer、Process Monitor、API Monitor、Clumsy、Windbg、IDA Pro等,本专栏详细介绍如何使用这些工具去巧妙地分析和解决日常工作中遇到的问题,很有实战参考价值!
专栏4:
VC++常用功能开发汇总(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/article/details/124272585
将10多年C++开发实践中常用的功能,以高质量的代码展现出来。这些常用的高质量规范代码,可以直接拿到项目中使用,能有效地解决软件开发过程中遇到的问题。
专栏5: (本专栏涵盖了C++多方面的内容,是当前重点打造的专栏,专栏文章已经更新到280多篇,持续更新中!欢迎订阅!)
C++ 软件开发从入门到实战(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_12695902.html
根据多年C++软件开发实践,详细地总结了C/C++软件开发相关技术实现细节,分享了大量的实战案例,很有实战参考价值。
2、Kafka配置文件说明
2.1、server. properties
bash
#broker的全局唯⼀编号,不能重复
broker.id=0
#⽤来监听链接的端⼝,producer或consumer将在此端⼝建⽴连接
port=9092
#处理⽹络请求的线程数量
num.network.threads=3
#⽤来处理磁盘IO的线程数量
num.io.threads=8
#发送套接字的缓冲区⼤⼩
socket.send.buffer.bytes=102400
#接受套接字的缓冲区⼤⼩
socket.receive.buffer.bytes=102400
#请求套接字的缓冲区⼤⼩
socket.request.max.bytes=104857600
#kafka运⾏⽇志存放的路径
log.dirs=/export/data/kafka/
#topic在当前broker上的分⽚个数
num.partitions=2
#⽤来恢复和清理data下数据的线程数量
num.recovery.threads.per.data.dir=1
#segment⽂件保留的最⻓时间,超时将被删除
log.retention.hours=168
#滚动⽣成新的segment⽂件的最⼤时间
log.roll.hours=1
#⽇志⽂件中每个segment的⼤⼩,默认为1G
log.segment.bytes=1073741824
#周期性检查⽂件⼤⼩的时间
log.retention.check.interval.ms=300000
#⽇志清理是否打开
log.cleaner.enable=true
#broker需要使⽤zookeeper保存meta数据
zookeeper.connect=zk01:2181,zk02:2181,zk03:2181
#zookeeper链接超时时间
zookeeper.connection.timeout.ms=6000
#partion buffer中,消息的条数达到阈值,将触发flush到磁盘
log.flush.interval.messages=10000
#消息buffer的时间,达到阈值,将触发flush到磁盘
log.flush.interval.ms=3000
#删除topic需要server.properties中设置delete.topic.enable=true否则只是标记删除
delete.topic.enable=true
#此处的host.name为本机IP(重要),如果不改,则客户端会抛出:Producer connection to lo
calhost:9092 unsuccessful 错误!
host.name=kafka01
advertised.host.name=192.168.140.128
producer⽣产者配置⽂件说明
#指定kafka节点列表,⽤于获取metadata,不必全部指定
metadata.broker.list=node01:9092,node02:9092,node03:9092
# 指定分区处理类。默认kafka.producer.DefaultPartitioner,表通过key哈希到对应分区
#partitioner.class=kafka.producer.DefaultPartitioner
# 是否压缩,默认0表示不压缩,1表示⽤gzip压缩,2表示⽤snappy压缩。压缩后消息中会有头来
指明消息压缩类型,故在消费者端消息解压是透明的⽆需指定。
compression.codec=none
# 指定序列化处理类
serializer.class=kafka.serializer.DefaultEncoder
# 如果要压缩消息,这⾥指定哪些topic要压缩消息,默认empty,表示不压缩。
#compressed.topics=
# 设置发送数据是否需要服务端的反馈,有三个值0,1,-1
# 0: producer不会等待broker发送ack
# 1: 当leader接收到消息之后发送ack
# -1: 当所有的follower都同步消息成功后发送ack.
request.required.acks=0
# 在向producer发送ack之前,broker允许等待的最⼤时间 ,如果超时,broker将会向produce
r发送⼀个error ACK.意味着上⼀次消息因为某种原因未能成功(⽐如follower未能同步成功)
request.timeout.ms=10000
# 同步还是异步发送消息,默认"sync"表同步,"async"表异步。异步可以提⾼发送吞吐量,
也意味着消息将会在本地buffer中,并适时批量发送,但是也可能导致丢失未发送过去的消息
producer.type=sync
# 在async模式下,当message被缓存的时间超过此值后,将会批量发送给broker,默认为5000ms
# 此值和batch.num.messages协同⼯作.
queue.buffering.max.ms = 5000
# 在async模式下,producer端允许buffer的最⼤消息量
# ⽆论如何,producer都⽆法尽快的将消息发送给broker,从⽽导致消息在producer端⼤量沉积
# 此时,如果消息的条数达到阀值,将会导致producer端阻塞或者消息被抛弃,默认为10000
queue.buffering.max.messages=20000
# 如果是异步,指定每次批量发送数据量,默认为200
batch.num.messages=500
# 当消息在producer端沉积的条数达到"queue.buffering.max.meesages"后
# 阻塞⼀定时间后,队列仍然没有enqueue(producer仍然没有发送出任何消息)
# 此时producer可以继续阻塞或者将消息抛弃,此timeout值⽤于控制"阻塞"的时间
# -1: ⽆阻塞超时限制,消息不会被抛弃
# 0:⽴即清空队列,消息被抛弃
queue.enqueue.timeout.ms=-1
# 当producer接收到error ACK,或者没有接收到ACK时,允许消息重发的次数
# 因为broker并没有完整的机制来避免消息重复,所以当⽹络异常时(⽐如ACK丢失)
# 有可能导致broker接收到重复的消息,默认值为3.
message.send.max.retries=3
# producer刷新topic metada的时间间隔,producer需要知道partition leader的位置,以
及当前topic的情况
# 因此producer需要⼀个机制来获取最新的metadata,当producer遇到特定错误时,将会⽴即刷
新
# (⽐如topic失效,partition丢失,leader失效等),此外也可以通过此参数来配置额外的刷新机
制,默认值600000
topic.metadata.refresh.interval.ms=60000
2.2、consumer. properties
bash
# zookeeper连接服务器地址
zookeeper.connect=zk01:2181,zk02:2181,zk03:2181
# zookeeper的session过期时间,默认5000ms,⽤于检测消费者是否挂掉
zookeeper.session.timeout.ms=5000
#当消费者挂掉,其他消费者要等该指定时间才能检查到并且触发重新负载均衡
zookeeper.connection.timeout.ms=10000
# 指定多久消费者更新offset到zookeeper中。注意offset更新时基于time⽽不是每次获得的消
息。⼀旦在更新zookeeper发⽣异常并重启,将可能拿到已拿到过的消息
zookeeper.sync.time.ms=2000
#指定消费
group.id=itcast
# 当consumer消费⼀定量的消息之后,将会⾃动向zookeeper提交offset信息
# 注意offset信息并不是每消费⼀次消息就向zk提交⼀次,⽽是现在本地保存(内存),并定期提交,
默认为true
auto.commit.enable=true
# ⾃动更新时间。默认60 * 1000
auto.commit.interval.ms=1000
# 当前consumer的标识,可以设定,也可以有系统⽣成,主要⽤来跟踪消息消费情况,便于观察
conusmer.id=xxx
# 消费者客户端编号,⽤于区分不同客户端,默认客户端程序⾃动产⽣
client.id=xxxx
# 最⼤取多少块缓存到消费者(默认10)
queued.max.message.chunks=50
# 当有新的consumer加⼊到group时,将会reblance,此后将会有partitions的消费端迁移到
新 的consumer上,如果⼀个consumer获得了某个partition的消费权限,那么它将会向zk注册
"Partition Owner registry"节点信息,但是有可能此时旧的consumer尚没有释放此节点, 此
值⽤于控制,注册节点的重试次数.
rebalance.max.retries=5
# 获取消息的最⼤尺⼨,broker不会像consumer输出⼤于此值的消息chunk 每次feth将得到多条
消息,此值为总⼤⼩,提升此值,将会消耗更多的consumer端内存
fetch.min.bytes=6553600
# 当消息的尺⼨不⾜时,server阻塞的时间,如果超时,消息将⽴即发送给consumer
fetch.wait.max.ms=5000
socket.receive.buffer.bytes=655360
# 如果zookeeper没有offset值或offset值超出范围。那么就给个初始的offset。有smalles
t、largest、anything可选,分别表示给当前最⼩的offset、当前最⼤的offset、抛异常。默
认largest
auto.offset.reset=smallest
# 指定序列化处理类
derializer.class=kafka.serializer.DefaultDecoder