我们使用的是kubernetes,我们需要对数据进行"智能分区"。我们想在n个运行吊舱之间将空间分开1至1000,每个豆荚都应该知道他要处理的空间的哪一部分(用于汇总分区任务(。
因此,例如,如果我们有1个吊舱,他将从1-1000处处理整个空间。
当我们扩展到3个豆荚时,每个豆荚都会获得相同的份额。
POD 1-将处理1-333
POD 2-334-667
POD 3 667-1000
现在,我们找到解决此问题的最佳方法是创建一个状态集,该设置汇总运行POD的数量及其实例号,并确定他需要处理的空间的哪一部分。Kubernetes中是否有一种更聪明/内置的方式可以以这种方式分区节点之间的空间?
服务面料具有此功能内置。
有 no 本机工具在K8S中的分区级别缩放。
仅与您在原始帖子中提出的类似的自定义解决方案。
提供另一种自定义方法以供您参考。基于此Airbnb的技术博客
给出了豆荚及其名称的列表,每个POD都能确定性地计算其应起作用的分区列表在。当我们从复制集中添加或删除POD时,POD将只需拿起更改,并处理新的分区集而是
他们如何做的是基于他们的回购。我在此处概述了关键组件(注意:存储库是用Java编写的(。
- 获取在K8S名称空间中运行多少个POD,然后按POD名称(代码(进行排序。代码段
String podName = System.getenv("K8S_POD_NAME");
String namespace = System.getenv("K8S_NAMESPACE");
NamespacedKubernetesClient namespacedClient = kubernetesClient.inNamespace(namespace);
ReplicaSet replicaSet;
// see above code link to know how to get activePods, remove it here because it is too long
int podIndex = activePods.indexOf(podName);
int numPods = activePods.size();
- 每次调用上述代码时,您都会有
podIndex
和numPods
的确定性列表。然后,使用此信息来计算此POD负责
的范围
List<Integer> partitions = new ArrayList<>();
int split = spaceRange / numPods;
int start = podIndex * split;
int end = (podIndex == numPods - 1) ? spaceRange - 1 : ((podIndex + 1) * split) - 1;
for (int i = start; i <= end; i++) {
partitions.add(i);
}
- 由于将随时更改POD的数量,因此您可能需要
executorService.scheduleWithFixedDelay
才能定期更新列表
executorService.scheduleWithFixedDelay(this::updatePartitions, 0, 30, TimeUnit.SECONDS);
这种方法不是最好的,因为如果您设置了30秒的ScheduleWithFixedDelay,则不会在30秒内捕获任何POD更改。此外,在短时间内,可能有两个POD负责同一空间,并且您需要像Airbnb Tech Blog一样在业务逻辑中处理此特殊情况。