OpenStack数据库远程对象模型

在OpenStack的各个服务之间有些数据库对象是远程操作的,远程对象所实现的效果是:一个 A 服务中的远程对象实例,可以由消息队列传送到B 服务,B 服务能够使用这个实例,当调用实例的方法时,实际执行这个方法却是在A 服务中。

以Instance类的实例为例,nova-conductor在收到创建虚拟机请求时生成了实例instance=Instance(),之后将instance这个数据库对象通过消息队列发送到了nova-compute,在nova-compute进行虚拟机创建的过程中,经常性地需要更改虚拟机的状态,所以经常出现类似这样的语句:

instance.task_state = task_states.XXX
instance.save()

nova-compute不直接访问数据库,这个save() 方法,就是由nova-conductor来执行的。

具体原理

以instance的save()方法为例,有一个@base.remotable修饰

(objects/instance.py ),

@base.remotable
def save(self, expected_vm_state=None,
         expected_task_state=None, admin_state_reset=False):

remotable的定义如下,根据indirection_api的定义情况:如果有定义indirection_api,则把save()方法作为一个参数fn来运行indirection_api.object_action,如果没有定义则运行save()。

(dist-packages/oslo_versionedobjects/base.py),

def remotable(fn):
    """Decorator for remotable object methods."""
    @six.wraps(fn)
    def wrapper(self, *args, **kwargs):
        ......
        if self.indirection_api:
            updates, result = self.indirection_api.object_action(
                ctxt, self, fn.__name__, args, kwargs)
            ......
        else:
            return fn(self, *args, **kwargs)

indirection_api在nova-compute服务中有赋值,而其他服务中没有:

(cmd/compute.py )

def main():
    ......
    if not CONF.conductor.use_local:
        cmd_common.block_db_access('nova-compute')
        objects_base.NovaObject.indirection_api = \
            conductor_rpcapi.ConductorAPI()

所以:

nova-compute运行instance.save()时是把save方法以及save的参数作为参数去运行indirection_api.object_action,而其他服务则是直接运行save()。

而indirection_api.object_action的具体实现就是消息队列的call方法。

class ConductorAPI(object):
    def object_action(self, context, objinst, objmethod, args, kwargs):
        cctxt = self.client.prepare()
        return cctxt.call(context, 'object_action', objinst=objinst,
                          objmethod=objmethod, args=args, kwargs=kwargs)

原文发布于微信公众号 - 虚拟化云计算(openstack_openstack)

原文发表时间:2018-05-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技巅

分布式日志收集系统: Facebook Scribe之结构及源码分析

20620
来自专栏前端小叙

koa2使用注意点总结

get请求,ajax传入参数 获取的时候为ctx.request.query.参数名

11120
来自专栏眯眯眼猫头鹰的小树杈

linux常用指令学习记录

locate会根据/var/lib/mlocate内的数据库记载,找出用户输入的关键字文件名,即所有包含该关键字的文件都将被输出。但是因为数据库的更新一般为一天...

14620
来自专栏Golang语言社区

【Go 语言社区】JS 相关---Window Location

window.location 对象用于获得当前页面的地址 (URL),并把浏览器重定向到新的页面。 Window Location window.locati...

32670
来自专栏Python小屋

在Python中执行JavaScript代码并进行数据交换

闲言碎语不多讲,今天介绍一下Python扩展库pyexecjs。 首先进入命令提示符环境,使用pip安装Python扩展库pyexecjs,瞬间完成: ? 然后...

31240
来自专栏WindCoder

Java设计模式学习笔记—单例模式(上)

文章最后“Java设计模式笔记示例代码整合”为本系列代码整合,所有代码均为个人手打并运行测试,不定期更新。本节内容位于其Singleton包(package)中...

7320
来自专栏ml

mysql关于编码部分(乱码出现的原因和解决方法)

      在使用mysql客户端时,我们会经常出现一个这样一个问题,就是原先好好文字,怎么输入之后就出现乱码了呢?           出现这样的问题: 第一...

66080
来自专栏老九学堂

Java微课堂之基本选择结构2

本节讲解知识点回顾 ? ? ? 本节编程技巧和注意事项 条件选择结构关于分号和大括号什么时候可以打,什么时候不用打,它的意义是不同的。

28360
来自专栏有趣的Python和你

用python偷懒Arcgis(地类编码转地类名称)excel数据python代码arcgis操作

12630
来自专栏码匠的流水账

nginx limit配置参数解读

本文主要解析一下ngx_http_core_module、ngx_http_limit_conn_module以及ngx_http_limit_req_modu...

34920

扫码关注云+社区

领取腾讯云代金券