讲一讲 kafka 的主从同步机制,讲一讲它的高可用机制。
kafka 对于每一个 topic 而言,有多个分区 partition,在配置中可以设定一个分区有几个复制,在这些复制节点中,需要选出一个 leader 节点,其余的为备份节点。toptic 的所有分区的 leader 节点会均匀的分布在不同的 broker 中,它们的备份节点也会均匀的分布在不同的 broker 中,以避免单一的 leader 宕机从而引起 partition 的所有节点失效。
Kafka 分配复制节点的算法如下:
producer 发送消息到某一 partition 时,leader 会将消息进行写入,从节点会从主节点来获取数据进行备份,每一个分区的 leader 都会维护一个 ISR 集合,集合中的各从节点都保持着与主节点消息的同步,当所有 ISR 从节点写入成功(为了提高效率从节点只是获取消息,并没有将其写入到磁盘中)后会向主节点发送一个 ack 通知,当所有从节点都 ack 后,主节点才会向 producer 发送 commit ,只有被 commit 的消息,customer 才能从 leader获取。如果 ISR 中的一个节点长时间没有从主节点拉取数据,或者落后主节点太多条数据达到一定时间的话就会被移除出 ISR 集群,等到它恢复正常后才会被重新加入。如果 leader 出现故障的话会从 ISR 集合中选举一个新的 leader 从而保证可用性。
replica.lag.time.max.ms 如果 follower 卡住超过这个时间不发送 fetch 请求,会被踢出 ISR 集合,新的增强逻辑是,在 follower 落后 leader 超过 eplica.lag.max.messages 条消息的时候,不会立马踢出 ISR 集合,而是持续落后超过 replica.lag.time.max.ms 时间,才会被踢出。
Kafka 会维护一个 ISR(副本同步队列),该队列中维护的副本是和 leader 服务器高度保持一致的。如果 leader down 机,首先会从 ISR 集合里面选举一个 leader 节点。
当 kafaka 的 leader 节点获取到数据的时候,会将信息发送给它的 flower 节点,然后等待 flower 节点进行 commit 操作,只要 flower 节点 commit,那么数据就不会丢失。