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。
- 优先推荐G1收集器,Full GC更少;
- 其次,CPU 资源充裕场景下,建议使用 CMS 收集器-XX:+UseCurrentMarkSweepGC;
- 其次使用吞吐量收集器-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