【kafka源码】kafka分区副本的分配规则(1)

本文深入探讨了Kafka分区副本的分配规则,通过代码分析展示了如何在不同场景下,如不同Broker列表、分区数和副本数下,进行副本分配。通过单元测试解释了分配过程,并提及了分区扩容时的分配策略。此外,提到了有机架方式的分配方法,以及在实际分配中,Broker列表顺序对结果的影响。
摘要由CSDN通过智能技术生成

if (currentPartitionId > 0 && (currentPartitionId % brokerArray.length == 0))

nextReplicaShift += 1

val firstReplicaIndex = (currentPartitionId + startIndex) % brokerArray.length

val replicaBuffer = mutable.ArrayBuffer(brokerArray(firstReplicaIndex))

for (j <- 0 until replicationFactor - 1)

replicaBuffer += brokerArray(replicaIndex(firstReplicaIndex, nextReplicaShift, j, brokerArray.length))

ret.put(currentPartitionId, replicaBuffer)

currentPartitionId += 1

}

ret

}

//主要的计算间隔数的方法

private def replicaIndex(firstReplicaIndex: Int, secondReplicaShift: Int, replicaIndex: Int, nBrokers: Int): Int = {

val shift = 1 + (secondReplicaShift + replicaIndex) % (nBrokers - 1)

(firstReplicaIndex + shift) % nBrokers

}

  1. 从 broker.list 随机选择一个 Broker,使用 round-robin 算法分配每个 partition 的第一个副本;

  2. 对于这个 partition 的其他副本,逐渐增加 Broker.id 来选择 replica 的分配。

  3. 对于副本分配来说,每经历一次Broker的遍历,则第一个副本跟后面的副本直接的间隔+1;

从代码和描述来看,可能理解不是很简单,但是下面的图我相信会让你非常快速的理解;

我们稍微在这段代码里面节点日志

在这里插入图片描述

然后写段单元测试,执行一下,看看分配过程

Broker列表{0,1,2,3,4} 分区数 10 副本数3 起始随机BrokerId=0; 起始随机nextReplicaShift=0

@Test

def testReplicaAssignment2(): Unit = {

val brokerMetadatas = (0 to 4).map(new BrokerMetadata(_, None))

AdminUtils.assignReplicasToBrokers(brokerMetadatas, 10, 3, 0)

}

输出:

起始随机startIndex:0;起始随机nextReplicaShift:0

(p-0,ArrayBuffer(0, 1, 2))

(p-1,ArrayBuffer(1, 2, 3))

(p-2,ArrayBuffer(2, 3, 4))

(p-3,ArrayBuffer(3, 4, 0))

(p-4,ArrayBuffer(4, 0, 1))

变更nextReplicaShift:1

(p-5,ArrayBuffer(0, 2, 3))

(p-6,ArrayBuffer(1, 3, 4))

(p-7,ArrayBuffer(2, 4, 0))

(p-8,ArrayBuf

  • 11
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值