GaussDB(DWS)智能运维框架-调度框架实现原理介绍
【摘要】 GaussDB(DWS)目前集成了大量运维操作,包括扩容、巡检、备份等,这些运维操作通常会与用户业务需求产生冲突,占用部分用户资源,因此,如何协调运维操作与用户业务,逐渐成为GaussDB(DWS)良性发展的关键议题。本文将针对GaussDB(DWS)内调度器的底层运作原理进行简单说明。
随着GaussDB(DWS)的快速发展,GaussDB(DWS)目前集成了众多运维操作,其中大部分运维操作均需占用用户资源,如IO、Mem、CPU、网络、磁盘空间等,且无法依据用户业务负载,自动调整运维负载,因此,如何协调不同运维操作与用户业务之间的资源分配,成为了关键问题。
为解决这个问题,GaussDB(DWS)内设计并实现了运维任务调度器,下图描述了运维任务调度器的基本工作原理。
调度器分为客户端和服务端,通过grpc实现通信,调度器客户端的功能在此不做详细说明,可参考另一篇博文https://bbs.huaweicloud.com/blogs/257575。
调度器服务端是整个调度器的核心,主要包括几个核心模块,调度模块、业务模块、动态调度模块、静态调度模块、数据持久化模块和负载信息采集模块,其中业务模块包括业务分析模块和业务执行模块。
调度模块:调度模块主要负责客户端交互、维护调度器、拉起运维任务执行模块。
- 客户端交互:调度器服务端通过grpc与客户端进行通信,调度器启动时将占用默认端口49851,若该端口已被占用,则随机选取空闲端口,并将该端口写入配置文件。客户端启动时,将读取该配置文件,与服务端通信。
- 维护调度器:调度模块内包含一个常驻维护线程,该维护线程负责维护调度器正常执行,该维护线程通过轮询方式执行多个维护项,目前版本维护项包括:
1. 执行模块维护:轮询所有的执行模块,查看执行模块是否已经完成,若完成,则释放该执行模块。
2. 运维任务清理:清理调度器历史数据。
3. 查询调度任务:从数据库中查询当前时间节点是否有需要做的运维任务,并调用动态调度模块,依据集群资源负载情况,判断该运维任务是否可以执行。
动态调度模块:依据集群实时状态,提供调度决策,决定是否执行该运维任务。
- 通常情况下,用户在注册运维任务时,会配置该运维任务执行的时间窗。调度器会从时间窗开始的时间点,调用动态调度模块,判断该运维任务是否可以执行,若不可以执行,则进行下一次轮询判断,若可以执行,则拉起运维任务对应的执行模块。
执行模块:负责运维任务的执行。
- 调度器可同时执行多个运维任务,每个运维任务对应一个单独的执行模块,执行模块之间未实现资源隔离,执行模块之间会争抢集群资源。当执行模块被拉起以后,执行模块从数据库中读取对应的作业,并执行该作业。在执行模块执行完以后,执行模块退出,并等待调度模块执行清理操作。
分析模块:负责运维任务的分析。
- 在用户注册运维任务以后,分析模块将该运维任务拆分为多个作业,并分析每个作业的IO、CPU、MEM负载、执行时长预估等信息,作业信息为静态调度和动态调度提供了调度依据。
静态调度模块:依据集群历史信息,提供静态调度策略。
- 相比于动态调度策略,静态调度策略仅依据集群历史负载信息,对运维任务进行粗略的调度,该运维任务真正被调起的时间实际取决于动态调度。静态调度的意义是,粗略估计运维任务的执行时间,判断用户提供时间窗是否合理。
数据持久化模块:调度器通过调用libpq.so.5.5动态库与gauss内核进行通信。相比于gsql,libpq的通信方式更轻量。
采集模块:负责采集集群信息。
- 采集模块目前仅包括两个采集项,集群IO负载和集群网络负载,其中IO负载通过读取gs_wlm_instance_history实现,网络负载通过读取视图pgxc_comm_status实现。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)