博客
关于我
干货|kafka最佳实践
阅读量:796 次
发布时间:2023-03-22

本文共 3873 字,大约阅读时间需要 12 分钟。

Kafka 实践指南:架构配置与性能优化

Kafka 是一种高吞吐量、低延迟的分布式消息队列系统,广泛应用于大数据实时处理、数据集群和云原生应用等领域。本文将基于 DataWorks Summit/Hadoop Summit 的分享内容,结合实际应用场景,对 Kafka 的基础配置、性能优化、监控与管理等方面进行详细探讨。


Kafka 基本配置及性能优化

硬件要求

Kafka 集群的硬件配置直接影响其性能和稳定性。建议采取以下硬件配置:

  • 内存:每个 Broker 至少配置 64GB 内存。
  • 存储:使用 SSD 存储,建议每个 Broker 配置 1TB 或以上的磁盘空间。
  • 网络:确保网络带宽达到 10Gbps 或更高,且网络延迟低于 1ms。

OS 调优

操作系统配置优化对 Kafka 性能有重要影响:

  • 缓存策略:启用 page cache 对 Kafka Segments 的缓存,确保所有活跃的 Segments 获得最佳缓存效果。
  • 文件描述符限制:将 fd 限制设置为 100000 或更高,避免因文件句柄耗尽导致性能瓶颈。
  • 禁用交换分区:建议禁用 swap,以减少磁盘 IO 操作对系统性能的影响。
  • TCP 调优:优化系统内核参数,如 net.core.max_backlog, 确保网络传输效率。
  • JVM 配置:建议使用 JDK 8,并设置 G1 垃圾回收器,分配 6-8GB 的堆内存。

Kafka 磁盘存储

磁盘存储是 Kafka 的关键配置,需根据实际需求和性能需求选择合适的存储方案:

  • 磁盘类型:优先使用 SSD,考虑使用 JBOD 或 RAID10。
  • JBOD 的优缺点
    • 优点:高容量、易于扩展。
    • 缺点:单磁盘损坏可能导致整个逻辑磁盘瘫痪,数据不一致性风险较高。
  • RAID10 的优势
    • 允许单磁盘损坏。
    • 提供良好的性能和数据保护。
  • 文件系统选择:建议使用 EXT4 或 XFS 文件系统。

基本监控指标

Kafka 集群的监控是确保其稳定运行的重要环节。关键监控指标包括:

  • CPU 负载:监控每个 Broker 的 CPU 使用率。
  • 网络指标:包括吞吐量、延迟和连接数。
  • 文件句柄使用:确保文件操作不成为性能瓶颈。
  • 磁盘空间:监控每个 Broker 的磁盘使用率。
  • 磁盘 IO 性能:确保磁盘读写速度达到最佳状态。
  • 垃圾回收信息:监控 JVM 的 GC 次率和时间。
  • ZooKeeper 监控:确保 ZooKeeper 会话状态正常。

Kafka 复制相关配置及监控

Kafka Replication

Kafka 的副本机制确保数据高可用性和可用性:

  • Partition 副本类型
    • Leader:负责维护 In-Sync Replicas(ISR)。
    • Follower:负责数据同步。
  • ISR 管理
    • replica.lag.time.max.ms:默认为 10000ms,超过该时间 Leader 将移除不在 ISR 中的 Follower。
    • num.replica.fetchers:默认为 1,用于从 Leader 同步数据的 fetcher 线程数。
    • min.insync.replicas:用于保证数据持久性。

Under Replicated Partitions

当发现 replica 配置与实际集群不一致时,可以采取以下措施:

  • 监控指标:通过 JMX 监控项 kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions 发现问题。
  • 可能原因
    • Broker 宕机。
    • Controller 或 ZooKeeper 故障。
    • 网络问题。
  • 解决方法
    • 调整 ISR 设置。
    • 扩容 Broker 数量。

Controller 优化

Controller 是 Kafka 集群的核心,负责 partition 的生命周期管理:

  • 防止 ZK 会话超时:需防范 ISR 抖动、ZooKeeper 性能问题、GC 操作和网络 IO 不稳定。
  • 监控指标
    • kafka.controller:type=KafkaController,name=ActiveControllerCount:应始终为 1。
    • LeaderElectionRate:确保 Controller 正确选举。

Unclean Leader 选举

允许不在 ISR 中的 replica 选为 Leader:

  • 配置开关unclean.leader.election.enable:默认为 true,允许不在 ISR 中的 replica 选为 Leader。
  • 监控指标kafka.controller:type=ControllerStats,name=UncleanLeaderElectionsPerSec

Broker 配置

Broker 级别配置直接影响 Kafka 的性能和可靠性:

  • 数据保留时间:通过 log.retention.{ms, minutes, hours}log.retention.bytes 设置数据保留策略。
  • 消息大小限制:设置 message.max.bytesreplica.fetch.max.bytes
  • 删除 topic:默认禁用,需手动开启 delete.topic.enable
  • 副本配置:设置 min.insync.replicas,确保数据持久性。
  • 网络配置:设置 zookeeper.session.timeout.ms 为 30s。
  • I/O 线程:默认为 8,建议根据具体负载调整 num.io.threads

Kafka 集群评估

集群评估是优化 Kafka 分配资源的关键:

  • Broker 评估
    • 每个 Broker 的 Partition 数不应超过 2000。
    • Partition 大小控制在 25GB 左右。
  • 集群评估
    • 数据保留时间、流量大小等因素决定 Broker 数量。
  • 扩容指标
    • 磁盘使用率应控制在 60% 以内。
    • 网络使用率应控制在 75% 以内。
  • 集群监控
    • 保持负载均衡。
    • 确保 Partition 均匀分布。
    • 防止磁盘或带宽耗尽。

Broker 监控

监控 Broker 的运行状态和性能:

  • Partition 数kafka.server:type=ReplicaManager,name=PartitionCount
  • Leader 副本数kafka.server:type=ReplicaManager,name=LeaderCount
  • ISR 扩容/缩容率kafka.server:type=ReplicaManager,name=IsrExpandsPerSec
  • 读写速率Message in rateByte in rateByte out rate
  • 网络请求空闲率NetworkProcessorAvgIdlePercentRequestHandlerAvgIdlePercent

Topic 评估

Topic 评估需综合考虑数据生成、存储和消费的实际需求:

  • Partition 数
    • 确保与最大 Consumer Group 的 consumer 线程数一致。
    • 适当增加 Partition 数以支持高吞吐量。
    • 控制 Partition 大小(25GB 左右)。
  • Partition 扩容:根据数据量和网络带宽自动扩容。

合理设置 Partition

Partition 数的设置需平衡吞吐量、资源占用和可用性:

  • 吞吐量计算
    • 每个 Partition 的吞吐量为 P 或 C。
    • 总吞吐量 T,Partition 数应至少为 max(T/P, T/C)。
  • 优缺点分析
    • 更多 Partition 提高吞吐量,但可能增加不可用性和端到端延迟。
    • Client 内存占用增加。

Producer 配置与性能调优

Producer 是数据生产端,需优化配置以提高吞吐量:

  • Quotas 设置:防止恶意攻击,确保 SLA。
  • 性能优化
    • 使用 Java 版 Kafka Client。
    • 设置合理的 batch.size 和 linger.ms。
    • 调整 num.replica.fetchers 以平衡延迟和吞吐量。
    • 优化 TCP 缓冲区设置。
  • 监控指标
    • batch-size-avgwaiting-threadsbuffer-available-bytes 等。

Consumer 配置与性能调优

Consumer 端需优化配置以提高吞吐量和稳定性:

  • 吞吐量优化
    • 确保 Partition 数足够。
    • 分配足够的 OS page cache。
  • 异步 commit:减少 offset commit 的延迟。
  • Consumer Rebalance:定期检查时间限制和处理逻辑。
  • 网络配置:优化 Consumer 端的网络设置。
  • 监控指标
    • records-lag-maxrecords-per-request-avg 等。

如何保证数据不丢

数据持久性配置:

  • block.on.buffer.full:默认为 false,避免因内存不足导致数据丢失。
  • max.block.ms:设置合理的块超时时间,防止生产者因内存不足而抛出错误。

通过以上配置和优化,可以显著提升 Kafka 集群的性能和稳定性,为大规模数据处理提供强有力的支持。

转载地址:http://vdqfk.baihongyu.com/

你可能感兴趣的文章