前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenStack数据库远程对象模型

OpenStack数据库远程对象模型

作者头像
虚拟化云计算
发布2018-07-23 17:51:42
1.1K0
发布2018-07-23 17:51:42
举报
文章被收录于专栏:虚拟化云计算

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

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

代码语言:javascript
复制
instance.task_state = task_states.XXX
instance.save()

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

具体原理

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

(objects/instance.py ),

代码语言:javascript
复制
@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),

代码语言:javascript
复制
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 )

代码语言:javascript
复制
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方法。

代码语言:javascript
复制
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)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 虚拟化云计算 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档