1.5.1 Replica 及其分配
Last updated
Last updated
根据前面创建过程的梳理,对于 Topic / Partition / Replica 这些概念我们已经有了基本的认识:
简单来说,Kafka会将一个Topic分成许多不同的分区(partition),并且以分区为单位进行副本(replica)的拷贝,以此提供数据冗余,达到容错、抗灾的效果。
基于此,一个简单的想法是:你显然不能把同一个分区的多个副本放置在同一个服务器(broker)上,不然假如这台服务器宕机,这几个分区副本跟着一起完蛋,达不到我们所想要的“抗灾”的效果。
一个好的副本分配方法是:将不同分区的副本均匀地(Kafka原文:evenly )分配在不同的服务器上,并且确保一台服务器最多只拥有一个分区的一个副本,同时为了便于管理,我们可以规定每个分区的副本数量应该相同。
那么Kafka中是如何体现这一点的呢?实际上我们之前在 Topic 创建过程(上)
里已经提到过了,副本的分配大致分为两种途径,一种是用户指定的分配方式,一种是用户未指定的分配方式,就这两种方式而言,Kafka都会对要求上述提到的副本均匀分配的条件得到满足。
如果用户指定了分配方式,那么Kafka会进行检查:
如果用户没有指定分配方式,那么Kafka会以一种很基础的方式确保均匀分配:round-robin + increasing shift 简单来说就是在服务器列表中随机初始值和固定参数,每次以加上固定参数并取模的方式决定分配:
基于此,Kafka可以确保它的副本机制是真的具有数据冗余的功效,而不是几个follower节点在那里愉快地“打白工”。