4.kafka--生产调优

news2024/11/18 9:39:07

文章目录

  • 1.硬件配置选择
    • 1.场景说明
    • 2.服务器台数选择
    • 3.磁盘选择
    • 4.内存选择
      • 1) 堆内存配置
      • 2)页缓存配置
    • 5. cpu选择
    • 6.网络选择
  • 2.生产者
  • 3.kafka broker
  • 4. 服役新节点,退役旧节点
    • 1)创建一个要均衡的主题。
    • 2) 生成一个负载均衡的计划
    • leader分布不均匀解决办法
    • 生产环境需要关闭的属性

1.硬件配置选择

1.场景说明

100万日活,每人每天100条日志,每天总共的日志条数是100万100条=1亿条。
1亿/24小时/60分/60秒=1150条/每秒钟。每条日志大小:0.5k-2k(取1k)。
1150条/每秒钟
1k≈1m/s。
高峰期每秒钟:1150条*20倍=23000条。每秒多少数据量:20MB/s。

2.服务器台数选择

服务器台数=2 (生产者峰值生产速率副本/ 100)+ 1
= 2 *(20m/s * 2/100)+ 1
= 3台建议3台服务器。

3.磁盘选择

kafka底层主要是顺序写,固态硬盘和机械硬盘的顺序写速度差不多。建议选择普通的机械硬盘。
每天总数据量:1亿条* 1k≈100g
100g副本2保存时间3天/ 0.7≈1T建议三台服务器硬盘总大小,大于等于1T。

4.内存选择

kafka 内存组成:堆内存+页缓存

1) 堆内存配置

kafka 堆内存建议每个节点:10g~15g

修改kafka-server-start.sh

默认配置
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
    export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
fi

建议修改为:

if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
export KAFKA_HEAP_OPTS="-Xmx10G-Xms10G"
fi

2)页缓存配置

页缓存:页缓存是Linux系统服务器的内存。我们只需要保证1个segment(1g)中25%的数据在内存中就好。
每个节点页缓存大小=(分区数1g 25%)/节点数。例如10个分区,页缓存大小=(101g25%)/3≈1g

建议服务器内存大于等于11G (堆内存10g+页缓存1g)

5. cpu选择

num.io.threads=8负责写磁盘的线程数,整个参数值要占总核数的50%。
num.replica.fetchers=1副本拉取线程数,这个参数占总核数的50%的1/3。
num.network.threads=3数据传输线程数,这个参数占总核数的50%的2/3。
建议32个cpu core。

6.网络选择

网络带宽=峰值吞吐量≈20MB/s选择千兆网卡即可。100Mbps单位是bit;10M/s单位是byte;1byte=8bit,100Mbps/8=12.5M/s。一般百兆的网卡(100Mbps)、千兆的网卡(1000Mbps)、万兆的网卡(10000Mbps)。

2.生产者

在这里插入图片描述

batch.size:只有数据积累到batch.size之后,sender才会发送数据。默认16k•linger.ms:如果数据迟迟未达到batch.size,sender等待linger.ms设置的时间到了之后就会发送数据。单位ms,默认值是0ms,表示没有延迟。

•0:生产者发送过来的数据,不需要等数据落盘应答。
•1:生产者发送过来的数据,Leader收到数据后应答。
•-1(all):生产者发送过来的数据,Leader和ISR队列里面的所有节点收齐数据后应答。-1和all等价。

参数名称描述
bootstrap.servers生产者连接集群所需的broker地址清单。例如hadoop102:9092,hadoop103:9092,hadoop104:9092,可以设置1个或者多个,中间用逗号隔开。注意这里并非需要所有的broker地址,因为生产者从给定的broker里查找到其他broker信息。
key.serializer和value.serializer指定发送消息的key和value的序列化类型。一定要写全类名。
buffer.memoryRecordAccumulator缓冲区总大小,默认32m。
batch.size缓冲区一批数据最大值,默认16k。适当增加该值,可以提高吞吐量,但是如果该值设置太大,会导致数据传输延迟增加。
linger.ms如果数据迟迟未达到batch.size,sender等待linger.time之后就会发送数据。单位ms,默认值是0ms,表示没有延迟。生产环境建议该值大小为5-100ms之间。
acks0:生产者发送过来的数据,不需要等数据落盘应答。1:生产者发送过来的数据,Leader收到数据后应答。-1(all):生产者发送过来的数据,Leader+和isr队列里面的所有节点收齐数据后应答。默认值是-1,-1和all是等价的。
max.in.flight.requests.per.connection允许最多没有返回ack的次数,默认为5,开启幂等性要保证该值是1-5的数字。
retries当消息发送出现错误的时候,系统会重发消息。retries表示重试次数。默认是int最大值,2147483647。如果设置了重试,还想保证消息的有序性,需要设置MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION=1否则在重试此失败消息的时候,其他的消息可能发送成功了。
retry.backoff.ms两次重试之间的时间间隔,默认是100ms。
enable.idempotence是否开启幂等性,默认true,开启幂等性。
compression.type生产者发送的所有数据的压缩方式。默认是none,也就是不压缩。支持压缩类型:none、gzip、snappy、lz4和zstd。

3.kafka broker

在这里插入图片描述

参数名称描述
replica.lag.time.max.msISR中,如果Follower长时间未向Leader发送通信请求或同步数据,则该Follower将被踢出ISR。该时间阈值,默认30s。
auto.leader.rebalance.enable默认是true。自动LeaderPartition平衡。建议关闭。
leader.imbalance.per.broker.percentage默认是10%。每个broker允许的不平衡的leader的比率。如果每个broker超过了这个值,控制器会触发leader的平衡。
leader.imbalance.check.interval.seconds默认值300秒。检查leader负载是否平衡的间隔时间。
log.segment.bytesKafka中log日志是分成一块块存储的,此配置是指log日志划分成块的大小,默认值1G。
log.index.interval.bytes默认4kb,kafka里面每当写入了4kb大小的日志(.log),然后就往index文件里面记录一个索引。
log.retention.hoursKafka中数据保存的时间,默认7天。
log.retention.minutesKafka中数据保存的时间,分钟级别,默认关闭。
log.retention.msKafka中数据保存的时间,毫秒级别,默认关闭。
log.retention.check.interval.ms检查数据是否保存超时的间隔,默认是5分钟。
log.retention.bytes默认等于-1,表示无穷大。超过设置的所有日志总大小,删除最早的segment。
log.cleanup.policy默认是delete,表示所有数据启用删除策略;如果设置值为compact,表示所有数据启用压缩策略。
num.io.threads默认是8。负责写磁盘的线程数。整个参数值要占总核数的50%。
num.replica.fetchers默认是1。副本拉取线程数,这个参数占总核数的50%的1/3
num.network.threads默认是3。数据传输线程数,这个参数占总核数的50%的2/3。
log.flush.interval.messages强制页缓存刷写到磁盘的条数,默认是long的最大值,9223372036854775807。一般不建议修改,交给系统自己管理。
log.flush.interval.ms每隔多久,刷数据到磁盘,默认是null。一般不建议修改,交给系统自己管理。

4. 服役新节点,退役旧节点

创建three主题,4个分区,2个副本

[root@node2 kafka_2.12-3.0.0]# bin/kafka-topics.sh --bootstrap-server node1:9092 --create --topic three --partitions 4 --replication-factor 2
Created topic three.

查看下分区和副本情况

[root@node2 kafka_2.12-3.0.0]# bin/kafka-topics.sh --bootstrap-server node1:9092 --describe --topic three
Topic: three    TopicId: 7GQ8d0fRRK2xULnj3pbhjg PartitionCount: 4       ReplicationFactor: 2    Configs: segment.bytes=1073741824
        Topic: three    Partition: 0    Leader: 2       Replicas: 2,1   Isr: 2,1
        Topic: three    Partition: 1    Leader: 1       Replicas: 1,0   Isr: 1,0
        Topic: three    Partition: 2    Leader: 0       Replicas: 0,2   Isr: 0,2
        Topic: three    Partition: 3    Leader: 2       Replicas: 2,0   Isr: 2,0

现在我们想把three主题的所有副本存储在0 和1 节点上

 vim increase-replication-factor.json
{
"version":1,
"partitions":[
  {
    "topic":"three","partition":0,"replicas":[0,1]
  },
 {
   "topic":"three","partition":1,"replicas":[0,1]
 },
 {
  "topic":"three","partition":2,"replicas":[0,1]
 },
 {
   "topic":"three","partition":3,"replicas":[0,1]
 }
 ]
}

[root@node2 kafka_2.12-3.0.0]# bin/kafka-reassign-partitions.sh --bootstrap-server node1:9092 --reassignment-json-file increase-replication-factor.json --execute
Current partition replica assignment

{"version":1,"partitions":[{"topic":"three","partition":0,"replicas":[2,1],"log_dirs":["any","any"]},{"topic":"three","partition":1,"replicas":[1,0],"log_dirs":["any","any"]},{"topic":"three","partition":2,"replicas":[0,2],"log_dirs":["any","any"]},{"topic":"three","partition":3,"replicas":[2,0],"log_dirs":["any","any"]}]}

Save this to use as the --reassignment-json-file option during rollback
Successfully started partition reassignments for three-0,three-1,three-2,three-3
[root@node2 kafka_2.12-3.0.0]# 

验证副本存储计划

bin/kafka-reassign-partitions.sh --bootstrap-server node1:9092 --reassignment-json-file increase-replication-factor.json --verify

查下该topic 信息

[root@node2 kafka_2.12-3.0.0]# bin/kafka-topics.sh --bootstrap-server node1:9092 --topic three --describe
Topic: three    TopicId: 7GQ8d0fRRK2xULnj3pbhjg PartitionCount: 4       ReplicationFactor: 2    Configs: segment.bytes=1073741824
        Topic: three    Partition: 0    Leader: 0       Replicas: 0,1   Isr: 1,0
        Topic: three    Partition: 1    Leader: 1       Replicas: 0,1   Isr: 1,0
        Topic: three    Partition: 2    Leader: 0       Replicas: 0,1   Isr: 0,1
        Topic: three    Partition: 3    Leader: 0       Replicas: 0,1   Isr: 0,1

1)创建一个要均衡的主题。

vimtopics-to-move.json
{
"topics":[
  {"topic":"first"}
],
"version":1
}

2) 生成一个负载均衡的计划

[root@node2 kafka_2.12-3.0.0]# bin/kafka-reassign-partitions.sh --bootstrap-server node1:9092 --topics-to-move-json-file topics-to-move.json --broker-list "0,1,2" --generate
Current partition replica assignment
{"version":1,"partitions":[{"topic":"first","partition":0,"replicas":[1,0,2],"log_dirs":["any","any","any"]},{"topic":"first","partition":1,"replicas":[2,1,0],"log_dirs":["any","any","any"]},{"topic":"first","partition":2,"replicas":[0,2,1],"log_dirs":["any","any","any"]}]}

Proposed partition reassignment configuration
{"version":1,"partitions":[{"topic":"first","partition":0,"replicas":[0,1,2],"log_dirs":["any","any","any"]},{"topic":"first","partition":1,"replicas":[1,2,0],"log_dirs":["any","any","any"]},{"topic":"first","partition":2,"replicas":[2,0,1],"log_dirs":["any","any","any"]}]}
[root@node2 kafka_2.12-3.0.0]# 

执行副本存储计划

vim increase-replication-factor-first.json

{“version”:1,“partitions”:[{“topic”:“first”,“partition”:0,“replicas”:[1,0,2],“log_dirs”:[“any”,“any”,“any”]},{“topic”:“first”,“partition”:1,“replicas”:[2,1,0],“log_dirs”:[“any”,“any”,“any”]},{“topic”:“first”,“partition”:2,“replicas”:[0,2,1],“log_dirs”:[“any”,“any”,“any”]}]}

[root@node2 kafka_2.12-3.0.0]# bin/kafka-reassign-partitions.sh --bootstrap-server node1:9092 --reassignment-json-file increase-replication-factor-first.json --execute

验证副本存储计划

[root@node2 kafka_2.12-3.0.0]# bin/kafka-reassign-partitions.sh --bootstrap-server node1:9092 --reassignment-json-file increase-replication-factor-first.json --verify
Status of partition reassignment:
Reassignment of partition first-0 is complete.
Reassignment of partition first-1 is complete.
Reassignment of partition first-2 is complete.

Clearing broker-level throttles on brokers 0,1,2
Clearing topic-level throttles on topic first

leader分布不均匀解决办法

减少分区(会报错),增加分区

[2023-01-29 16:55:40,828] ERROR org.apache.kafka.common.errors.InvalidPartitionsException: Topic currently has 3 partitions, which is higher than the requested 2.
 (kafka.admin.TopicCommand$)
[root@node2 kafka_2.12-3.0.0]# bin/kafka-topics.sh --bootstrap-server node1:9092 --alter --topic first --partitions 4
[root@node2 kafka_2.12-3.0.0]# bin/kafka-topics.sh --bootstrap-server node1:9092 --topic first --describe
Topic: first    TopicId: IcU6kbglSSWOkruuSmgryg PartitionCount: 4       ReplicationFactor: 3    Configs: segment.bytes=1073741824
        Topic: first    Partition: 0    Leader: 2       Replicas: 1,0,2 Isr: 2,1,0---
        Topic: first    Partition: 1    Leader: 2       Replicas: 2,1,0 Isr: 2,0,1
        Topic: first    Partition: 2    Leader: 2       Replicas: 0,2,1 Isr: 2,0,1
        Topic: first    Partition: 3    Leader: 1       Replicas: 1,2,0 Isr: 1,2,0

发现leader都是2,将node1,node2,node3上的kafka停止后,重启
如果leader集中的部分机器上,那么该机器的请求压力,吞吐压力就很大,而其他机器的请求量很少,分布不均匀,容易导致数据堆积

vim test.json

{
“partitions”:[
{
“partition”:0,
“topic”:“first”
},
{
“partition”:1,
“topic”:“first”
},
{
“partition”:2,
“topic”:“first”
}
]
}

[root@node2 kafka_2.12-3.0.0]# bin/kafka-leader-election.sh --path-to-json-file test.json --bootstrap-server node1:9092 --election-type PREFERRED

[root@node2 kafka_2.12-3.0.0]#  bin/kafka-topics.sh --bootstrap-server node1:9092 --topic first --describe

Topic: first    TopicId: IcU6kbglSSWOkruuSmgryg PartitionCount: 4       ReplicationFactor: 3    Configs: segment.bytes=1073741824
        Topic: first    Partition: 0    Leader: 2       Replicas: 2,0,1 Isr: 2,1,0
        Topic: first    Partition: 1    Leader: 0       Replicas: 0,1,2 Isr: 2,1,0
        Topic: first    Partition: 2    Leader: 1       Replicas: 1,2,0 Isr: 2,1,0
        Topic: first    Partition: 3    Leader: 2       Replicas: 2,1,0 Isr: 2,1,0


直接kafka-leader-election.sh可以把所有topic的所有分区都执行一遍重新平衡,如果集群中需要重平衡的副本较多,则会对客户端带来一定的影响,所以一般生产环境中在使用的时候,会加参数path-to-json-file来指定一个json文件,以对部分分区进行leader重平衡。

例如我们只对topic video_features的分区12、13进行优先副本选举,需要编写一个json文件test1.json:

{
“partitions”:[
{
“partition”:12,
“topic”:“video_features”
},
{
“partition”:13,
“topic”:“video_features”
}
]
}

参考文档:https://blog.csdn.net/worldchinalee/article/details/108213917

kafka集群重启后,leader容易分布不均匀,这个如何一劳永逸的解决呢?不能每次重启以后,重重新分布leader吧?????

生产环境需要关闭的属性

auto.leader.rebalance.enable:ture/false------是否允许定期进行 Leader 选举
在这里插入图片描述
若开启,默认300s即5分钟扫描一次,每次若发现每个broker之间的leader对比 比率超过10%,则重新发起选举。
不建议开启
虽然在一定条件下,才会触发leader选举,但是如果把auto.leader.rebaleance.enable设置为true,可能一段时间后leaderA就被强行换成Leader B了

leader更换代价很高的,原本向A发送的请求的所有客户端都要切换到向B发送请求,而且这种更换leader本质上没有任何性能收益,

但是如果关闭,leader一旦宕机,就没有leader了

unclean.leader.election.enable,版本不一样默认值也不一样,建议设置为false
在这里插入图片描述

注:虽然设置为false会可能导致该partition不可用,但是设置为ture会有丢数据的风险。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/184031.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多人配音怎么做的?这两个多人配音方法分享给你

大家在刷一些短视频的时候,肯定有看到过一些搞笑的视频,而这些视频总能让我们捧腹大笑,过后再多看几次,其实你可以明显的发现这是多人互动对话或者一人分饰多角所呈现的,我们想要做出这种类型的视频,一般需…

法律常识(五)《消费者权益保护法》解读与举例

目录 酒楼谢绝客户自带酒水,合法吗? 侵犯消费者人格尊严,应承担民事责任 某公司出售伪劣产品致人损害,需双倍赔偿 农民购买、使用直接用于农业生产的生产资料 《中华人民共和国产品质量法》相关记录 《中华人民共和国反不正…

Android 双屏异显(Presentation) 开发,将第二个页面投屏到副屏上

1. 背景 最近开发的一个项目,有两个屏幕,需要将第二个页面投屏到副屏上,这就需要用到Android的双屏异显(Presentation)技术了,研究了一下,这里做下笔记。 我们那个副屏是一块汽车的后视镜(流媒体后视镜),是…

超详细:KNN与K-means从入门到实战

作者:王同学 来源:投稿 编辑:学姐 1. 基本概念 1.1 KNN k近邻法(k-nearest neighbor,k-NN)是一种基本分类与回归方法。 k近邻法的输入为实例的特征向量对应于特征空间的点;输出为实例的类别&…

CnOpenData食品安全抽检数据

一、数据简介 食品安全是关乎人体生命健康的公共卫生问题。近年来,频繁发生的食品安全事件给人民的生命健康带来了巨大威胁,并成为人们关注的热点问题。   民以食为天,食以安为先。由于消费者和生产者之间存在信息不对称,完善…

【Linux】---进程程序替换

进程替换出现的背景我们可以用fork函数来创建子进程,使父子进程同时出现。正所谓子承父业,子进程在刚被创建时和父进程共享数据和代码,但是操作者想让子进程执行一个全新的程序,这个使子进程执行全新程序的操作叫做进程程序替换。…

前端播放大视频卡顿的解决(m3u8视频流)

前言 最近在一个大屏看板项目中有一个需求是:要求视频和看板要进行来回切换。 最开始的做法是将MP4视频放在项目里,在本地运行时是没什么问题的,但是在往仓库里提交代码时出现了问题。当单个文件超过100MB时会导致代码提交失败; …

【闲聊杂谈】直击重灾区 - 多线程与高并发

在开始学习多线程与高并发的知识之前,我想先问一个问题:你平时在写代码的时候,有没有刻意的去思考如何压榨CPU性能?其实纵观整个编程的发展历史,其实就是一部对于CPU性能压榨的血泪史。 单进程人工切换 最早的编程…

@Reference、@Autowired、@Resource的区别

目录 1. Autowired 和 Resource 的区别相同点:不同点:Resource 装配顺序2. Reference 和 Autowired 的区别理解1理解2理解31. Autowired 和 Resource 的区别 相同点: Resource 的作用相当于Autowired ,均可标注在字段或属性的se…

4、因果法

因果图中的图形符号 恒等。若原因出现,则结果出现;若原因不出现,则结果不出现。非。若原因出现,则结果不出现;若原因不出现,则结果出现。或。若几个原因中有一个出现,则结果出现;若几…

章节8 文本编辑器

8-Linux文本编辑器 文本编辑器 Windows:Notepad(记事本)、Sublime、UltraEdit等 Linux:VI/VIM (最常用)、nano、Emacs、Sed、gedit、Kate等 01 VI和VIM的区别 VI和VIM的区别 VI:Visual In…

C 语言零基础入门教程(十六)

C 位域 如果程序的结构中包含多个开关量,只有 TRUE/FALSE 变量,如下: struct {unsigned int widthValidated;unsigned int heightValidated; } status;这种结构需要 8 字节的内存空间,但在实际上,在每个变量中&#…

云计算|OpenStack发展简史

前言: 一般以open开始的软件都非常的牛逼,例如,OpenCV(人工智能学习库),OpenStack(云计算基础操作系统),openwrt(软路由),openEuler&…

表单设计器

表单设计器目录概述需求:设计思路实现思路分析参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive. happy for h…

vue2.x 富文本编辑器Tinymce的使用

VUE项目版本是2.x,切记: vue2中不能使用tinymce/tinymce-vue为4以上版本; 如果有安装高版本,卸载:npm uninstall tinymce/tinymce-vue 第一步:安装 npm install tinymce5.1.0 -S npm install tinymce/tiny…

费曼学习法——孩子弱点方向的提升和沟通技巧

这一篇虽然是兔年第一篇,但是,先不拜年了,主要是成文时间较短,后面会有一个详细的长篇文字,讨论一些观点和看法。每一个孩子都有弱点的方向,我们是否都要给孩子提升,首先表达一个观点&#xff1…

图论算法基础

图论算法基础有向图有向图的实现方式无向图无向图的实现方式连通图连通分量的定义强连通图和强连通分量的定义弱连通图和单向连通图的定义判断图是否是强连通图,弱连通图还是单项连通图一个很典型的错误代码JAVA实现C实现生成树最小生成树拓扑排序邻接表的实现方式数…

【ShaderGraph】道路引导,小溪流水等UV动画效果

目录 一:创建ShaderGraph文件 二:设置UV动画速度变量 ​三:设置UV动画方向和Tiling变量 ​四:设置贴图属性 五:设置主色MainColor属性 六:最终效果 一:创建ShaderGraph文件 1.在assets下…

css之BFC是什么

在讲BFC之前先来了解一下FC FC-Formatting Context FC全称Formatting Context(格式化上下文),元素在标准流里面都属于一个FC的 官网解释: Boxes in the normal flow belong to a formatting context,which may be block or inline, but not both sim…

指针(基础)

目录 一、内存和地址 二、指针是什么? 三、指针变量的内容 四、指针类型 五、间接访问操作符 (一)易混淆 六、野指针 (一)野指针成因 1. 指针未初始化 2. 指针越界访问 3. 指针指向的空间释放 &…