kafka服务器配置

kafka这个服务是不怎么耗资源的,基本上没有特殊的要求,除了磁盘容量大点,别的要求真不高。

这个也是记录了「kafka权威指南」第二章内容

硬件

磁盘

  • 磁盘吞吐量:大多数客户端在发送消息之后会一直等待到至少有一个服务器确认消息已经成功提交为止。这个通知基本就是leader发出的。而kafka本身由于使用了0拷贝和顺序读写的特性,因此速度是相当快的。HDD和SSD的差距我记得测试过就只有10%的差距。
    当然这个还是看自己的实际读写量了。
  • 磁盘容量:这个就是自己topic一天的大小 * 副本数 * 保留天数 * 120% / broker数量, 这基本就是你每个服务器所需要的磁盘容量了。

内存

运行kafka的JVM不需要太大的内存。1G,2G一般是够了,剩下的系统内容可以用作页面缓存,或者用来缓存正在使用中的日志片段

网络

主要是看自己的生产者和消费者的量,一般万兆网卡是足够的。但是一定要注意要支持多队列,不然可能在CPU0会产生很多的si。
同时一定要看下自己的副本设置情况,防止带宽被占满。最好预留50%的网络吞吐量,这样后期万一要增加broker节点还有多余的可以空间。

CPU

kafka里CPU主要是对消息进行批量解压,设置偏移量,然后重新进行批量压缩,再保存到磁盘上。

操作系统

虚拟内存

  • vm.swappiness=1
    在高于3.5以上的内核版本中,需要将此参数设置为1,而不是0,因为0的话意味着在任何情况下都不要发生交换。
  • vm.dirty_backgroud_ratio=5
    这个表示系统内存的百分比是作为脏页。
  • vm.dirty_ratio=60
    被内核进程刷新到磁盘之前的脏页数量。这个设置的高需要配合kafka的复制功能,不然会丢数据。

磁盘

作者建议使用XFS,主要是XFS为kafka提供了更好的性能,无需单独进行调优,批量磁盘写入具有更高的效率。
在挂载磁盘的时候加上noatime参数,kafka没有用到atime(访问时间)

网络

主要是socket的读写缓冲区和tcp socket的读写缓冲区

  • net.core.wmem_default=131072

  • net.core.rmem_default=131072

  • net.core.wmem_max=2097152

  • net.core.rmem_max=2097152

  • net.ipv4.tcp_wmem=4096 65536 2048000

  • net.ipv4.tcp_rmem=4096 65536 2048000
    上面tcp的3个参数分别表示最小值4KB,默认值64KB,最大值2MB,这里的最大值不能超过上面net.core的max值

  • net.ipv4.tcp_window_scaling=1
    启用TCP时间窗扩展。

  • net.ipv4.tcp_max_syn_backlog=10240
    将syn的请求的backlog设置为10240,这样可以接受更多的并发请求。

  • net.core.netdev_max_backlog=10000
    允许更多的数据包排队等待内核处理

其他

  • net.ipv4.tcp_congestion_control = htcp
    将流量调度设置为htcp,这个无需改成bbr,首先bbr需要4.10内核以上才会支持,我们一般centos7.X都是3.10,另外在内网网络里,bbr提升的性能并不高,htcp完全够用。

GC

  • 使用G1 gc
    调整以下2个G1参数
  • MaxGCPauseMillis:200ms
    默认每次GC停顿的时间
  • InitiatingHeapOccupancyPercent:35
    在HEAP的使用率未达到35%之前,G1不会启动GC。这个百分比包含了新生代和老年代内存。

以上2个参数根据自己的实际情况来进行调整。