kafka拥有以下可靠性保证:
- 可以保证分区消息的顺序。也就是说,同一个生产者往同一个分区写入消息,假如消息2在消息1之后写入,则Kafka可以保证消息2的偏移量比消息1的偏移量大,所以消费者会先读取消息1的数据。
- 只有当消息被写入分区的所有同步副本时,才会被标记为“已提交”。
- 只要还有一个副本为活跃状态,已提交的消息就不会丢失。
- 消费者只能读取已提交的消息。
Kafka可靠性保证的核心是其复制机制以及分区的多副本架构。
复制机制:Kafka的topic由多个分区组成,分区是其基本的数据块。每个分区存储在单个磁盘上,且其中的事件有序。分区可以有多个副本,其中有一个称为首领副本,对该分区所有的事件发送给首领副本,其他副本与首领保持同步,及时复制最新事件。首领副本不可用时,其中一个同步副本将成为新首领。
Broker中影响可靠性的参数
复制系数
relication.factor
更高的复制系数会带来更高的可用性、可靠性和更少故障。但其也会占用更多存储空间。
如果可以允许topic不可用,则复制系数设置为1即可。
建议将复制系数设置为3,这样已经足够安全了。
不同步副本是否可进行首领选举
unclean.leader.election,默认为true。
如果为true,因为将一个不同步的副本提升为首领副本,有可能造成数据不一致的问题。
如果为false,该分区可能长时间不可用,降低可用性。
具体的配置要根据业务场景,比如在银行系统中,宁愿选择不可用,也不能容忍数据不一致而导致的错误结果。
最少同步副本
min.insync.replicas
在实际的场景中,会出现只有一个同步副本的情况,根据可靠性保证,消息只有被写入到所有同步副本后才被认为是已提交的。但如果只有一个同步副本,如果其不可用,则数据丢失。
要确保已提交的数据被写入不止一个副本,需要将min.insync.replicas设置大一些,比如2,即至少要存在两个同步副本才能向分区写入数据。
如果只有一个副本不可用,不会有什么问题,但是如果两个副本都变为不可用,则broker就会停止接收生产者的请求。