从狭义字面上理解,机架感知的意思是Kafka会把partition的各个replicas分散到不同的机架上,以提高机架故障时的数据安全性。假如所有replicas(包括leader)都在一个机架上,那么当这个机架发生故障时,所有这个机架上的server都不能提供服务,就会发生数据丢失,而多个机架同时发生故障的概率则要小得多。
从广义上来讲,这实际上是个broker分组功能,可以将不同组的brokers分散到不同的区域中,以提高单个区域发生故障时整个集群的可用性。比如碰到有个用户,他们公司的网络分成若干个分区,他们希望当单个网络分区故障,或者跟其他分区无法通信时,Kafka仍旧能够保证正常工作,这就可以用到broker分组功能。
你可以通过修改server.properties来指定broker属于哪个特定的组(机架):
broker.rack=rack-id-n
当创建,更新或者replicas重新分布时,将会遵从分组规则,确保单个partition的所有replicas被分散到尽可能多的组内,最多会被分散到min(#racks, replication-factor) 个不同的组。
Kafka的replicas分配算法确保每个broker的leader数目都是恒定的,而不取决于如何分组。这保证了整个集群的吞吐量负载均衡。但如果不同的组被分配了不同数量的broker的话,则每个组的总备份数不一定是平均的。因为broker少的那些组将会分配到更多的replicas,这意味着这些broker会有更大的磁盘和其他用于replicas的资源开销。因此比较明智的做法是给每个组都分配相同数量的broker。