外观
Kafka 消息如何进行持久化的
1.分区存储:Kafka
将消息存储在分区中,每个分区是一个有序的、不可变的消息序列,可分布在不同服务器上实现负载均衡。每个分区有唯一标识符,消息在分区中按顺序存储且有唯一偏移量,用于标识位置,为消息持久化提供了有序存储基础。
2.日志文件
- 顺序写入:每个分区对应一个日志文件,是追加写入的文件,新消息追加到末尾,这种顺序写入方式对磁盘性能友好,能提升写入效率,确保消息在磁盘上有序存储。
- 分段存储:日志文件采用分段存储,每个段叫日志段。每个日志段包含一个索引文件和一个数据文件,索引文件用于快速定位消息在数据文件中的位置,方便消息的检索和读取。
- 日志滚动:随着时间推移或日志文件达到一定大小,会发生日志滚动,新消息写入新的日志文件,确保日志文件大小可控,有利于磁盘空间管理和数据的长期存储。
3.副本机制:每个分区有多个副本,包括一个主副本和多个从副本。主副本负责接收和处理生产者发送的消息,并同步到从副本。从副本定期从主副本拉取消息保持同步。通过 ISR 机制确保数据一致性,只有消息被 ISR
中的所有副本复制完毕才视为已 “提交”,消费者可安全消费,提高了消息的可靠性和持久性。
4.消息刷盘策略:Kafka
提供同步刷盘和异步刷盘策略。同步刷盘在消息写入内存缓冲区后立刻刷入磁盘,保证消息安全性;异步刷盘则尽快刷盘,牺牲一定安全性换取更高写入性能,可根据业务需求选择。
5.消息清理:Kafka
会定期清理过期消息释放存储空间,清理策略可通过配置参数调整,如设置消息保留时间或保留大小,达到限制时,Kafka
自动清理,方式有删除或移动到归档存储。
6.事务与幂等性:Kafka0.11
版本及以后支持事务,允许生产者在一个事务中发送多条消息,要么全部成功,要么全部失败。生产者还可配置为幂等性,即使发送重复消息,Kafka
也能确保每条消息只被写入一次,避免数据重复,增强数据一致性和持久化的准确性。