Skip to content

Kafka 硬件配置选择

1. 场景说明

需求: 100万日活,每人每天100条日志。

1.1 场景分析

  • 每天总共的日志条数: 100万*100条=1亿条。
  • 每秒的日志消息数量: 1亿/24小时/60分/60秒 = 1150条/每秒钟。
  • 每条日志大小:0.5k - 2k(取1k)。
  • 数据传输速率: 1150条/每秒钟*1k ≈ 1m/s 。
  • 高峰期速率:1150条*20倍 = 23000条。每秒多少数据量:20MB/s。注: 高峰期一般为平常20倍

2. 服务器台数选择

服务器台数=2*(生产者峰值生产速率 * 副本/100)+1
=2*(20m/s*2/100)+1
=3台
建议3台服务器。

3. 磁盘选择

Kafka底层主要是顺序写,固态硬盘和机械硬盘的顺序写速度差不多。
建议选择普通的机械硬盘。
每天总数据量:1亿条1k ≈ 100g 100g副本2*保存时间 3天/0.7 ≈ 1T 建议三台服务器硬盘总大小,大于等于1T。

4. 内存选择

Kafka内存组成:堆内存+页缓存

4.1 Kafka堆内存

建议每个节点:10g ~ 15g, 在kafka-server-start.sh中修改

sh
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
 export KAFKA_HEAP_OPTS="-Xmx10G -Xms10G"
fi

4.2 Kafka使用内存情况分析

  1. 查看Kafka进程号
sh
[jack@hadoop105 bin]$ jps
16499 KafkaEagle
57797 QuorumPeerMain
104938 Jps
55359 Kafka
  1. 根据Kafka进程号,查看Kafka的GC情况
sh
[jack@hadoop105 bin]$ jstat -gc 55359 1s 10
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
 0.0   10240.0  0.0   10240.0 100352.0 73728.0  1986560.0   255467.5  53628.0 48477.6 6780.0 6015.4    107   10.220   0      0.000   10.220
 0.0   10240.0  0.0   10240.0 100352.0 73728.0  1986560.0   255467.5  53628.0 48477.6 6780.0 6015.4    107   10.220   0      0.000   10.220
 0.0   10240.0  0.0   10240.0 100352.0 73728.0  1986560.0   255467.5  53628.0 48477.6 6780.0 6015.4    107   10.220   0      0.000   10.220
 0.0   10240.0  0.0   10240.0 100352.0 73728.0  1986560.0   255467.5  53628.0 48477.6 6780.0 6015.4    107   10.220   0      0.000   10.220
 0.0   10240.0  0.0   10240.0 100352.0 73728.0  1986560.0   255467.5  53628.0 48477.6 6780.0 6015.4    107   10.220   0      0.000   10.220
 0.0   10240.0  0.0   10240.0 100352.0 73728.0  1986560.0   255467.5  53628.0 48477.6 6780.0 6015.4    107   10.220   0      0.000   10.220
 0.0   10240.0  0.0   10240.0 100352.0 74752.0  1986560.0   255467.5  53628.0 48477.6 6780.0 6015.4    107   10.220   0      0.000   10.220
 0.0   10240.0  0.0   10240.0 100352.0 74752.0  1986560.0   255467.5  53628.0 48477.6 6780.0 6015.4    107   10.220   0      0.000   10.220
 0.0   10240.0  0.0   10240.0 100352.0 74752.0  1986560.0   255467.5  53628.0 48477.6 6780.0 6015.4    107   10.220   0      0.000   10.220
 0.0   10240.0  0.0   10240.0 100352.0 74752.0  1986560.0   255467.5  53628.0 48477.6 6780.0 6015.4    107   10.220   0      0.000   10.220

参数说明:

参数说明参数说明
S0C第一个幸存区的大小S0U第一个幸存区的使用大小
S1C第二个幸存区的大小S1U第二个幸存区的使用大小
EC伊甸园区的大小EU伊甸园区的使用大小
OC老年代大小OU老年代使用大小
MC方法区大小MU方法区使用大小
CCSC压缩类空间大小CCSU压缩类空间使用大小
YGC年轻代垃圾回收次数YGCT年轻代垃圾回收消耗时间
FGC老年代垃圾回收次数FGCT老年代垃圾回收消耗时间
GCT垃圾回收消耗总时间
  1. 根据Kafka进程号,查看Kafka的堆内存
sh
[jack@hadoop105 bin]$ jmap -heap 55359
Attaching to process ID 55359, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.391-b13

using thread-local object allocation.
Garbage-First (G1) GC with 8 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 2147483648 (2048.0MB)
   NewSize                  = 1363144 (1.2999954223632812MB)
   MaxNewSize               = 1287651328 (1228.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  = 2048
   capacity = 2147483648 (2048.0MB)
   used     = 337117224 (321.50003814697266MB)
   free     = 1810366424 (1726.4999618530273MB)
   15.69824405014515% used
G1 Young Generation:
Eden Space:
   regions  = 59
   capacity = 104857600 (100.0MB)
   used     = 61865984 (59.0MB)
   free     = 42991616 (41.0MB)
   59.0% used
Survivor Space:
   regions  = 8
   capacity = 8388608 (8.0MB)
   used     = 8388608 (8.0MB)
   free     = 0 (0.0MB)
   100.0% used
G1 Old Generation:
   regions  = 258
   capacity = 2034237440 (1940.0MB)
   used     = 266862632 (254.50003814697266MB)
   free     = 1767374808 (1685.4999618530273MB)
   13.118558667369724% used

14902 interned Strings occupying 1668944 bytes.

4.3 页缓存

页缓存是Linux系统服务器的内存。我们只需要保证1个segment(1g)中25%的数据在内存中就好。
每个节点页缓存大小=(分区数 * 1g * 25%)/节点数。例如10个分区,页缓存大小=(10 * 1g * 25%)/ 3 ≈ 1g 建议服务器内存大于等于11G。

5. CPU选择

  • num.io.threads = 8负责写磁盘的线程数,整个参数值要占总核数的50%。
  • num.replica.fetchers = 1副本拉取线程数,这个参数占总核数的50%的1/3。
  • num.network.threads = 3数据传输线程数,这个参数占总核数的50%的2/3。
    建议32个cpu core。

6. 网络选择

网络带宽 = 峰值吞吐量 ≈ 20MB/s选择千兆网卡即可。
100Mbps单位是bit;10M/s单位是byte ; 1byte = 8bit,100Mbps/8 = 12.5M/s。
一般百兆的网卡(100Mbps )、千兆的网卡(1000Mbps)、万兆的网卡(10000Mbps)。