【kafka思考】最小成本的扩缩容副本设计方案,Java开发快速学习

| 3 | 1,0,4 |

| 4 | 4,1,2 |

| 5 | 2,3,0 |

| 6 | 3,0,1 |

| 7 | 0,1,4 |

| 8 | 1,4,2 |

| 9 | 4,2,3 |

  1. BrokerList 是上面的集合{0,1,2,3,4} ; 但是并不是说顺序就是这样的,只是表示有这个几个Broker参与了分配

我们把每个分区的第一个副本取出来{2,3,0,1,4,2,3,0,1,4}; 从里面获取连续5个(尾部跟头部也是相连)包含所有Broker就可以把它当成BrokerLIst顺序, 这里我们可以取 {2,3,0,1,4}也可以取{0,1,4,2,3} 都可以; 这里我们最终选BrokerList={2,3,0,1,4}在这里插入图片描述

  1. 分区数可以指定是10个; 副本数是3个

  2. 起始随机数startIndex 这个值,的获取跟上面的BrokerList有关系; 比如我们选择了BrokerList={2,3,0,1,4} ; 先看看第一个分区的第一个副本是 2;再看2在BrokerList中的第几个位置; 看到是第一个位置,那么索引值就=0;startIndex=0

  3. 起始随机nextReplicaShift 就看看前面几个分区的第一个副本和第二个副本的差值; 我们把上面的转换一下成索引位置

| 分区号 | brokerlist中索引值 | 副本1和副本2的差值 |

| — | — | — |

| 0 | 0,4,1 | 3 |

| 1 | 1,0,2 | 3(1->2->3->4->0 中间差值是2,3,4) |

| 2 | 2,1,3 | 3 |

| 3 | 3,2,4 | 3 |

| 4 | 4,3,0 | 3 |

所以起始随机nextReplicaShift=3

到这里我们已经把所有变量算出来了

  1. BrokerList={2,3,0,1,4}
  1. 分区数=10
  1. 副本数=3
  1. 起始随机数startIndex=0
  1. 起始随机nextReplicaShift=3

按照这些参数,重新调用接口AdminUtils.assignReplicasToBrokersRackUnaware 就肯定能够得到一模一样的分配数据

然后这个时候只调整副本数这个参数的话,就可以满足我们上面最小变动副本的要求了;

当然: AdminUtils.assignReplicasToBrokersRackUnaware 并不能完全满足我们需求,因为nextReplicaShift=3不是参入传入的,是在里面随机产生的,所以我们自己按照这个方法写一个新方法微一下就行了;

如果副本的分配原本是自己手动指定的,并不是kafka自动计算的,则上面方法不可用; 那么只能直接用kafka接口重新计算,完全重新分配了

在这里插入图片描述

在这里插入图片描述

如果已经进行过分区扩容

我们先回忆一下,如果进行过分区扩容,那么分区计算的并不是按照一个原则来进行分配的; 请看【kafka源码】kafka分区副本的分配规则 ; 如果还按照上面的方式来进行,那肯定达不到最小粒度的副本扩容了; 因为后面进行过扩分区的分区肯定会进行数据移动;

把之前的例子搬过来再看看;

例如我有个topic 2分区 3副本; 分配情况

起始随机startIndex:0currentPartitionId:0;起始随机nextReplicaShift:2;brokerArray:ArrayBuffer(0, 1, 4, 2, 3)

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

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

我们来计算一下,第3个分区如果同样条件的话应该分配到哪里

  1. 先确定一下分配当时的BrokerList 按照顺序的关系0->2->3 1->3->0 至少 我们可以画出下面的图

在这里插入图片描述

  1. 又根据2->3(2下一个是3) 3->0(3下一个是0)这样的关系可以知道在这里插入图片描述

  2. 又要满足 0->2 和 1->3的跨度要满足一致(当然说的是在同一个遍历范围内currentPartitionId / brokerArray.length 相等)

  3. 又要满足0->1是连续的那么Broker4只能放在1-2之间了;(正常分配的时候,每个分区的第一个副本都是按照brokerList顺序下去的,比如P1(0,2,3),P2(1,3,0), 那么0->1之间肯定是连续的; )

结果算出来是BrokerList={0,1,4,2,3} 跟我们打印出来的相符合;

那么同样可以计算出来, startIndex=0;(P1的第一个副本id在BrokerList中的索引位置,刚好是索引0,起始随机 nextReplicaShift = 2(P1 0->2 中间隔了1->4>2 ))

指定这些我们就可以算出来新增一个分区P3的位置了吧?

P3(4,0,1)

然后执行新增一个分区脚本之后,并不是按照上面分配之后的 {4,0,1} ; 而是如下

起始随机startIndex:0 currentPartitionId:2;起始随机nextReplicaShift:0;brokerArray:ArrayBuffer(0, 1, 2, 3, 4)

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

如果我又进行扩分区操作的话,还是一样的逻辑; 假如我这再次新增一个分区

BrokerList={0,1,2,3,4} 扩分区的BrokerList都是经过排序的;

currentPartitionId=3 起始随机nextReplicaShift=startIndex=第一个分区第一个副本BrokerId在BrokerList中的索引值=0

那么P3是{3,4,0}

来,执行一下看看结果

起始随机startIndex:0currentPartitionId:3;起始随机nextReplicaShift:0;brokerArray:ArrayBuffer(0, 1, 2, 3, 4)

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

那么这种情况下怎么进行分配?

如果还是想要实现我们的目标,最小成本的去扩缩副本,那么我们就需要找到是从哪个分区开始进行了 扩分区的操作

假如现在的分区

0,2,3

1,3,0

2,3,4

3,4,0

先去验证是否有冲突的地方; 比如上面3>4(3下一个是4) 3>0(3下一个是0) 就冲突了;

就可以直接去掉后面两个,再验证

0,2,3

1,3,0

是否冲突

然后根据不同情况来进行重新分配;

同时又有其他问题 比如 存在手动分配过的分区 这种不是按照固定的规则来分配的,也不能按照上面的处理, 这种就需要重新完全分配了

所以总结起来,这种思路可行, 但没有必要; 我也是写到了这里,才觉得没有必要

扩缩副本 想法2


相比第一种想法, 需要考虑过多的情况,这个想法就简单霸道多了

直接再每一个分区的最后一个副本上顺推就行了(如果是缩副本就减小)

比如5个Broker 4分区 3副本, 前面两个是创建的时候分配的,后面两个是分区扩容分配的

“0”:[0,1,4]

“1”:[1,4,2]

“2”:[4,2,3]

再扩容3个分区

“3”:[3,4,0]

“4”:[4,0,1]

“5”:[0,2,3]

副本扩容

就直接假定BrokerList[0,1,2,3,4], 然后将最后一个副本往后顺推一个可用Broker;

“0”:[0,1,4] ==》 [0,1,4,2]

“1”:[1,4,2] ==》 [1,4,2,3]

“2”:[4,2,3] ==》 [4,2,3,1]

再扩容3个分区

“3”:[3,4,0] ==》 [3,4,0,1]

“4”:[4,0,1] ==》 [4,0,1,2]

“5”:[0,2,3] ==》 [0,2,3,4]

如果都只有一个副本,那么按照分区号简单做一个排序(一般情况是按照分区号大小顺序排的), 然后得到一个BrokerList; 接着按照之前的算法重新计算就行,为啥不直接顺推出第二个位置,因为原来第一和第二副本之间会根据遍历的次数nextReplicaShift+1

副本缩小

直接从最后删除,多出来的副本

“0”:[0,1,4] ==》 [0,1]

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

总结

总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。

如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《Java核心技术》这些书籍,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。

**

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-NfEazCj8-1711090706612)]

总结

总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。

如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《Java核心技术》这些书籍,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。

[外链图片转存中…(img-djGdEaGc-1711090706613)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kafka消费者的扩缩容是指根据需求增加或减少消费者实例的数量,以适应消息处理的负载变化。下面是一种常见的Kafka消费者扩缩容的方法: 1. 增加消费者实例:当消息负载增加时,可以通过增加消费者实例来提高消息处理的并发性能。可以通过以下步骤来增加消费者实例: - 启动新的消费者进程或容器,并配置相同的消费者组ID。 - 新的消费者实例将自动加入到消费者组中,并开始从分配给该组的分区中消费消息。 2. 减少消费者实例:当消息负载减少时,可以通过减少消费者实例来降低资源消耗。可以通过以下步骤来减少消费者实例: - 停止不再需要的消费者进程或容器。 - Kafka会自动重新分配该消费者实例所消费的分区给其他活跃的消费者实例。 需要注意的是,Kafka使用分区来实现消息的并行处理和负载均衡。每个消费者实例可以被分配一个或多个分区进行消息消费。当增加或减少消费者实例时,Kafka会自动重新分配分区,以确保每个消费者实例都能够平均消费消息。 另外,为了实现消费者的扩缩容,还需要考虑以下几点: - 消费者组的配置:确保消费者组的配置正确,包括消费者组ID、消费者实例的数量等。 - 分区的数量:根据消息负载和消费者实例的数量,合理设置主题的分区数量,以便实现负载均衡和并行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值