对于Kafka的优化,可以从以下几个方面进行思考和优化:
硬件优化:使用高性能的硬件设备,包括高速磁盘、大内存和高性能网络设备,以提高Kafka集群的整体性能。
配置优化:调整Kafka的配置参数,包括消息存储、副本数、日志段大小、缓冲区大小等,以提高Kafka的吞吐量和稳定性。
网络优化:优化Kafka集群的网络设置,包括网络带宽、延迟和可靠性,以确保消息能够快速、可靠地传输。
分区优化:合理划分分区,避免分区过多或过少,以充分利用集群资源并提高消息的并发处理能力。
监控优化:建立完善的监控系统,及时发现和解决Kafka集群的性能瓶颈和故障,以保障Kafka的稳定运行。
客户端优化:优化生产者和消费者的配置和代码,以提高消息的生产和消费效率。
总的来说,Kafka的优化需要综合考虑硬件、配置、网络、分区、监控和客户端等多个方面,以达到提高性能和稳定性的目的。下面我将主要从Kafka使用参数设置来说明优化的主要思路,其基本核心思想就是提高Kafka的吞吐量和降低网络延迟。
生产者端(Producer)的参数
acks:默认值为1,表示指定分区中成功写入消息的副本数量。一般不需要修改。
max.request.size:默认值为1048576,即1M1。这个参数比较重要,表示生产端能够发送的最大消息大小。为了避免因消息过大导致发送失败,建议适当调大,比如调到10485760即10M。
retries:默认值为0,表示生产端消息发送失败时的重试次数。为了解决因瞬时故障导致的消息发送失败,比如网络抖动、leader换主,其中瞬时的leader重选举是比较常见的。因此这个参数的设置显得非常重要。建议设置为一个大于0的值,比如3或者更大值。
compression.type:默认值为none,表示生产端是否对消息进行压缩。一般不需要修改。
buffer.memory:默认值为33554432,即32M。表示生产端消息缓冲池或缓冲区的大小。一般不需要修改。
batch.size:默认值为16384,即16KB。发送到缓冲区中的消息会被分为一个一个的batch,分批次的发送到broker 端,这个参数就表示batch批次大小。可以根据实际情况或者压测情况来更改这个值,这个值太小,会导致频繁的网络请求,从而导致吞吐量下降,这个值太大会导致一条消息需要等待很长的时间才能发送出去,会增加网络的延迟。
linger.ms:默认值为0。用来控制batch最大的空闲时间,超过该时间的batch也会被发送到broker端。建议修改范围10~100之间,影响结果可以参考batch.size.
request.timeout.ms:默认值为30000,即30s。这个参数表示生产端发送请求后等待broker端响应的最长时间。一般不需要修改。
max.in.fight.requests.per.connection:默认值为5。这个参数非常重要,表示生产端与broker之间的每个连接最多缓存的请求数。一般不需要修改。
代理端(Broker)的参数
broker.id:默认值为0。每个broker都可以用一个唯一的非负整数id进行标识。你可以选择任意你喜欢的数字作为id,只要id是唯一的即可。
log.dirs:默认值为/tmp/kafka-logs。kafka存放数据的路径。这个路径并不是唯一的,可以是多个,路径之间只需要使用逗号分隔即可;每当创建新partition时,都会选择在包含最少partitions的路径下进行。
port:默认值为6667。server接收客户端连接的端口。根据实际网络环境和安全需求进行设置。
zookeeper.connect:默认值为null。ZooKeeper连接字符串的格式为:hostname:port。为了当某个host宕掉之后你能通过其他ZooKeeper节点进行连接,你可以按照以下方式制定多个hosts:hostname1:port1, hostname2:port2, hostname3:port33。
message.max.bytes:默认值为1000000。server可以接收的消息最大尺寸。重要的是,consumer和producer有关这个属性的设置必须同步,否则producer发布的消息对consumer来说太大。
num.network.threads:默认值为3。server用来处理网络请求的网络线程数目。一般你不需要更改这个属性。
num.io.threads:默认值为8。server用来处理请求的I/O线程的数目。这个线程数目至少要等于硬盘的个数。
background.threads:默认值为4。用于后台处理的线程数目,例如文件删除。你不需要更改这个属性。
queued.max.requests:默认值为500。在网络线程停止读取新请求之前,可以排队等待I/O线程处理的最大请求个数。根据实际业务需求进行设置。
fetch.min.bytes:表示Broker端积攒了多少数据就可以返回给consumer端
fetch.max.bytes: 默认值:50MB 消费者获取服务端一批数据最大的字节数, 这个参数主要受到下面两个参数的限制
message.max.bytes = broker配置 max.message.bytes = topic配置
消费者端(Consumer)的参数
fetch.min.bytes:默认值为1。消费者从服务器获取的最小数据量。如果设置为1,则消费者尽可能地从服务器获取数据;如果设置为1MB,则消费者会等待直到1MB的数据可用才从服务器获取。
fetch.max.wait.ms:默认值为500。消费者等待从服务器获取数据的最长时间。
max.partition.fetch.bytes:默认值为1048576,即1MB。消费者一次从服务器获取每个分区的最大字节数。
session.timeout.ms:默认值为30000,即30s。消费者在被认为死亡之前可以与服务器断开连接的时间。
auto.offset.reset:默认值为latest。消费者在读取一个没有偏移量的分区或者偏移量无效的情况下该如何做。
原文链接:Kafka主要参数设置及优化建议
作为搜集。