如需转载,请标明原文出处以及作者

陈锐 RuiChen @kiwik

*2015/2/4 22:44:22 *


写在最前面:

这段时间连续改了几个scheduler和resource_tracker相关的bug,仔细的读了一下相关的代码,一点感受分享给大家。

代码基线:Kilo

混乱中求秩序

compute_node在nova中是一个很神奇的东西,在不同的上下文中有不同的名字,本身还和Service存在复杂的关系。

数据库中有两张表services和compute_nodes,分别代表了以下两个概念:

  1. services: 一个nova的基本进程单元,例如:nova-compute, nova-conductor, nova-scheduler等等。大规模部署的时候,可能在不同主机(hostname)存在多个相同名称(binary)的进程存在,为了标识不同的进程,使用了(CONF.host, binary)作为唯一键。

  2. compute_nodes:从nova-scheduler的角度看,是最小的调度(schedule)单元,从nova-compute的角度看,是计算资源的拥有者。

Host API

先从API说起,有一组host相关的API,host-list, host-update等等。

  • host-list:听名字以为是列出了所有的compute_node,其实是列出了所有部署了nova进程的host,在这里host代表了service,功能和service-list一致,包括数据都是从Services表中获取的,可以完全用service-list取代。

  • host-describe:相对来说比较独特的host API了,显示了计算节点上资源的使用情况,包括:总量(total),当前使用量(used_now)和每个租户的使用量(project)。在这里host又代表的是compute_node。

  • host-update:包括两个功能,enable/disable host和设置host维护状态。可以认为是Xen driver的特有API,因为其他的driver都没有实现。enable/disable host功能和enable/disable service功能一致。需要提到的是Xen driver的设置host维护状态,触发维护态之后,Xen driver会将这个host上的所有instance,通过XenAPI迁移到相同资源池(aggregate)的其他host上。

  • host-action:设置host的power状态,可以输入的参数有startup/reboot/shutdown,KVM/VMware一个都没有实现,Xen/HyperV实现了reboot和shutdown,没有实现startup,嘿嘿,原因你懂的。

对象模型

再来看一下nova内部的对象模型。

nova-compute

  • ResourceTracker:每一个ResourceTracker对象是DB中一个compute_node的内存映射,保存了计算资源的使用情况,包括:cpu,ram,local_gb,pci,numa_topology等。在定时任务中和DB数据同步。在nova-compute中compute_node名叫ResourceTracker。

  • ComputeManager:通过self._resource_tracker_dict缓存了所有被当前nova-compute进程管理的ResourceTracker对象,Libvirt、Xen、HyperV这类driver每一个nova-compute管理一个compute_node,VMmare和Ironic可以一个nova-compute管理多个compute_node,VMware driver下一个compute_node对应一个VMware的集群,Ironic driver下表示一个物理服务器。

所以我们经常说到的“主机(host)有多少剩余资源?”,其实更准确的描述应该是“compute_node有多少剩余资源?”。因为在VMware的场景下,一个compute_node是包括多台host的cluster。

nova-scheduler

  • HostState:compute_node在nova-scheduler进程中的表示形式,从DB的compute_nodes中构造,表示了compute_node的资源使用情况,以(hostname, hostname)为key缓存在HostManager的host_state_map中,并在合适的时候从DB中同步。在nova-scheduler中compute_node名叫HostState。

  • HostManager:在host_state_map保存所有的HostState。

同理,“nova-scheduler没有为instance选到合适的主机(host)”,应该是“nova-scheduler没有为instance选择到合适的compute_node”。

说到这里,自己都觉得自己像是孔乙己,在给大家讲“茴字的四种写法”,呵呵。但是仔细想想,用host指代compute_node,在KVM driver下可能是适用的,但是在VMware driver下呢?如果一定要给nova中的host和node做一个明确的区分的话,host可以认为是nova-compute进程运行的主机,而node是instance运行的主机。

和Service的关系

数据库中的compute_nodes表存在一个service_id列指向对应的nova-compute的services表记录。Kilo版本的BP detach-service-from-computenode 解除了两者之间的外键关联,更加明确了service和compute_node的定位,解耦之后两者通过CONF.host关联。

数据库services表中的记录是在进程启动的时候插入的,并以(CONF.host, binary)为唯一键,而compute_nodes表是在ResourceTracker.update_available_resource时插入的,以(CONF.host, nodename)为唯一键。

nodename=hypervison_name

HostState = compute_node, host aggregate metadata 对hoststate 过滤,所以,host aggregate可以对compute node过滤也就可以对ironic的node过滤?

错了,加入 host aggregate时时用host,但host status的aggregate metadata是从该host status(node)所属的host上的metadata得来的。

            host_state.update(compute,
dict(service),
self._get_aggregates_info(host),
self._get_instance_info(context, compute)) def _get_aggregates_info(self, host):
return [self.aggs_by_id[agg_id] for agg_id in
self.host_aggregates_map[host]]

(转)Nova中的compute_node的更多相关文章

  1. Nova中的系统状态分析

    系统状态 作者 孔令贤 Nova提供这么几个资源状态的查询. Service Nova中的service有两类,一类是所谓的control service,一类就是compute service.要想 ...

  2. 玩转Openstack之Nova中的协同并发(二)

    玩转Openstack之Nova中的协同并发(二) 昨天介绍了Python中的并发处理,主要介绍了Eventlet,今天就接着谈谈Openstack中Nova对其的应用. eventlet 在nova ...

  3. 玩转Openstack之Nova中的协同并发(一)

    玩转Openstack之Nova中的协同并发(一) 前不久参加了个Opnstack的Meetup,其中有一个来自EasyStack的大大就Nova中的协同并发做了一番讲解,有所感触,本想当天就总结一下 ...

  4. Nova中的Hook机制

    Nova的代码中支持Hook机制,也就是在某些函数的前后,可以加入自己的代码逻辑.Hook代码可以完全独立于Nova开发,本质上使用setuptools的entry points机制.K版本的Open ...

  5. OpenStack 企业私有云的若干需求(1):Nova 虚机支持 GPU

    本系列会介绍OpenStack 企业私有云的几个需求: 自动扩展(Auto-scaling)支持 多租户和租户隔离 (multi-tenancy and tenancy isolation) 混合云( ...

  6. nova分析(7)—— nova-scheduler

    Nova-Scheduler主要完成虚拟机实例的调度分配任务,创建虚拟机时,虚拟机该调度到哪台物理机上,迁移时若没有指定主机,也需要经过scheduler.资源调度是云平台中的一个很关键问题,如何做到 ...

  7. Openstack之Nova创建虚机流程分析

    前言        Openstack作为一个虚拟机管理平台,核心功能自然是虚拟机的生命周期的管理,而负责虚机管理的模块就是Nova. 本文就是openstack中Nova模块的分析,所以本文重点是以 ...

  8. OpenStack中Keystone的基本概念理解

    原文http://www.kankanews.com/ICkengine/archives/10788.shtml Keystone简介 Keystone(OpenStack Identity Ser ...

  9. KVM 介绍(7):使用 libvirt 做 QEMU/KVM 快照和 Nova 实例的快照 (Nova Instances Snapshot Libvirt)

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

随机推荐

  1. EasyNVR智能云终端硬件使用说明(EasyNVR无插件直播服务硬件的具体使用方法)

    问题背景 随着EasyNVR硬件版本(EasyNVR硬件云终端)的发布不少客户选择了EasyNVR云终端作为产品选择,在客户收到EasyNVR云终端的时候肯定都有一个疑问,那就是如何使用手头上的这个小 ...

  2. 常见的.NET面试题(130)

    1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有成员, 在类的内部才可以访问. protected : 保护成 ...

  3. [Node.js] require背后的故事

    前言 熟悉Node.js的肯定对下面的代码熟悉 var http = require('http'); 这段代码很好理解,就是加载一个http模块.但是你有没有想过为什么要这么写?这其中的缘由是什么呢 ...

  4. Linux学习拾遗

    一.安装iso文件 首先建立一个目录作为挂载点:# mkdir /mnt/iso 获得root权限然后使用下面的参数挂载ISO映像文件:# mount -t iso9660 /path/image.i ...

  5. 高德地图API使用

    1.根据地址找经纬度/修改经纬度 marker.setPosition(result.geocodes[0].location); map.setCenter(marker.getPosition() ...

  6. 数据库时间类型和 util 包下时间类型转换

    Java 中的类型 1. java.sql 包下给出三个数据库相关的日期时间类型,分别是 java.sql.Date, 表示日期,只有年月日,没有时分秒. java.sql.Time, 表示时间, 只 ...

  7. win7安装composer

    安装前请务必确保已经正确安装了 PHP.打开命令行窗口并执行 php -v 查看是否正确输出版本号. 开始安装前需要把open_ssl扩展打开 打开命令行并依次执行下列命令安装最新版本的 Compos ...

  8. MySql 自适应哈希索引

    一.介绍 哈希(hash)是一种非常快的查找方法,一般情况下查找的时间复杂度为O(1).常用于连接(join)操作,如Oracle中的哈希连接(hash join). InnoDB存储引擎会监控对表上 ...

  9. linux c编程:System V消息队列一

    消息队列可以认为是一个消息链表,System V 消息队列使用消息队列标识符标识.具有足 够特权的任何进程都可以往一个队列放置一个消息,具有足够特权的任何进程都可以从一个给定队列读出一个消息.在某个进 ...

  10. python中的逻辑操作符

    python中主要有三个逻辑操作符,分别是:and.or.not. and:且,所有人为真才为真. or:或,一个为正就是真. not:非,取反. >>> print(3>2 ...