• Kafka核心技术与实战——08 | 最最最重要的集群参数配置(下)


    • 下半部分主要是 Topic 级别参数、JVM 参数以及操作系统参数的设置
      • 正确设置这些参数是搭建高性能 Kafka 集群的关键因素
    • Topic 级别参数
      • 如果同时设置了 Topic 级别参数和全局 Broker 参数
        • 答案就是 Topic 级别参数会覆盖全局 Broker 参数的值,而每个 Topic 都能设置自己的参数值,这就是所谓的 Topic 级别参数
        • 更适当的做法是允许不同部门的 Topic 根据自身业务需要,设置自己的留存时间
      • 从保存消息方面来考量的话,下面这组参数是非常重要的:
        • retention.ms:规定了该 Topic 消息被保存的时长。默认是 7 天,即该 Topic 只保存最近 7 天的消息。一旦设置了这个值,它会覆盖掉 Broker 端的全局参数值。
        • retention.bytes:规定了要为该 Topic 预留多大的磁盘空间。和全局参数作用相似,这个值通常在多租户的 Kafka 集群中会有用武之地。当前默认值是 -1,表示可以无限使用磁盘空间。
      • 如果从能处理的消息大小这个角度来看的话
        • 有一个参数是必须要设置的,即max.message.bytes。它决定了 Kafka Broker 能够正常接收该 Topic 的最大消息大小
      • 怎么设置 Topic 级别参数吧
        • 创建 Topic 时进行设置
          •  Kafka 开放了kafka-topics命令供我们来创建 Topic 即可。
          • 对于上面这样一条命令,请注意结尾处的--config设置,我们就是在 config 后面指定了想要设置的 Topic 级别参数
        • 自带的命令kafka-configs来修改 Topic 级别参数
    • JVM 参数
      • Kafka 服务器端代码是用 Scala 语言编写的,但终归还是编译成 Class 文件在 JVM 上运行,使用Java 8 
      • JVM 端设置,堆大小这个参数至关重要
        • 将你的 JVM 堆大小设置成 6GB 吧,这是目前业界比较公认的一个合理值
        • 我见过很多人就是使用默认的 Heap Size 来跑 Kafka,说实话默认的 1GB 有点小
      • JVM 端配置的另一个重要参数就是垃圾回收器的设置,也就是平时常说的 GC 设置
        • 如果你依然在使用 Java 7,那么可以根据以下法则选择合适的垃圾回收器:
          • 如果 Broker 所在机器的 CPU 资源非常充裕,建议使用 CMS 收集器。启用方法是指定-XX:+UseCurrentMarkSweepGC。
          • 否则,使用吞吐量收集器。开启方法是指定-XX:+UseParallelGC。
        • 当然了,如果你已经在使用 Java 8 了,那么就用默认的 G1 收集器就好了
      • 我们确定好了要设置的 JVM 参数,我们该如何为 Kafka 进行设置呢
        • KAFKA_HEAP_OPTS:指定堆大小。
        • KAFKA_JVM_PERFORMANCE_OPTS:指定 GC 参数。
        • 比如你可以这样启动 Kafka Broker,即在启动 Kafka Broker 之前,先设置上这两个环境变量:
          • $> export KAFKA_HEAP_OPTS=--Xms6g --Xmx6g
          • $> export KAFKA_JVM_PERFORMANCE_OPTS= -server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+ExplicitGCInvokesConcurrent -Djava.awt.headless=true
          • $> bin/kafka-server-start.shconfig/server.properties
    • 操作系统参数
      • 来聊聊 Kafka 集群通常都需要设置哪些操作系统参数
        • 文件描述符限制
        • 文件系统类型
        • Swappiness
        • 提交时间
      • 首先是ulimit -n
        • 通常情况下将它设置成一个超大的值是合理的做法,比如ulimit -n 1000000
      • 其次是文件系统类型的选择
        • 这里所说的文件系统指的是如 ext3、ext4 或 XFS 这样的日志型文件系统
        • 根据官网的测试报告,XFS 的性能要强于 ext4,所以生产环境最好还是使用 XFS
      • 第三是 swap 的调优
        • 因为一旦设置成 0,当物理内存耗尽时,操作系统会触发 OOM killer 这个组件,它会随机挑选一个进程然后 kill 掉,即根本不给用户任何的预警
        • 但如果设置成一个比较小的值,当开始使用 swap 空间时,你至少能够观测到 Broker 性能开始出现急剧下降,从而给你进一步调优和诊断问题的时间
        • 基于这个考虑,我个人建议将 swappniess 配置成一个接近 0 但不为 0 的值,比如 1
      • 最后是提交时间或者说是 Flush 落盘时间
        • 这里稍微拉大提交间隔去换取性能还是一个合理的做法
        • 向 Kafka 发送数据并不是真要等数据被写入磁盘才会认为成功
        • 而是只要数据被写入到操作系统的页缓存(Page Cache)上就可以了
        • 随后操作系统根据 LRU 算法会定期将页缓存上的“脏”数据落盘到物理磁盘上
        • 这个定期就是由提交时间来确定的,默认是 5 秒
  • 相关阅读:
    Hello,cnblogs!
    本地搭建IIS服务器
    thinkPHP相关
    网页中经常用到的<hr / >标签的样式
    JS三元表达式
    ZUI开发人员选项
    XWindow、Server、Client和QT、GTK之间的关系
    深度桌面操作系统架构设计
    关于linux图形界面的基本知识
    linux各发行版之间的区别
  • 原文地址:https://www.cnblogs.com/minimalist/p/12821594.html
Copyright © 2020-2023  润新知