引言| 要确保Kafka在使用过程中的稳定性,需要从kafka在业务中的使用周期进行依次保障。主要可以分为:事先预防(通过规范的使用、开发,预防问题产生)、运行时监控(保障集群稳定,出问题能及时发现)、故障时解决(有完整的应急预案)这三阶段。
事先预防
事先预防即通过规范的使用、开发,预防问题产生。主要包含集群/生产端/消费端的一些最佳实践、上线前测试以及一些针对紧急情况(如消息积压等)的临时开关功能。
Kafka调优原则:
1.确定优化目标,并且定量给出目标(Kafka 常见的优化目标是吞吐量、延时、持久性和可用性)。
2.确定了目标之后,需要明确优化的维度。
通用性优化:操作系统、JVM 等。
针对性优化:优化 Kafka 的 TPS、处理速度、延时等。
(一)生产端最佳实践
-
参数调优
-
使用 Java 版的 Client;
-
使用 kafka-producer-perf-test.sh 测试你的环境;
-
设置内存、CPU、batch 压缩;
-
batch.size:该值设置越大,吞吐越大,但延迟也会越大;
-
linger.ms:表示 batch 的超时时间,该值越大,吞吐越大、但延迟也会越大;
-
max.in.flight.requests.per.connection:默认为5,表示 client 在 blocking 之前向单个连接(broker)发送的未确认请求的最大数,超过1时,将会影响数据的顺序性;
-
compression.type:压缩设置,会提高吞吐量;
-
acks:数据 durability 的设置;
-
避免大消息(占用过多内存、降低broker处理速度);
-
broker调整:增加 num.replica.fetchers,提升 Follower 同步 TPS,避免 Broker Full GC 等;
-
当吞吐量小于网络带宽时:增加线程、提高 batch.size、增加更多 producer 实例、增加 partition 数;
-
设置 acks=-1 时,如果延迟增大:可以增大 num.replica.fetchers(follower 同步数据的线程数)来调解;
-
跨数据中心的传输:增加 socket 缓冲区设置以及 OS tcp 缓冲区设置。
-
开发实践
a.做好Topic隔离
b.做好消息流控
c.做好消息补推
d.做好消息顺序性保障
但是,需要避免分区内消息倾斜的问题(例如,按照店铺Id进行路由,容易导致消息不均衡的问题)。
e.适当提高消息发送效率
f.保证消息发送可靠性
(二)消费端最佳实践
-
参数调优
-
吞吐量:调整partition 数、OS page cache(分配足够的内存来缓存数据);
-
offset topic(__consumer_offsets):offsets.topic.replication.factor(默认为3)、offsets.retention.minutes(默认为1440,即 1day);
-
offset commit较慢:异步 commit 或 手动 commit;
-
fetch.min.bytes 、fetch.max.wait.ms;
-
max.poll.interval.ms:调用 poll() 之后延迟的最大时间,超过这个时间没有调用 poll() 的话,就会认为这个 consumer 挂掉了,将会进行 rebalance;
-
max.poll.records:当调用 poll() 之后返回最大的 record 数,默认为500;
-
session.timeout.ms;
-
Consumer Rebalance:check timeouts、check processing times/logic、GC Issues;
-
网络配置。
-
开发实践
a.做好消息消费幂等
b.做好Consumer隔离
c.避免消息消费堆积
-
延迟处理、控制速度,时间范围内分摊消息(针对实时性不高的消息);
-
生产速度大于消费速度,这样可以适当增加分区,增加consumer数量,提升消费TPS;
-
避免很重的消费逻辑,优化consumer TPS:
-
如果有较重的消费逻辑,需要调整xx参数,避免消息没消费完时,消费组退出,造成reblance等问题;
-
确保consumer端没有因为异常而导致消费hang住;
-
如果使用的是消费者组,确保没有频繁地发生rebalance;
-
多线程消费,批量拉取处理。
d.避免Rebalance问题
-
触发条件:
-
如何避免非必要rebalance(消费者下线、消费者主动退出消费组导致的reblance):
e.保证消息消费可靠性
f.保证消息消费顺序性
针对顺序消息:
g.处理Consumer的事务
(三)集群配置最佳实践
-
集群配置
-
Topic 评估
-
分区配置
(四)性能调优
-
分层调优
|
|
---|---|
|
|
|
|
|
|
|
|
-
吞吐量(TPS)调优
参数列表 |
|
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
延时调优
参数列表 | |
---|---|
|
|
|
|
|
|
|
|
|
|
(五)稳定性测试
-
健康性检查
-
高可用测试
单节点异常测试:重启Leader副本或Follower副本所在Pod
集群异常测试:重启所有pod
运行时监控
(一)集群稳定性监控
-
腾讯云CKafka集群配置
-
磁盘容量和峰值带宽
-
消息保留时长;
-
动态保留策略;
a.磁盘容量和峰值带宽
b.消息保留时长
c.动态保留策略
-
自建Kafka集群配置
-
资源隔离
a.Broker级别物理隔离
b.RPC队列隔离
-
智能限速
(二)Kafka监控
|
|
|
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
腾讯云CKafka告警
a.指标
b.配置
c.预案
-
自建告警平台
-
Kafka监控组件
-
Kafka Monitor
故障时解决
(一)Kafka消息堆积紧急预案
-
问题排查
-
扩容升配策略
-
配置多线程的消费策略
5.监听类中校验待提交的offsets数与拉取到的记录数是否相等,如果相等则;
-
Topic中转策略
(二)Kafka消费异常导致消费阻塞
-
设置偏移量
3.如果涉及数据一致性问题,需要通过数据比对、对账等功能进行校验。
-
开关多线程的消费策略
(三)Kafka消息丢失预案
-
根因分析
-
消息补推
其他
(一)Kafka成本控制
-
机器
-
存储与网络
-
集群
(二)消息消费的幂等
-
利用数据库的唯一约束
-
设置前置条件
-
记录并检查操作
参考:
[1]https://iwiki.woa.com/pages/viewpage.action?pageId=1126809993
[2]https://www.infoq.cn/article/ucSru1uKkSswLXPcjQgC?source=app_share
[3]https://blog.csdn.net/qq_32179907/article/details/122599769
[4]https://blog.csdn.net/qq_32179907/article/details/122599769
[5]https://zhuanlan.zhihu.com/p/513559802utm_source=wechat_session&utm_medium=social&utm_oi=689250073002930176&utm_campaign=shareopn
[6]https://blog.csdn.net/philip502/article/details/118997899utm_medium=distribute.wap_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-118997899-blog-125192952.wap_relevant_multi_platform_whitelistv1&spm=1001.2101.3001.4242.1&utm_relevant_index=1
[7]https://www.zhihu.com/question/483747691/answer/2392949203utm_source=wechat_session&utm_medium=social&utm_oi=689250073002930176&utm_content=group3_Answer&utm_campaign=shareopn
[8]https://zhuanlan.zhihu.com/p/354772550utm_source=wechat_session&utm_medium=social&utm_oi=689250073002930176&utm_campaign=shareopn
[9]https://www.infoq.cn/article/contrast-with-kafka-and-jingdong-jmq?source=app_share
[10]https://www.infoq.cn/article/BF3mm9haDs-cdHCXOLlf?source=app_share
[11]https://www.infoq.cn/article/wmM8WXzLEgfGMKYpbF0N?source=app_share
[12]https://www.infoq.cn/article/Q0o*QzLQiay31MWiOBJH?source=app_share
本文来自微信公众号“腾讯云开发者”(ID:QcloudCommunity)。大作社经授权转载,该文观点仅代表作者本人,大作社平台仅提供信息存储空间服务。