面试题答案
一键面试日志存储路径设置
- 多路径分散存储:将Kafka日志存储在多个不同的物理磁盘路径上,避免单个磁盘I/O瓶颈。例如,如果服务器有多个磁盘,可以分别挂载到
/data1/kafka-logs
、/data2/kafka-logs
等路径,然后在server.properties
中配置log.dirs=/data1/kafka-logs,/data2/kafka-logs
。这样不同分区的日志可以分布在不同磁盘,并行读写。 - 选择高速存储设备:优先使用SSD(固态硬盘)存储Kafka日志,因为SSD相比传统机械硬盘具有更高的读写速度和更低的延迟。若条件允许,将日志存储路径设置在SSD设备挂载的目录下。
磁盘I/O优化
- 文件系统选择:选用适合Kafka读写模式的文件系统,如XFS或EXT4。XFS在大文件处理和高并发I/O场景下表现较好,而EXT4相对成熟稳定。在格式化磁盘时选择合适的文件系统,例如
mkfs.xfs /dev/sdb
或mkfs.ext4 /dev/sdb
。 - I/O调度算法调整:根据服务器磁盘类型调整I/O调度算法。对于SSD,使用
noop
调度算法可减少不必要的I/O调度开销,提升性能。可以通过修改/sys/block/sda/queue/scheduler
文件来设置调度算法,如echo noop > /sys/block/sda/queue/scheduler
。对于机械硬盘,deadline
调度算法可能更合适,它可以保证I/O请求的响应时间。 - 预分配日志文件:Kafka默认会预分配日志文件,确保文件大小固定,减少文件系统碎片化。可通过
log.preallocate
参数控制,默认值为true
。这样在写入数据时,不会因为文件动态增长而频繁触发文件系统的元数据操作,提高I/O效率。
数据保留策略
- 基于时间的保留策略:通过
log.retention.hours
(或log.retention.minutes
、log.retention.ms
)参数设置消息保留时间。例如,设置log.retention.hours=24
,表示Kafka将只保留最近24小时内的消息,过期的消息会被自动删除,释放磁盘空间,提高整体存储效率。 - 基于大小的保留策略:使用
log.retention.bytes
参数设置分区日志文件的总大小。当分区日志文件大小达到该阈值时,最早的消息会被删除。如log.retention.bytes=1073741824
(即1GB),可以防止单个分区日志无限增长,保证磁盘空间合理利用。 - 清理策略选择:Kafka有两种清理策略,
delete
和compact
。delete
策略按照时间或大小删除过期消息;compact
策略会保留每个消息键的最新值,删除旧值,适用于需要保留最新状态数据的场景。可通过log.cleanup.policy
参数设置,如log.cleanup.policy=compact
。