Kafka是如何保证消息不丢失?
1.生产者发送消息到Broker丢失:
设置异步发送:发送失败则使用回调进行记录或者重发
消息重试:参数配置,可以设置重试次数
2.消息在broker中存储丢失
发送确认机制acks
acks=0,生产者在成功写入消息之前不会等待任何来自服务器的响应,消息有丢失的风险,但速度最快
acks=1,只要集群首领节点收到消息,生产者就会收到一个来自服务器的成功响应
acks=all,只有当所有参与赋值的节点全部收到消息时,生产者才会收到一个来自服务器的成功响应
3.消息从Broker接受消息丢失
消费者默认自动按期提交已经消费的偏移量,默认5s提交一次
如果出现重平衡的情况,可能会重复消费或者丢失数据
关闭自动提交偏移量,开启手动提交偏移量,提交方式最好是同步+异步提交
Kafka如何保证消费的顺序性?
默认情况下,一个topic的数据可能存储在不同的分区中,每个分区都有一个按照顺序的存储的偏移量,如果消费者关联了多个分区不能保证顺序性
解决方案:1.发送消息时指定分区号
2.发送消息时按照相同的业务设置相同的key,最终计算的时候也能找到同样的分区进行存储
Kafka的高可用机制
集群模式
一个kafka集群由多个broker实例组成,即使一个broker宕机,也不耽误其他broker继续对外提供服务
分区备份机制
一个topic有多个分区,每个分区有多个副本,有一个leader,其余的是follower,副本存储在不同的broker中;所有的分区副本的内容都是相同的,如果leader发生故障时,会自动将其中一个follower提升为leader,保证高可用性
Kafka集群的工作原理
-
消息生产:
- 生产者将消息发送到Broker,Broker将消息存储到主题的分区。
- 生产者可以选择将消息发送到特定的分区,或者让Kafka根据键值自动分配分区。
-
消息存储:
- Broker将消息存储在磁盘上,并维护消息的索引和偏移量。
- Kafka保证消息的持久化,直到消费者已经确认消费。
-
消息消费:
- 消费者从Broker读取消息,并根据偏移量跟踪他们已经读取的消息。
- 消费者组内的消费者协调处理分区中的消息,确保每个消息只被处理一次。
-
消息复制:
- 为了提高可靠性,Kafka支持消息的复制。每个分区可以有多个副本,副本之间通过ZooKeeper协调。
- 主副本负责处理生产者和消费者的消息请求,其他副本用于故障转移。
Kafka的数据清理机制
Kafka的文件存储机制:
1.Kafka中topic的数据存储在分区上,分区如果文件过大就会分段存储segment
2.每个分段在磁盘上以索引和日志文件的形式存储
3.分段的好处是,第一能够减少单个文件内容的大小,查找数据方便,第二方便kafka进行日志清理
数据清理机制:
1.根据消息的保留时间,当消息在Kafka中保存的时间超过了指定的时间,就会触发清理过程
2.根据topic存储的数据大小,当topic所占的日志文件大小大于一定的阈值,则开始删除最久的消息
Kafka中高性能的设计
四次拷贝:
零拷贝(两次):
消息分区:不受单台服务器的限制,可以不受限的处理更多的数据
顺序读写:磁盘顺序读写,提升读写效率
页缓存:把磁盘中的数据缓存到内存中,把对磁盘的访问变成对内存的访问