kafka如何保障数据不丢失,也就是kafka提供了什么机制或者架构来保障数据的可靠性。java
主要从如下三个方面概述markdown
1.Topic 副本因子个数:replication.factor >= 3
2.同步副本列表(ISR):min.insync.replicas = 2
3.禁用unclean选举: unclean.leader.election.enable=false
复制代码
replication.factor
实现。依赖于zookeeper实现
)只有leader 副本才会提供对外的服务
,follower 副本是不会处理任务服务请求的,只是作数据同步,数据备份。replica.lag.time.max.ms
这是配置follower副本与leader副本同步的最长时间,若是在该时间内follower副本没有与leader副本同步,则会将该follower踢出ISR。min.insync.replicas=2
,那么至少要存在两个同步副本才能向分区写入数据。注意: 若是进行了上面的配置,此时必需要保证ISR中至少存在两个副本,若是ISR中的副本个数小于2,那么Broker就会中止接受生产者的请求
。尝试发送数据的生产者会收到NotEnoughReplicasException异常,消费者仍然能够继续读取已有的数据。session
同步副本列表中的分区做为leader
分区的过程称为clean leader election
非同步副本中选取一个副本做为leader
的过程叫作unclean leader election
unclean.leader.election.enable
进行设置。背景
:由于ISR是动态的,因此存在ISR列表中为空的状况,在leader挂了,其它follower没有同步时,将会产生这种状况,而一旦发生这种状况,整个kafka将不能提供服务了。高可用-开启(好比实时点击流分析系统)
:为了kafka集群可以一直提供服务(优势
),能够开启unlean.leader选举,可是由于选举的是非ISR列表中的follower做为新的leader,由于这些follower上的信息可能与以前的leader上的数据相差比较大,那么新选举的follower成为leader后,由于没有同步老leader上的数据,就会产生数据丢失
的状况(缺点
)数据一致性-禁用unclean选举(应用:好比银行,要去数据一致性高)
:禁用的话,那么选举leader只能从ISR中选举,这样能够能够保障数据的一致性(固然,这个一致性不能彻底保障,由于follower中的数据是异步和leader同步的,若是数据没有同步完,leader就挂了,那么新选举的leader里面由于没有彻底同步老leader数据,就会存在数据部分丢失的可能性。除非设置里acks=all,确保了全部follower所有同步了leader,并响应给producer
)follower和leader数据同步和以下两个参数关系密切:
replica.lag.time.max.ms:同步副本滞后与leader副本的时间
zookeeper.session.timeout.ms:与zookeeper会话超时时间
复制代码
earliest
:消费者会从分区的开始位置读取数据,无论偏移量是否有效,这样会致使消费者读取大量的重复数据,但能够保证最少的数据丢失
。一种是latest(默认)
,若是选择了这种配置, 消费者会从分区的末尾开始读取数据,这样能够减小重复处理消息,但颇有可能会错过一些消息。
这个和上面的推断结果差很少。架构
Kafka 只对“已提交”的消息(committed message)作有限度的持久化保证负载均衡
kafka是能够作到保障永久不丢失数据的,只不过要有条件限制
。分区有序
的,若是一个主题有多个分区,那么Kafka会按照key将其发送到对应的分区中,因此,对于给定的key,与其对应的record在分区内是有序的。方案一: 对于须要保障消息有序的topic,设置单个分区,可是会影响吞吐量。异步
方案二: 设置两个参数:post
retries>0
,还须要配置max.in.flight.requests.per.connections:1
,该参数是保障消息写入的顺序,当尝试重发第一批消息的时候,就不会有其余消息尝试发送给broker。这种也会影响吞吐量,可是能够保障消息是顺序发送的。一个简单的计算公式为:分区数 = max(生产者数量,消费者数量)spa
生产者数量=总体生产吞吐量/每一个生产者对单个分区的最大生产吞吐量日志
消费者数量=总体消费吞吐量/每一个消费者从单个分区消费的最大吞吐量code
选择合适的分区数量能够达到高度并行读写和负载均衡的目的,在分区上达到均衡负载是实现吞吐量的关键。须要根据每一个分区的生产者和消费者的指望吞吐量进行估计。
在下面状况发生时,须要重平衡集群:
使用kafka-reassign-partitions.sh命令进行重平衡
参考以下