上一节我们详细讨论了cinder-api 和 cinder-volume ,今天讨论另一个重要的 Cinder组件 cinder-scheduler
 
创建Volume 时,cinder-scheduler 会基于容量、Volume type 等条件选择出最合适的存储节点,然后让其创建Volume,下面介绍cinder-scheduler 是如何实现这个调度工作的。
 
在 /etc/cinder/cinder.conf 中,cinder通过 scheduler_driver, scheduler_default_filters 和 scheduler_default_weighers 这三个参数来配置 cinder-scheduler。(这几项在 devstack安装的rocky版本中并未找到)
 
Filter scheduler
 
Filter Scheduler 是 cinder-scheduler 默认的调度器。
 
scheduler_driver=cinder.scheduler.filter_scheduler.FilterScheduler
 
与nova一样,Cinder 也允许使用第三方scheduler,配置scheduler_driver 即可。
 
scheduler 调度过程如下:
 
    1、通过过滤器(filter)选择满足条件的存储节点(运行 cinder-volume)
    2、通过权重计算(weighting)选择最优(权重值最大)的存储节点
 
可见,cinder-scheduler 的运行机制和 nova-scheduler 完全一致。
 
Filter
 
当 Filter scheduler 需要执行调度操作时,会让Filter 对存储节点进行判断,filter 返回 True 或者 False。cinder.conf 中 scheduler_default_filters 选项指定 filter scheduler 使用的filter,默认值为:
 
scheduler_default_filters = AvailabilityZoneFilter, CapacityFilter, CapabilitiesFilter
 
Filter scheduler 将按照上面的顺序依次过滤
 
AvailabilityZoneFilter
 
为提高容灾性和提供隔离服务,可以将存储节点和计算节点划分到不同的 Availability Zone 中。例如把一个机架上的机器划分在一个Availability Zone 中。OpenStack默认有一个命名为 Nova 的 Availability Zone ,所有的节点初始都是在 Nova 中。用户可以根据需要创建自己的 Availability Zone。
 
 
 
CapacityFilter
 
创建volume 时,用户会指定volume的大小,CapacityFilter 的作用是将存储空间不能满足 volume创建需求的存储节点过滤掉。
 
CapabilitiesFilter
 
不同的volume provider 有自己的特性(Capabilities),比如是否支持 thin provision 等。Cinder 允许用户创建 volume 时通过volume type 指定需要的 Capabilities
 
volume type 可以根据需要定义若干个 Capabilities ,详细描述 volume的属性。volume type 的作用与 nova 的flavor类似。
 
 
通过 volume type 的extra specs 定义 Capabilities
 
 
Extra Specs 是用 Key-Value 的形式定义,不同的 volume provider 支持的 Extra Specs 不同,需要参考 volume provider 的文档。
 
 
上面的volume type 只有一个 Extra Specs “volume_backend_name”,这是最重要的也是必须的 Extra Specs 。
 
cinder-volume 会在自己的配置文件 /etc/cinder/cinder.conf 中定义设置 “volume_backend_name = lvmdriver-1”,其作用是为存储节点的volume provider 命名。这样 CapabilitiesFilter 就可以通过 volume type 的volume_backend_name 筛选出指定的 volume provider。
 
如果在第一步filtering 环节选出了多个存储节点,那么接下来的weighting 环节会挑选出最合适的一个节点。
 
Weighting
 
Filter Scheduler 通过 scheduler_default_weighers 指定计算权重的weigher,默认为 CapacityWeigher。
 
scheduler_default_weighers = CapacityWeigher
 
如命名所示,CapacityWeigher 基于存储节点的空闲容量计算权重值,空闲最多的胜出。
 
 

O048、掌握 cinder-scheduler 调度逻辑的更多相关文章

  1. cinder create volume的流程-scheduler调度

    创建 Volume 时,cinder-scheduler 会基于容量.Volume Type 等条件选择出最合适的存储节点,然后让其创建 Volume. 1.cinder-scheduler配置相关项 ...

  2. 掌握 cinder-scheduler 调度逻辑 - 每天5分钟玩转 OpenStack(48)

    上一节我们详细讨论了 cinder-api 和 cinder-volume,今天讨论另一个重要的 Cinder 组件 cinder-scheduler. 创建 Volume 时,cinder-sche ...

  3. quartz2.3.0(十二)通过RMI协议向Scheduler调度器远程添加job任务

    此代码示例通过RMI协议向Scheduler调度器远程添加job任务. 代码文件包括:job任务类(SimpleJob.java).RMI服务端server类(RemoteServerExample. ...

  4. scrapy 源码解析 (四):启动流程源码分析(四) Scheduler调度器

    Scheduler调度器 对ExecutionEngine执行引擎篇出现的Scheduler进行展开.Scheduler用于控制Request对象的存储和获取,并提供了过滤重复Request的功能. ...

  5. k8s入坑之路(14)scheduler调度 kubelet管理及健康检查 更新策略

    kubelet 主要功能 Pod 管理 在 kubernetes 的设计中,最基本的管理单位是 pod,而不是 container.pod 是 kubernetes 在容器上的一层封装,由一组运行在同 ...

  6. 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯云容器服务团队 源码为 k8s v1.6.1 版本,github 上对应的 commit id 为 b0b7a323cc5a4a ...

  7. quartz2.3.0(二)触发器Trigger花式Scheduler调度job

    任务类 package org.quartz.examples.example2; import java.util.Date; import org.slf4j.Logger; import org ...

  8. Golang源码学习:调度逻辑(一)初始化

    本文所使用的Golang为1.14,dlv为1.4.0. 源代码 package main import "fmt" func main() { fmt.Println(" ...

  9. Golang源码学习:调度逻辑(二)main goroutine的创建

    接上一篇继续分析一下runtime.newproc方法. 函数签名 newproc函数的签名为 newproc(siz int32, fn *funcval) siz是传入的参数大小(不是个数):fn ...

随机推荐

  1. Laravel 代码开发最佳实践

    我们这里要讨论的并不是 Laravel 版的 SOLID 原则(想要了解更多 SOLID 原则细节查看这篇文章)亦或是设计模式,而是 Laravel 实际开发中容易被忽略的最佳实践. 内容概览 单一职 ...

  2. POJ 1135 -- Domino Effect(单源最短路径)

     POJ 1135 -- Domino Effect(单源最短路径) 题目描述: 你知道多米诺骨牌除了用来玩多米诺骨牌游戏外,还有其他用途吗?多米诺骨牌游戏:取一 些多米诺骨牌,竖着排成连续的一行,两 ...

  3. 中间件 | Nginx实现动静分离

    Nginx动静分离基本概述 动静分离,通过中间件将动静分离和静态请求进行分离: 通过中间件将动态请求和静态请求分离,可以建上不必要的请求消耗,同事能减少请求的延时. 通过中间件将动态请求和静态请求分离 ...

  4. jeecg中的datagrid显示一条记录为橙色表示完结

    效果如图: 1.操作小结后面的已完结js $(document).ready(function(){ $('.datagrid-toolbar').children("span") ...

  5. Git入门之在IDEA中使用Git上传maven项目

    下载安装git客户端: 参考博文:https://www.cnblogs.com/java-maowei/p/5950930.html 在IDEA怎么使用git上传spring的maven项目详解: ...

  6. 九十:CMS系统之项目结构

    目录结构 cms模块 from flask import Blueprint bp = Blueprint('cms', __name__, url_prefix='/cms') @bp.route( ...

  7. VS Code 的插件位置更改

    --extensions-dir 你的目标文件夹 原来的目标位置:"E:\Program Files\VSCode\Code.exe" 更改后的位置:"E:\Progra ...

  8. 关于Bootstrap Table使用生成冻结窗格的表格

    参考资料 : <JS组件系列——Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案> <http://issues.wenzhixin.net.cn/bootst ...

  9. PHP SQL注入

    开发者容易遗漏的输入点: HTTP头 X-Forwarded-For   获取用户ip User-Agent            获取浏览器 Referer                  获取之 ...

  10. Redis集群的原理和搭建(转载)

    转载来源:https://www.jianshu.com/p/c869feb5581d Redis集群的原理和搭建 前言 Redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得 ...