支持分布式周期性任务

https://blueprints.launchpad.net/sahara/+spec/distributed-periodics

本规范建议添加分布式周期性任务。

问题描述

目前周期性任务在每个引擎上同时执行,因此这些任务之间的时间间隔可能非常短,并且引擎之间的负载不平衡。在引擎之间分配周期性任务可以解决这两个问题。

此外,目前我们有 2 个周期性任务用于清理集群。这些任务中的集群终止以直接终止调用的方式进行(绕过 OPS)。这种方法导致在集群终止期间特定引擎上的周期性任务停止(如果终止过程中出现问题,情况会更糟)。

此外,为了防止引擎上的额外负载,分布式周期性任务对于周期性健康检查非常重要。

提议的变更

此更改包含两部分

  • 将添加通过 OPS 终止集群的功能,用于周期性任务;

  • 将添加对分布式周期性任务的支持。

分布式周期性任务将基于 HashRing 实现和 Tooz 库,该库为一组后端提供群组管理支持 [1]。后端将通过 periodic_coordination_backend 选项进行配置。

将只有一个名为 sahara-periodic-tasks 的群组。一旦创建群组,任何协调器都可以加入该群组并成为其成员。

当引擎加入群组并构建 HashRing 时,其 ID 的哈希值将被计算,并且该哈希值决定了它将负责的数据。从这个数字到环中下一个属于不同引擎的数字之间的所有内容,现在都属于这个引擎。

唯一剩余的问题是,某些引擎在其前面会有不成比例的较大空间,这将导致它们上的负载更大。可以通过在不同的位置将每个服务器添加到环中多次来缓解这个问题。这是通过拥有副本计数来实现的(默认情况下为 40)。

HashRing 将在每次周期性任务执行之前重建,以反映协调群组的实际状态。

将添加 sahara.service.coordinator.py 模块和两个类

  • Coordinator 类将包含基本的协调和分组方法

    class Coordinator(object):
        def __init__(self, backend_url):
            ...
    
        def heartbeat(self):
            ...
    
        def join_group(self, group_id):
            ...
    
        def get_members(self, group_id):
            ...
    
  • HashRing 类将包含用于环构建和子集提取的方法

    class HashRing(Coordinator):
        def __init__(self, backend_url, group_id, replicas=100):
            ...
    
        def _build_ring(self):
            ...
    
        def get_subset(self, objects):
            ...
    

现在我们有 4 个周期性任务。对于每个任务,将列出将要分发的具体内容

  • update_job_statuses 每个引擎将获得所有作业执行的列表,但将仅根据其 ID 的哈希值更新部分作业的状态。

  • terminate_unneeded_transient_clusters 每个引擎将获得所有集群的列表,检查部分集群,并在需要时通过 OPS 请求终止。

  • terminate_incomplete_clustersterminate_unneeded_transient_clusters 相同。

  • check_for_zombie_proxy_users 每个引擎将获得用户列表,但将仅对部分用户检查是否为僵尸用户。

我们很快还将有一个用于健康检查的周期性任务。健康检查任务将在集群上执行,这些集群将以与 update_job_statuses 的作业执行相同的方式在引擎之间拆分。

如果在配置期间未提供协调后端,则周期性任务将以传统方式启动,并且不会构建 HashRing。

如果提供了协调后端,但配置错误或无法访问,则引擎将以相应的错误消息启动。

如果与协调器的连接丢失,周期性任务将停止。但是,一旦重新建立连接,周期性任务将以分布式模式执行。

为了保持与协调服务器的连接处于活动状态,将在单独的线程中定期(每 heartbeat_timeout 秒)调用 heartbeat 方法。

将启动可配置数量的线程(每个线程将是群组中的一个单独成员)来执行周期性任务。

替代方案

数据模型影响

REST API 影响

其他最终用户影响

部署者影响

应配置协调后端。

开发者影响

Sahara-image-elements impact

Sahara-dashboard / Horizon 影响

实现

负责人

主要负责人

apavlov-n

工作项

  • 添加通过 OPS 终止集群的功能,用于周期性任务;

  • 为分布式周期性任务实现 HashRing;

  • 记录周期性任务配置中的更改。

  • 使用 ZooKeeper 作为后端,将分布式周期性支持添加到 devstack

依赖项

Tooz 包 [2]

测试

单元测试、在集成测试中启用分布式周期性,并使用受支持的后端之一(例如,ZooKeeper)进行手动测试,以测试所有可用的后端 [1](受 Tooz 库支持)。

文档影响

Sahara REST API 文档将在 api-ref 中更新。

参考资料

[1]: https://docs.openstack.org/developer/tooz/compatibility.html#driver-support

[2]: https://pypi.python.org/pypi/tooz