场景:
100万日活(中型公司),每人每天100条日志,每天总共的日志条数是100万 * 100条 = 1亿条。其日志处理速度为:1亿条/24小时/60分/60秒 ≈ 1157条/每秒钟。
假设每条日志大小:0.5k - 2k(取1k), 则:1157条/每秒钟 * 1k ≈ 1m/s 。
高峰期每秒钟(假设平均值20倍):1157条 * 20倍 = 23140条。
每秒多少数据量:23140*1k/1024k ≈ 20MB/s。
1. 服务器台数选择
服务器台数(经验公式) = 2 *(生产者峰值生产速率 * 副本 / 100) + 1 。
= 2 *(20m/s * 2 / 100) + 1
= 3台
建议3台服务器。
2. 磁盘选择
kafka按照顺序读写,因此,机械硬盘和固态硬盘顺序读写速度差不多。
1亿条 * 1k ≈ 100g
100g * 2个副本 * 3天(保存天数)/ 0.7(预留30%的内存) ≈ 1T
建议三台服务器的磁盘大小大于 1T
3. 内存选择
kafka内存 = 堆内存(kafka内部配置,生产环境一般配置10~15g,根据实际需求进行调整)+ 页缓存。
-
堆内存:10~15g,假设取 10g。
-
页缓存:页缓存是Linux系统服务器的内存。我们只需要保证1个segment(1g)中25%的数据在内存中就好。 每个节点页缓存大小 = (分区数 * 1g * 25%)/ 3(节点数)。例如10个分区,页缓存大小=(10 * 1g * 25%)/ 3 ≈ 1g 。
因此,建议一台服务器内存大小要大于 10g + 1g = 11g。
kafka-server-start.sh文件中配置:
if [ $# -lt 1 ];
then
echo "USAGE: $0 [-daemon] server.properties [--override property=value]*"
exit 1
fi
base_dir=$(dirname $0)
if [ "x$KAFKA_LOG4J_OPTS" = "x" ]; then
export KAFKA_LOG4J_OPTS="-Dlog4j.configuration=file:$base_dir/../config/log4j.properties"
fi
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
fi
EXTRA_ARGS=${EXTRA_ARGS-'-name kafkaServer -loggc'}
查看kafka垃圾回收状态:
[root@-9930 bin]# jstat -gc 21345
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
0.0 2048.0 0.0 2048.0 53248.0 24576.0 993280.0 188416.1 44284.0 40616.0 5628.0 5206.6 8 0.149 0 0.000 0.149
查看kafka堆内存使用情况,可根据内存使用情况进行调整:
[root@-9930 bin]# jmap -heap 21345(进程号PID)
Attaching to process ID 21345, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.40-b25
using thread-local object allocation.
Garbage-First (G1) GC with 2 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 1073741824 (1024.0MB)
NewSize = 1363144 (1.2999954223632812MB)
MaxNewSize = 643825664 (614.0MB)
OldSize = 5452592 (5.1999969482421875MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 1048576 (1.0MB)
Heap Usage:
G1 Heap:
regions = 1024
capacity = 1073741824 (1024.0MB)
used = 222298240 (212.0001220703125MB)
free = 851443584 (811.9998779296875MB)
20.703136920928955% used
G1 Young Generation:
Eden Space:
regions = 25
capacity = 54525952 (52.0MB)
used = 26214400 (25.0MB)
free = 28311552 (27.0MB)
48.07692307692308% used
Survivor Space:
regions = 2
capacity = 2097152 (2.0MB)
used = 2097152 (2.0MB)
free = 0 (0.0MB)
100.0% used
G1 Old Generation:
regions = 194
capacity = 1017118720 (970.0MB)
used = 192938112 (184.0001220703125MB)
free = 824180608 (785.9998779296875MB)
18.969084749516753% used
11981 interned Strings occupying 1342824 bytes.
3. CPU选择
num.io.threads = 8 负责写磁盘的线程数,整个参数值要占总核数的50%。
num.replica.fetchers = 1 副本拉取线程数,这个参数占总核数的50%的1/3。
num.network.threads = 3 数据传输线程数,这个参数占总核数的50%的2/3。
建议32core。
4. 网络选择
网络带宽 = 峰值吞吐量 ≈ 20MB/s 选择千兆网卡即可。
100Mbps单位是bit;10M/s单位是byte ; 1byte = 8bit,100Mbps/8 = 12.5M/s。
一般百兆的网卡(100Mbps )、千兆的网卡(1000Mbps)、万兆的网卡(10000Mbps)。
标签:used,MB,配置,Kafka,硬件,内存,1g,100,kafka From: https://www.cnblogs.com/huangdh/p/16906495.html