本博客欢迎转发,但请保留原作者(@孔令贤HW)信息!内容系本人学习、研究和总结,如有雷同,实属荣幸!
1 python中的元类
今天偶尔得空学习openstack,就随便找来一个类看,nova/manager.py中的Manager类,类的第一行就看不懂了:
__metaclass__ = ManagerMeta
由于自己的编程语言是java,对于python中有些技巧还不熟悉,于是google之,顺便学习了python中的元类(Metaclasses),不懂的朋友可以看这个:http://www.cnblogs.com/coderzh/archive/2008/12/07/1349735.html。而在Manager的元类中除了初始化对象外,还做了如下操作:
即:如果对象中某个属性值中有’_periodic_task’属性为true,就把该属性名和属性本身加入_periodic_tasks变量。而_periodic_tasks是干啥的?
2 _periodic_tasks是什么?
带着疑问大致过了下Manager类,发现有如下方法引用了_periodic_tasks变量:
在该函数中,从_periodic_tasks中拿到task并运行。看来task应该是一个函数。
通过看manager.py文件可知,该文件除了Manager类外,还有一个继承自Manager类的SchedulerDependentManager类,以及一个装饰器periodic_task,巧的是,SchedulerDependentManager类的方法_publish_service_capabilities就用到了该装饰器。那么我们来看一下periodic_task。
3 装饰器periodic_task
这里看到了_periodic_task,熟悉吧,回头看一下第一节可知,如果函数被装饰器装饰,那么就被加入到_periodic_tasks中,即:SchedulerDependentManager类的方法_publish_service_capabilities被加入到了_periodic_tasks变量中并在某一时刻被执行。我们先来看这个函数干了什么吧。
4 _publish_service_capabilities干了什么?
众所周知,openstack各个组件之间是通过实现AMQP协议的消息队列通信,我们看到函数中向nova-scheduler发送了消息,调用nova-scheduler的对应函数处理,其中的参数看名称应该能猜到大致的意思,service_name服务名称,host表示主机,last_capabilities应该是某种信息。
对函数功能猜想:nova-scheduler是nova中负责调度的组件,用于在创建虚拟机或创建卷时根据策略选择主机,而选择的依据,对于创建虚拟机来讲不难猜出应该就是主机的资源(CPU、内存等),而资源数据从哪来?数据库?还是各个主机定时上报?从功能上来讲,_publish_service_capabilities的行为更符合第二种。但资源的上报不可能只运行一次,应该是个周期行为,从装饰器的名称上也能看出来。那么periodic_tasks这个函数是什么时候被循环调用的呢?我想应该是在Manager所属的服务(对于创建虚拟机来说,就是nova-compute)初始化时。
5 验证猜想
我们来到nova-compute初始化的地方(在我以前的文章中有对nova初始化的分析),在nova/service.py中Service类的start方法里看到了如下实现:
看到了!periodic_tasks方法果然是在循环中被调用。来看下Manager的继承关系:
6 上报了什么以及如何上报?
虽然猜想是对的,但目前我们仍然不知道,_publish_service_capabilities到底给nova-scheduler上报了什么内容。回头看_publish_service_capabilities方法的逻辑:当last_capabilities变量有内容时才上报。而对last_capabilities变量的修改动作发生在同一个类的另外一个方法:update_service_capabilities。那么,什么地方调用了update_service_capabilities了呢?
我想到了eclipse中万能的搜索功能,哈哈,找到了:
双击来到ComputeManager类:
有没有什么内容是非常熟悉的?
对了,_report_driver_status这个函数也是被periodic_task装饰器修饰,而这个函数又是Manager(父类)的方法,那么,该函数也是被循环调用的。
我们先来理一下思路:
首先,nova-compute服务启动时,启动了一个自定义的定时器,每隔固定的时间(可以通过配置文件配置)就运行一次。在每次的运行过程中,会调用一些方法。而_report_driver_status方法和update_service_capabilities方法是其中的两个,并且_report_driver_status方法可以触发update_service_capabilities方法真正执行动作,向nova-scheduler上报内容。
7 _report_driver_status
好了,大的流程清楚了,我们就来详细看看上报信息中的capabilities到底是什么东西?
由上面的代码截图可知,capabilities是由ComputeManager类的driver对象的get_host_stats方法得到。而driver即是虚拟化实现类,比如nova/virt/libvert/driver.py中的LibvertDriver类,找到方法实现:
接着跟进同一个文件中的HostState类:
呜呼~~真相大白!不用我说,上面的代码已经很清楚的说明了上报的内容。
8 总结
以前我一直以为openstack是两层架构,多个节点,松耦合,一个共享DB的系统。因为有共享DB的存在,不同节点的信息沟通(注意:这里我指的不是接口调用)只需访问数据库即可。对应到资源,我原本以为是计算节点定期将自己的信息写入DB,而scheduler在调度时从DB中读取资源数据即可。
然而通过以上的分析,发现是将对DB的压力转移到了nova-scheduler进程,通过消息队列来进行信息的传递。因为没有大规模集群,所以对于当节点数目上去之后,消息队列以及nova-scheduler进程能不能支撑如此频繁调用和如此大的数据量,我给不出结论,算是留一个问题吧。
而对于数据库的话,目前应该有很多减轻压力的解决方案来应对上面的情况,因为我对数据库是个白痴,因此不做分析。
另外,对于openstack使用的这种定时任务的机制,是非常值得我们学习、理解和使用的。
本博客欢迎转发,但请保留原作者(@孔令贤HW)信息!内容系本人学习、研究和总结,如有雷同,实属荣幸!
相关推荐
总的来说,Node.js的源码分析涵盖了事件循环机制、V8引擎的使用、模块系统的设计、异步I/O的实现等多个方面。深入学习这些内容,不仅可以帮助开发者更好地利用Node.js,还能为他们提供宝贵的系统级编程经验。通过...
综上所述,Mybatis源码分析涵盖了大量的知识点,包括设计思想、架构组件、缓存机制、事务处理以及与Spring的整合等。通过深入源码的学习,开发者能够更加精准地掌握Mybatis的内部机制,以及如何在实际项目中高效地...
"由浅入深"意味着这份资源适合不同水平的开发者,从初学者到有经验的程序员,都能从中受益。 描述中的"hibernate开发实例源码"进一步强调了这份资料以代码实践为主,帮助读者通过实际操作来学习和理解Hibernate。...
汇聚了原创性小程序源码、精品小程序源码及分析、由浅入深的系列精品教程.zip
蚂蚁课堂第5期全套学习视频 + 源码 java由浅入深,java基础 ssm框架 springboot+springcloud微服务,mq消息队列,docker等等一系列的视频教程 蚂蚁课堂5期全套学习视频 + 源码 蚂蚁课堂5期全套学习视频 + 源码
由浅入深探究mysql索引结构原理、性能分析与优化
第2章 ZooKeeper之序列化组件源码解析【透视现象,直击本质】 第4章 持久化【高手过招必备】 第6章 服务器启动 【由浅入深,先学好单机版,才能掌握集群版】 第7章 会话管理 【无处不在的会话其实没那么难】 第8章 ...
手写mybatis框架源码 不借助其他任何框架,从最底层开始着手,用最简单的代码,将mybatis的底层框架,手写出来,让你对mybatis有一个更加深刻和直观的理解 详见:...
我们汇聚了原创性小程序源码、精品小程序源码、由浅入深的系列教程供大家学习参考,也希望更多的同学加入我们。 我们会一直更新维护这个仓, 同时也欢迎更多的微信小程序开发者将自己常用的工具、学习资料、学习心得...
这是Mybatis由浅入深的第3节源码。 动态SQL是Mybatis的亮点功能之一,解决了根据不同条件拼接SQL的繁琐痛苦问题,避免了java代码和sql混在一起,是非常常用的功能,也是本人非常喜欢的功能,点赞! 通过本源码您将...
本篇文章主要探讨了两种基本的时频分析方法:短时傅里叶变换(STFT)和连续小波变换(CWT),并提供了相应的源码范例。 首先,让我们来看看STFT的实现。STFT通过在信号上滑动窗口并进行傅里叶变换来获得局部频率...
由浅入深吃透 Docker,资源失效留言,包你满意
源码分析可以帮助你理解MyBatis是如何动态地生成SQL,执行查询,并将结果映射到Java对象的。 在教程资料中,教案部分通常会详细讲解SpringMVC和MyBatis的原理,包括它们的核心概念、配置、使用方法以及最佳实践。...
这有助于提高模型的性能,特别是在处理序列数据、自然语言处理和图像分析等复杂任务时。 【Matlab中的注意力机制实现】 在Matlab中,我们可以构建一个包含注意力层的神经网络模型。首先,需要导入必要的数据集和...
JavaScript的继承机制是其面向对象编程的一个核心特性,但与其他面向对象语言相比,JavaScript的实现方式有所不同,且存在一些挑战。下面将详细讲解JavaScript继承的几种常见方式,并结合`simple-inheritance`库的...
### 传智播客SpringMvc+Mybatis由浅入深视频教程及课程源码资料 #### Spring MVC **Spring MVC**是Spring框架的一个模块,它实现了Model-View-Controller(MVC)架构模式,用于构建Web应用程序。Spring MVC提供了...
计算机软件-编程源码-由浅入深学习ASP.zip
Java并发包源码分析(JDK1.8):囊括了java.util.concurrent包中大部分类的源码分析,其中涉及automic包,locks包...对每个类的核心源码进行详细分析,笔记详细,由浅入深,层层深入,带您剖析并发编程原理
7. 源码分析:部分视频可能会涉及SpringMVC和MyBatis的源码解读,帮助学习者理解其内部工作原理。 通过这套视频教程的学习,开发者不仅可以掌握SpringMVC和MyBatis的基本使用,还能进一步提升对Java Web开发的理解...