这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战
在 Kafka 中,副本是针对分区而言的。Kafka 管理着若干个 Topic,每个 Topic 有若干个分区,每个分区若干个副本(Replica)。
Kafka 中的副本,最重要的作用是提供数据存储的冗余,以提高系统的可用性,即使个别 Broker 宕机,系统也能继续运转,对外提供服务。
在 Kafka 中,一个分区的若干个副本,总共分成两类。一种是 Leader 副本,对外提供服务,包括消息的读和写(也就是消费和生产请求),另一种是 Folower 副本,同步 Leader 副本的消息。这里值得注意的是,Kafka 中分区的 Folower 副本是不对外提供服务的,也就是,虽有的读写请求都是由 Leader 副本来处理的,Folower 副本只负责异步地拉去消息,并追加到自己的日志中,实现数据同步。
在其他的一些分布式系统中,可以通过副本机制实现读写分离,或者就近访问节点的特性,从而提高吞吐量、将低延迟。但是,Kafka 的副本机制并不提供这样的特性。
Kafka 有其自己的考虑。
第一,Kafka 希望实现 Read-your-writes,也就是,当生产者向 Kafka 发送一个消息并成功写入之后,消费者可以立即读取到这个消息。假设,消费者可以从一个 Folower 副本拉取消息,那么要等到刚刚发送的消息同步到相应的副本之后,消费者才能拉取到。
第二,这样更容易实现单调读(Monotonic Reads),也就是,对于消费者端而言,任何消息都不会出现一会儿存在一会儿不存在的情况。假设,Kafka 提供了读写分离的特性,那么,由于不同副本同步进度不一致,如果消费者从多个 Folower 副本读取消息,那么,就会出现同一条消息在一个副本存在,而在另一个副本不存在的情况。