Kafka硬件配置选择

场景:

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)。 

 

posted @ 2022-11-19 17:02  BlogMemory  阅读(1919)  评论(0编辑  收藏  举报