当前位置: 首页 > news >正文

云计算Openstack 虚拟机调度策略

OpenStack的虚拟机调度策略是一个复杂而灵活的系统,它主要由两种调度器实现:FilterScheduler(过滤调度器)和ChanceScheduler(随机调度器)。以下是对这两种调度器及其调度策略的详细解释:

一、FilterScheduler(过滤调度器)

FilterScheduler是OpenStack默认的调度器,它实现了基于主机过滤(filtering)和权值计算(weighing)的调度算法。

  1. 主机过滤(filtering)
    • FilterScheduler通过一系列过滤器(filters)来筛选满足虚拟机需求的计算节点。这些过滤器包括但不限于:
      • RetryFilter:刷掉之前已经调度过的节点,避免重复调度。
      • AvailabilityZoneFilter:根据可用域(Availability Zone)来筛选计算节点,提高容灾性和隔离服务。
      • RamFilter:根据可用内存来筛选计算节点,确保虚拟机有足够的内存资源。
      • DiskFilter:根据磁盘空间来筛选计算节点,确保虚拟机有足够的磁盘资源。
      • ComputeFilter:确保只有nova-compute服务正常工作的计算节点才能被调度。
      • ComputeCapabilitiesFilter:根据计算节点的特性(如架构类型)来筛选。
      • ImagePropertiesFilter:根据所选镜像的属性(如Hypervisor类型)来筛选匹配的计算节点。
      • ServerGroupAntiAffinityFilter:尽量将虚拟机分散部署到不同的计算节点上。
      • ServerGroupAffinityFilter:尽量将虚拟机部署到同一个计算节点上。
        过滤器可以通过配置文件(如nova.conf)进行自定义和扩展,以满足不同的业务需求。
  2. 权值计算(weighing)
    • 在通过过滤器筛选后,FilterScheduler会根据一系列权重计算器(weighers)来计算剩余计算节点的权重值。
    • 权重计算器包括但不限于:
      • RAMWeigher:根据可用的RAM大小来决定计算节点的权重。
      • DiskWeigher:根据可用的磁盘大小来进行权值分配。
      • MetricsWeigher:通过主机的不同参数度量来决定主机的权值。
      • IoOpsWeigher:通过主机的IO负载来进行权重计算,默认选择负载最小的主机。
      • ServerGroupSoftAffinityWeigher:通过同一个主机组中运行的实例数进行权重计算。
    • 最终,FilterScheduler会选择权重值最高的计算节点来创建虚拟机实例。

二、ChanceScheduler(随机调度器)

ChanceScheduler是一个基于随机算法来选择可用主机的简单调度引擎。它不从任何资源审查的角度进行调度决策,而是从所有正常运行nova-compute服务的节点中随机选择一个来创建实例。这种调度策略在实际生产环境中基本上不会用到,因为它不提供资源优化和负载均衡等高级功能。

三、调度过程

  1. 获取所有主机的信息,并根据调度请求中的要求(如忽略某些主机或只调度到某些主机上)来筛选候选主机。
  2. 将筛选后的主机列表依次通过配置的所有过滤器的处理函数,过滤掉不满足相应条件的主机。
  3. 对过滤后剩余的主机列表根据配置的权重计算器进行排序,选择权重值最高的主机作为虚拟机的部署目标。

四、错误排查与监控

在OpenStack的虚拟机调度过程中,可能会出现调度失败的情况。这时,管理员需要查看相关的日志文件(如nova-conductor和nova-scheduler的日志)来排查问题。此外,OpenStack还提供了一些工具和项目(如Watcher和Congress)来帮助监控和优化云资源的使用情况。

五、配置

在OpenStack中,虚拟机的调度策略可以通过Nova组件进行配置和定制。以下是一些常见的调度策略及其配置方法:

  1. CPU过滤:确保虚拟机调度到具有特定CPU特性(例如:Intel VT或AMD-V)的主机上。
[scheduler]
allowed_filters=nova.filters.all_filters
weight_classes=nova.scheduler.filters.spice.host_cpu_weight_obj.HostCPUWeight
  1. 主机集群过滤:根据虚拟机请求的特定主机集群进行调度。
[filter_scheduler]
host_aggregate_filters=nova.filters.host_aggregate_filters.AggregateHostFilter
  1. 权重调度:通过定义权重类来调整主机选择,例如,可以根据CPU或内存资源的使用情况来调整权重。
[defaults]
scheduler_default_weights=ComputeWeight=1.0
  1. 分区调度:在多个分区(如多个数据中心)之间调度实例。
[scheduler]
driver=nova.scheduler.filter_scheduler.FilterScheduler
  1. 可用性区域:在特定的可用性区域内调度虚拟机以保护数据免受单点故障影响。
[filter_scheduler]
scheduler_available_filters=nova.scheduler.filters.standard_filters.AvailabilityZoneFilter
  1. 主机选择:根据特定条件选择主机,例如,最小内存空闲量。
[scheduler]
driver=nova.scheduler.host_manager.HostManager

这些策略可以通过修改nova.conf文件并重启相关服务来生效。根据具体需求,可以通过编写自定义的过滤器或权重类来扩展调度器的功能。

六、自定义过滤器

在OpenStack中,虚拟机调度策略可以通过自定义filter和weigher来实现,以满足不同的业务需求。

1、自定义filter

  1. 作用:
    • 自定义filter允许用户根据特定的条件或规则来筛选计算节点,从而确保虚拟机被调度到满足需求的主机上。
  2. 实现方式:
    • 用户可以通过编写自定义的Python代码来实现filter,并将其添加到OpenStack的调度器中。
    • 自定义filter需要实现特定的接口和函数,以便与OpenStack的调度框架进行集成。
  3. 示例:自定义Filter样例:TagFilter
  • 目的:
    筛选具有特定标签的计算节点。

  • 实现步骤:

    • 创建一个新的Python文件,例如tag_filter.py。
    • 在文件中导入必要的模块,并实现TagFilter类。
    • TagFilter类需要继承自OpenStack的HostFilter类,并实现host_passes方法。
    • 在host_passes方法中,编写逻辑来检查计算节点是否具有指定的标签。
  • 示例代码:

from nova.scheduler.filters import HostFilter  
from nova import objects  class TagFilter(HostFilter):  """Filter hosts by a specific tag."""  def __init__(self):  self.required_tag = 'my_custom_tag'  # 设置所需的标签  def host_passes(self, host_state, filter_properties):  """Check if the host has the required tag."""  # 获取计算节点的元数据  metadata = host_state.host_summary['nova-compute'].get('metadata', {})  # 检查标签是否存在  if self.required_tag in metadata and metadata[self.required_tag] == 'true':  return True  return False
  • 配置:
    • 将tag_filter.py文件放置在OpenStack的调度器插件目录中。
    • 在OpenStack的配置文件(如nova.conf)中,添加自定义filter到scheduler_available_filters和scheduler_default_filters中。
[scheduler]  
scheduler_available_filters = ... ,nova.scheduler.filters.tag_filter.TagFilter  
scheduler_default_filters = ... ,TagFilter

2、自定义weigher

  1. 作用:
    • 自定义weigher允许用户根据特定的权重计算规则来对计算节点进行排序,从而选择最优的计算节点来部署虚拟机。
  2. 实现方式:
    • 用户可以通过编写自定义的Python代码来实现weigher,并将其添加到OpenStack的调度器中。
    • 自定义weigher需要实现特定的接口和函数,以便与OpenStack的调度框架进行集成。
  3. 示例:自定义Weigher样例:CpuUsageWeigher
  • 目的:
    根据计算节点的CPU使用率进行排序,选择CPU使用率较低的计算节点。

  • 实现步骤:

    • 创建一个新的Python文件,例如cpu_usage_weigher.py。
    • 在文件中导入必要的模块,并实现CpuUsageWeigher类。
    • CpuUsageWeigher类需要继承自OpenStack的Weigher类,并实现weigh_objects方法。
    • 在weigh_objects方法中,编写逻辑来计算每个计算节点的CPU使用率,并根据使用率进行排序。
  • 示例代码:

from nova.scheduler.weighers import Weigher  
from nova import objects  class CpuUsageWeigher(Weigher):  """Weigh hosts by CPU usage."""  def weigh_objects(self, hosts, filter_properties):  """Weigh the hosts by CPU usage."""  weighed_hosts = []  for host in hosts:  # 假设host_state有一个方法或属性可以获取CPU使用率  cpu_usage = host.host_summary['nova-compute'].get('cpu_usage', 100)  # 默认值为100%  # 计算权重,这里简单地使用100 - cpu_usage作为权重值  weight = 100 - cpu_usage  weighed_host = objects.HostState(host=host, weight=weight)  weighed_hosts.append(weighed_host)  # 根据权重值进行排序  weighed_hosts.sort(key=lambda x: x.weight, reverse=True)  return weighed_hosts

注意:上述代码中的cpu_usage获取方式仅为示例,实际实现中需要根据OpenStack的具体实现和计算节点的监控数据来获取CPU使用率。

  • 配置:
    • 将cpu_usage_weigher.py文件放置在OpenStack的调度器插件目录中。
    • 在OpenStack的配置文件(如nova.conf)中,添加自定义weigher到scheduler_weight_classes中。
[scheduler]  
scheduler_weight_classes = ... ,nova.scheduler.weighers.cpu_usage_weigher.CpuUsageWeigher

3、配置和使用自定义调度策略

  1. 配置自定义filter和weigher:
    • 在OpenStack的配置文件(如nova.conf)中,用户需要指定自定义filter和weigher的路径和名称。
    • 通过修改scheduler_available_filters和scheduler_weight_classes配置选项,将自定义filter和weigher添加到可用的filter和weigher列表中。
  2. 使用自定义调度策略:
    • 在创建虚拟机时,用户可以通过指定特定的flavor或其他参数来触发自定义调度策略的执行。
    • OpenStack的调度器会根据配置的自定义filter和weigher来筛选和排序计算节点,并最终选择最优的计算节点来部署虚拟机。

4、注意事项

  1. 兼容性:
    • 自定义filter和weigher需要与OpenStack的版本和架构兼容,以确保其能够正确运行和集成。
  2. 性能:
    • 自定义filter和weigher的执行效率会影响虚拟机的调度速度和性能。因此,在实现自定义调度策略时,需要关注其性能表现并进行优化。
  3. 安全性:
    • 自定义filter和weigher需要保证安全性,避免引入潜在的安全漏洞或风险。
      综上所述,OpenStack提供了灵活的虚拟机自定义调度策略,允许用户根据特定的需求和条件来筛选和排序计算节点。通过配置和使用自定义filter和weigher,用户可以实现对虚拟机调度过程的精细控制和优化。

相关文章:

云计算Openstack 虚拟机调度策略

OpenStack的虚拟机调度策略是一个复杂而灵活的系统,它主要由两种调度器实现:FilterScheduler(过滤调度器)和ChanceScheduler(随机调度器)。以下是对这两种调度器及其调度策略的详细解释: 一、F…...

在 macOS 上添加 hosts 文件解析的步骤

步骤 1: 打开 hosts 文件 打开终端: 你可以通过 Spotlight 搜索(按 Cmd Space 并输入 Terminal)来打开终端。 使用文本编辑器打开 hosts 文件: 在终端中输入以下命令,使用 nano 文本编辑器打开 hosts 文件&#xff1a…...

RHCE【防火墙】

目录 一、防火墙简介 二、iptables 实验一:搭建web服务,设置任何人能够通过80端口访问。 实验二:禁止所有人ssh远程登录该服务器 实验三:禁止某个主机地址ssh远程登录该服务器,允许该主机访问服务器的web服务。服…...

基于springboot的招聘系统的设计与实现

摘 要 随着互联网时代的发展,传统的线下管理技术已无法高效、便捷的管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,国家在工作岗位要求不断提高的前提下,招聘系统建设也逐渐进入了信息化时代。…...

长度最小的子数组(滑动窗口)

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 1: 输入&#xf…...

构建灵活、高效的HTTP/1.1应用:探索h11库

文章目录 构建灵活、高效的HTTP/1.1应用:探索h11库背景这个库是什么?如何安装这个库?库函数使用方法使用场景常见的Bug及解决方案总结 构建灵活、高效的HTTP/1.1应用:探索h11库 背景 在现代网络应用中,HTTP协议是基础…...

大学英语救星!GPT助你完美解答完型填空和阅读理解

文章目录 零、前言一、再来十篇完型填空和阅读理解操作指导拍照:完型填空拍照:阅读理解 二、感受 零、前言 学习过程中,总是会遇到一些问题,但不好意思总是去麻烦问老师或同学 gpt可以帮社恐的你,解决学习问题&#…...

【linux】centos编译安装openssl1.1.1

文章目录 背景用途编译安装openssl1.1.1d测试centos的python2 ssl模块是否正常pyenv编译python3.10需要配置环境变量(必须)编译python前记得安装依赖 背景 首先, centos7 通过yum安装的openssl-devel包是1.0.2k的,这玩意儿太老了。我们选择从源码安装op…...

SpringBoot环境下的学生请假管理平台开发

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...

基于Transformer的路径规划 - 第五篇 GPT生成策略_解码方法优化

上一篇:基于Transformer的路径规划 - 第四篇 GPT模型优化 在上一篇中,我尝试优化GPT路径生成模型,但没有成功。在随机生成的测试集上,路径规划成功率只有99%左右。而使用传统的路径规划算法,例如A*,路径规划…...

项目模块十三:Util模块

一、项目设计思路 用于之后协议使用的工具类 二、静态成员函数 1、分割函数 static size_t Split(const string &src, const string &sep, vector<string> *array) string.find(const string &str, size_t pos 0) string.substr(size_t pos 0, size_t…...

10款舞台剧免费音频剪辑软件分享,你用过哪款?

在舞台剧的世界里&#xff0c;音乐是情感的传递者&#xff0c;是气氛的营造者。一个好的舞台剧&#xff0c;离不开精心剪辑的背景音乐。而选择合适的音频剪辑软件&#xff0c;就如同挑选舞台上的演员一样重要。今天&#xff0c;我们就从舞台剧音乐剪辑的角度&#xff0c;来聊聊…...

Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList

文章目录 一、Redis数据结构概述1.1 Redis有哪些数据类型1.2 Redis本质是哈希表1.3 Redis的哈希冲突与渐进式rehash1.4 数据结构底层1.4.1 简单动态字符串SDS1.4.2 双向链表&#xff08;后续已废弃&#xff09;1.4.3 压缩列表ZipList1.4.4 哈希表HashTable1.4.5 跳表SkipList1.…...

496.下一个更大元素Ⅰ

老样子&#xff0c;题目&#xff1a;496. 下一个更大元素 I - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a;代码随想录 AC代码&#xff1a; class Solution {public int[] nextGreaterElement(int[] nums1, int[] nums2) {Stack<Integer> stacknew Stack&l…...

C++类和对象上

1. 类的定义 1.1 类定义格式 • class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员&#xff1a;类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或者成员函数。…...

《图像边缘检测算法综述》

在当今的数字时代&#xff0c;图像处理技术在各个领域都发挥着至关重要的作用。其中&#xff0c;边缘检测作为图像处理中的一个关键任务&#xff0c;旨在识别图像中亮度变化显著的区域&#xff0c;进而提取出物体的轮廓和形状。边缘检测不仅是图像处理的基础技术&#xff0c;还…...

Git 使用指南:从基础到实战

Git 是目前最流行的分布式版本控制系统&#xff0c;广泛应用于软件开发、项目协作和版本管理。本文详细介绍 Git 的基础操作、工作流程、分支管理、常见问题解决方法以及进阶技巧&#xff0c;帮助开发者在日常工作中高效地使用 Git。 目录 一、Git 基础概念1.1 版本控制1.2 Git…...

新生代对象垃圾回收如何避免全堆扫描

新生代垃圾回收如何避免全堆扫描&#xff1a;通过卡表 写屏障避免全堆扫描 卡表&#xff1a; 在做YGC的时候&#xff0c;需要判断年轻代里面的对象哪些是垃圾&#xff0c;这些对象可能被老年代的对象引用&#xff0c; 这时候判断年轻代的某个对象是不是垃圾的时候&#xff0…...

[论文阅读] | 智能体长期记忆

更新记录&#xff1a; 2024.11.2 人大高瓴长期记忆综述 文章目录 人大高瓴长期记忆综述智能体与环境交互记忆的来源/形式/操作来源&#xff1a;(1)当前任务历史信息 (2)其他任务的信息 (3)外部知识形式&#xff1a;如何表达记忆的内容&#xff0c;通过(1)文本 (2)参数(训练到模…...

Vue2.0 通过vue-pdf-signature@4.2.7和pdfjs-dist@2.5.207实现PDF预览

1.安装依赖 npm install pdfjs-dist2.5.207 --savenpm install vue-pdf-signature4.2.7 --save2.在.vue文件中 script 部分引入 <script> import * as PDFJS from pdfjs-dist PDFJS.GlobalWorkerOptions.workerSrc require(pdfjs-dist/build/pdf.worker.js);//解决pdf…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...