Kafka学习笔记(三)Kafka基础设施评估及服务器端配置

  • Kafka基础设施评估
  • 操作系统
  • 磁盘选型
  • 磁盘容量规划方法
  • 带宽规划方法
  • Kafka服务器端重要配置
  • 静态配置(server.properties)
  • 存储信息相关
  • 【推荐】log.dirs
  • 【不推荐】log.dir
  • ZooKeeper相关
  • 【推荐】zookeeper.connect
  • Broker与Client端连接配置
  • 【推荐】listeners
  • 【参考】advertised.listeners
  • Topic管理配置(Broker作用域下)
  • 【推荐】auto.create.topics.enable
  • 【推荐】unclean.leader.election.enable
  • 【推荐】auto.leader.rebalance.enable
  • 数据留存配置
  • 【推荐】log.retention.{hours|minutes|ms}
  • 【推荐】log.retention.bytes
  • 【推荐】message.max.bytes
  • 【推荐】log.segment.bytes
  • 【参考】replica.fetch.max.bytes
  • Topic级别配置
  • Topic级别参数配置方法
  • 【参考】创建 Topic 时设置
  • 【推荐】修改 Topic 时设置
  • 数据留存
  • 【推荐】retention.ms
  • 【推荐】retention.bytes
  • 【推荐】max.message.bytes
  • JVM级别配置
  • 参考样例
  • 参数说明
  • 【推荐】内存大小
  • 【推荐】垃圾回收器
  • 操作系统级别配置
  • 【推荐】文件描述符限制
  • 【推荐】swap 调优


Kafka基础设施评估

操作系统

优先用Linux。

磁盘选型

建议用机械磁盘,原因是性价比高。顺序读写操作一定程度上规避了随机读写操作慢的问题,同时缩小了与SSD的性能差距。
另外,集群情况下,可不做raid。

磁盘容量规划方法

5个参考维度:增量消息数、消息留存时间、平均消息大小、备份数、是否启用压缩。
估算公式:

增量消息数 * 平均消息大小 * 备份数 * (100% + 其他数据空间占比) * 消息留存时间 / 压缩比

其他数据空间占比:比如索引数据等,参考值: 10%。

带宽规划方法

以单机带宽1Gb为例:
1Gb实际单机估算只能使用大约 700Mb 的带宽资源。因为,超过 70% 的阈值就有网络丢包的可能性。
需要给传输峰值和Follower Replica同步预留带宽。经验预留2/3的带宽,所以1Gb实际单机估算只能使用大约 240Mbps 的带宽资源。
如果需求是1TB/h业务数据传输需求(这边1TB指包含输入和输出两组IO,不是单纯的写入),参考计算:

1(TB) * 1000 * 1000(TB to MB) * 8(B to b) / 240(Mbps) / 3600 (Hour to Sec) = 9.26

所以,单机带宽1Gb场景下,约等于10台服务器需求。也就是说,1TB/h业务数据传输据以上经验评估需要10台服务器。

Kafka服务器端重要配置

静态配置(server.properties)

静态配置指的Kafka服务器端的启动配置。

存储信息相关

【推荐】log.dirs

功能:指定了 Broker 需要使用的若干个文件目录路径。
建议配置方法:多路径逗号分隔,建议配置多个不同物理磁盘的路径,可以提升读写性能:比起单块磁盘,多块物理磁盘同时读写数据有更高的吞吐量;Kafka 1.1 以后,能够实现故障转移,是kafka对raid的替代方案的基础依据。
样例:

/home/kafka1,/home/kafka2,/home/kafka3

【不推荐】log.dir

功能:作为log.dirs的补充。单个路径,不建议设置。

ZooKeeper相关

ZooKeeper分布式协调框架,负责协调管理并保存 Kafka 集群的所有元数据信息。Kafka新版本(Kafka 2.8.0)去除了ZooKeeper,改用KRaft。Raft协议是当今最流行的分布式协调算法,Etcd、Consul等系统的基础。

【推荐】zookeeper.connect

样例:

zk1:2181,zk2:2181,zk3:2181

Broker与Client端连接配置

【推荐】listeners

监听器,告诉外部连接者要通过什么协议访问指定主机名和端口开放的 Kafka 服务。
格式:

协议名称://主机名:端口号

协议名称说明:
PLAINTEXT:明文;
SSL:使用 SSL 或 TLS 加密传输。
样例:

PLAINTEXT://localhost:9092

【参考】advertised.listeners

对外发布的服务器接口,主要是为外网访问提供的。
常见用途:Kafka Broker机器上配置了双网卡,一块网卡用于内网访问(即我们常说的内网IP);另一个块用于外网访问。那么你可以配置listeners为内网IP,advertised.listeners为外网IP。

Topic管理配置(Broker作用域下)

【推荐】auto.create.topics.enable

是否允许自动创建 Topic。
非必要场景下,建议设置为false,设置为true容易导致误建Topic。

【推荐】unclean.leader.election.enable

是否允许 Unclean Leader 选举,是否允许数据同步较落后的节点参与Leader副本竞选。这边判断副本是否落后,参考参数replica.lag.time.max.ms的取值,默认是:10s。
建议多副本情况下,显式设置为false。
否则数据同步较落后的节点当前Leader副本,可能导致数据丢失。

【推荐】auto.leader.rebalance.enable

是否定时执行leader副本竞选。
建议设置为false。
客户端没有主动切换leader副本的客观需求场景。

数据留存配置

【推荐】log.retention.{hours|minutes|ms}

控制一条消息数据被保存多长时间;
优先级:ms > minutes > hours;
建议以hours为单位控制。

【推荐】log.retention.bytes

指定 Broker 为消息保存的总磁盘容量大小
默认-1,上不封顶

【推荐】message.max.bytes

Broker 能够接收的最大消息大小
默认1000012,太少
建议10M。

【推荐】log.segment.bytes

kafka数据文件的大小
默认为1G
需要确保此值大于一个消息的最大大小。

【参考】replica.fetch.max.bytes

broker可复制的消息的最大字节数
默认为1M
这个值应该比message.max.bytes大,否则broker会接收此消息,但无法将此消息复制出去,从而造成数据丢失

Topic级别配置

Topic级别参数优先级高于Broker参数

Topic级别参数配置方法

【参考】创建 Topic 时设置

样例:

bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic topic_name --partitions 1 --replication-factor 1 --config retention.ms=15552000000 --config max.message.bytes=5242880
【推荐】修改 Topic 时设置

样例:

bin/kafka-configs.sh --zookeeper localhost:2181 --entity-type topics --entity-name topic_name --alter --add-config max.message.bytes=10485760

数据留存

【推荐】retention.ms

控制一条消息数据被保存多长时间;
默认7天。

【推荐】retention.bytes

指定当前topic下,消息保存的总磁盘容量大小;
默认-1,上不封顶。

【推荐】max.message.bytes

指定当前topic下,能够正常接收该 Topic 的最大消息大小。

JVM级别配置

参考样例

参考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.sh config/server.properties

参数说明

【推荐】内存大小

KAFKA_HEAP_OPTS:指定kafka JVM 堆大小的环境变量,建议6G。

【推荐】垃圾回收器

参考环境变量:KAFKA_JVM_PERFORMANCE_OPTS。

  1. 优先推荐G1收集器,Full GC更少;
  2. 其次,CPU 资源充裕场景下,建议使用 CMS 收集器-XX:+UseCurrentMarkSweepGC;
  3. 其次使用吞吐量收集器-XX:+UseParallelGC。

操作系统级别配置

【推荐】文件描述符限制

文件描述符限制(ulimit -n),默认1024太小,参考:

ulimit -n 1000000

【推荐】swap 调优

swap 分区通常被称为交换分区,这是一块特殊的硬盘空间,即当实际内存不够用的时候,操作系统会从内存中取出一部分暂时不用的数据,放在交换分区中,从而为当前运行的程序腾出足够的内存空间;
swappniess很小时,系统能并发的进程或者线程就会减少,但每个进程或者线程运行的速度较快,cpu利用率较好;
swappniess很大时,系统并发好,但每个进程或者线程速度较慢。较多IO读写和系统中断会消耗很多cpu资源,此时系统效率较低;
对于Kafka来说,值较大时,需要防止Kafka 进程使用 swap 空间;同时不能设置成0,避免操作系统启动OOM killer机制;
建议设置为:1。
参考:

echo 1 >> /proc/sys/vm/swappniess