一、服务端分区多副本机制
Kafka为分区引入了多副本机制,通过增加副本数量可以提升容灾能力,同一分区的不同副本中保存的是相同的消息,副本之间是一主多从的关系,其中leader副本负责处理读写请求,follower副本只负责与leader副本的消息同步。副本处于不同的broker中,当leader副本出现故障时,从follower副本中重新选举新的leader副本对外提供服务。Kafka通过多副本机制实现了故障的自动转移。
二、客户端容灾
Kafka消费端也具备一定的容灾能力,Consumer使用拉的模式从服务端拉取消息,并且保存消费的具体位置,当消费者宕机后恢复上线时可以根据之前保存的消费位置重新拉取需要的消息进行消费,这样就不会造成消息的丢失。
三、分区数据同步
分区中的所有副本统称为AR,所有与leader副本保持一定程度同步的副本(包括leader副本在内)组成ISR。与leader副本同步滞后过多的副本(不包括leader副本)组成OSR,因此AR=ISR+OSR。在正常情况下,所有的follower副本都应该与leader副本保持一定程度的同步,即AR=ISR,OSR集合为空。
HW是高水位的缩写,它表示一个特定的消息偏移量,消费者只能拉取到这个offset之前的消息。
LEO它标识当前日志文件中下一条待写入消息的offset,分区ISR集合中的每个副本多会维护自身的LEO,而ISR集合中最小的LEO即为分区的HW,对消费者而言,只能消费HW之前的消息。由此可见,kafka的复制机制既不是完全的同步复制,也不是单纯的异步复制。同步复制要求所有能工作的follower副本都复制完,这条消息才会被确认为已成功提交,这种复制方式极大的影响了性能。而在异步复制方式下,如果follower副本还没有复制完而落后于leader副本,突然leader副本宕机,则会造成数据丢失。使用ISR的方式有效的权衡了数据可靠性和性能之间的关系。
Kafka 的多分区(Partition)以及多副本(Replica)机制有什么好处呢?
- Kafka 通过给特定 Topic 指定多个 Partition, 而各个 Partition 可以分布在不同的 Broker 上, 这样便能提供比较好的并发能力(负载均衡)。
- Partition 可以指定对应的 Replica 数, 这也极大地提高了消息存储的安全性, 提高了容灾能力,不过也相应的增加了所需要的存储空间。