改进集群创建时的反亲和性行为

https://blueprints.launchpad.net/sahara/+spec/improving-anti-affinity

使 Sahara 能够以更公平的方式分配节点创建,并考虑到计算硬件的亲和性。

问题描述

目前 Sahara 中的反亲和性允许反亲和性组中的节点数量等于超visor的数量 (https://bugs.launchpad.net/sahara/+bug/1426398)。

如果反亲和性组中的节点数量超过超visor的数量,Sahara 会抛出错误。

提议的变更

用户将能够在请求进程的反亲和性时定义一个比例,即每个超visor的节点数量。

如果用户选择反亲和性,该比例将是在创建集群时的一个字段。

基于用户提供的比例和节点数量,将创建更多的服务器组。

服务器组的数量将等于每个超visor的节点数量。

在 heat 模板方面,如果为该集群启用了反亲和性,服务器组将在序列化资源时创建。

实例将在序列化实例时分配到这些服务器组,使用“scheduler_hints”的“group”属性,该属性将设置为每个实例的不同服务器组,以轮询方式进行分配。

对于服务器组的分配,需要进行以下更改

  • 在 OS::Heat::ResourceGroup 资源中创建一个名为 SERVER_GROUP_NAMES 的类型为 list 的参数

  • 在此参数中存储节点组中每个实例的服务器组名称。因此,参数列表的大小将等于节点组中的实例数量。

  • 现在,索引为 i 的实例将属于 SERVER_GROUP_NAMES[i] 中存储的服务器组名称。

  • 然后将从调度器提示中访问此参数。

因此,在节点组模板中,调度器提示将如下所示:

"scheduler_hints": {
 "group": {
  "get_param": [SERVER_GROUP_NAMES, {"get_param": "instance_index"}]
 }
}

例如:

A = 超visor数量 = 5

B = 反亲和性组中的总节点数 = 10

C = 每个超visor的节点数 = 节点:超visor = 2

服务器组数量 = C = 2

节点将以轮询方式分布在每个创建的服务器组中。

但是,将任何节点放置在任何服务器组中并不重要,因为所有节点都是反亲和的。

如果用户在上述示例中给定的比例为 1,仍然会收到 nova 抛出的错误。

我们不允许使用新的比例扩展旧集群

当用户请求在比例更改后扩展集群,或请求现有集群上的新比例时,将抛出一个错误,提示“此集群是用 X 比例创建的,但现在比例是 Y。您需要重新创建”。

替代方案

数据模型影响

比例将是集群对象中的一个字段

REST API 影响

其他最终用户影响

如果用户正确定义了比例,即使反亲和性组中的节点数量超过超visor的数量,更改也将无需任何错误地配置实例。

部署者影响

开发者影响

Sahara-image-elements impact

Sahara-dashboard / Horizon 影响

是的,需要在 Sahara 控制台中添加一个用于收集比例的字段。只有在选择反亲和性时才会显示该字段。

实现

负责人

主要负责人

akanksha-aha

工作项

  • 在 Sahara 控制台中添加比例字段

  • 在 Sahara 中任何需要的地方添加相同的字段(数据访问层)

  • 添加一个新 API,在需要时创建更多的服务器组

  • 编写单元测试并运行这些测试

  • 编写文档

依赖项

测试

需要编写单元测试

文档影响

需要添加关于改进的反亲和性行为的内容

参考资料