设为首页 收藏本站
查看: 1496|回复: 0

[经验分享] 【OpenStack】Grizzly版本中Scheduler filter机制详解

[复制链接]

尚未签到

发表于 2016-1-9 11:45:48 | 显示全部楼层 |阅读模式
Grizzly版本中Scheduler filter机制详解

本博客欢迎转发,但请保留原作者信息(@孔令贤HW)!内容系本人学习、研究和总结,如有雷同,实属荣幸!
1      filters
根据不同的需求,有很多种类型的过滤方式,于是就有很多的filter,我们把这些filter类文件放置在同一个package中管理。当然,这些filter我们不可能全部用到,于是我们需要为管理员提供一种方式告诉系统他需要哪些filter,我们可以用配置文件实现。此外,我们需要两个额外的功能:
1. 我们想知道package中所有的filter
2. 因为管理员可能因为疏忽大意,在配置文件中填写了错误的类(比如把过滤主机的filter填写成了其他功能的filter,因为系统中会有很多种filter,管理员也会晕头转向),对于这些错误的配置,我们需要识别,也就是所谓的容错
2      抽象
为了完成上面两个目标,我们需要一些前提。

首先,根据面向对象的原则,具有相同特征或行为的东西,需要将他们进行抽象。对于filter而言,其作用就是过滤,因此需要有一个表示过滤的基类BaseFilter。其次,过滤根据用途也分很多种,比如主机的过滤,虚拟机的过滤等等,而对于每一种过滤又有很多方法,所以某一个用途的filter也需要抽象,比如我们有BaseHostFilter表示主机过滤,它继承自BaseFilter。最后,当然是各种主机过滤的不同实现,比如基于ram的过滤,基于vcpu的过滤等等。它们的关系图如下:
DSC0000.png
 
因此,对于任何一种filter,我们只需调用其filter_all()方法,就能获得过滤后的结果。
3      filters管理
现在我们有了一些filter类,每个filter类分别位于单独的文件中,我们将这些文件放置在一个package中。当然,我们可能有另外一个包package2,里面是另一个功能的filters,于是我们会想到要提供一种统一的方式对这些package进行管理。

同样是面向对象的原理,我们需要一个统一的类管理这种类型的package,而不用关心每个package里到底是哪种filter(我们只知道每个package中的filters都是同一类型,即继承自同一个BaseXXXFilter,进而继承自BaseFilter)。于是,利用python的语言特性,我们可以很快的写出这样的处理类,参见nova/loadables.pyBaseLoader类的实现:
DSC0001.png
 
有了基类自然就有实现类。注意BaseLoader类中有一个loadable_cls_type属性,不同的实现类需要传递不同参数。比如我们有HostFilterHandler类用来管理主机过滤包中的filter类,那么就需要初始化时传递BaseHostFilter(还记得刚才的类继承图么?)

当然,不要忘了过滤的目的,我们最好在BaseLoader类中提供一个方法get_filtered_objects(filters, objs),调用该方法完成过滤的功能。在OpenStack中,该方法是在一个继承自BaseLoader类,同时又被HostFilterHandler类继承的类(BaseFilterHandler)中实现。即:
DSC0002.png  

4      代码
以创建虚拟机调度为例,在nova-scheduler中有HostManager类,其功能主要是管理主机,当然也包括对主机进行过滤。在其初始化函数中有以下两句:
DSC0003.png
 其中:
1. HostFilterHandlerfilter管理类,位于nova/scheduler/filters/__init__.py,而nova/scheduler/filters/路径下就是主机过滤的类文件,它的初始化可以验证上面的理论。
DSC0004.png
2. 配置项scheduler_available_filters
表示管理员希望使用哪些filters。为了容错,我们调用get_matching_classes方法来排除因管理员疏忽而填错的类。

HostManager类的get_filtered_hosts方法中完成对主机的过滤:
DSC0005.png  
即:对hosts表示的每一个主机,调用filter_classes表示的每个filter处理,返回通过的hosts

具体的过滤方式是:
假如管理员配置了filter1, filter2, filter3,有三个主机host1, host2, host3。于是按照filter的顺序,假如host1host3通过了filter1,那么调用filter2时,只考虑host1host3。假如只有host1通过了filter2,则调用filter3时,仅考虑host1

本博客欢迎转发,但请保留原作者信息(@孔令贤HW)!内容系本人学习、研究和总结,如有雷同,实属荣幸!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-162146-1-1.html 上篇帖子: openstack中 虚拟机实例的备份 与 恢复 下篇帖子: 【OpenStack】G版中关于Nova的Cell
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表