nova-conductor数据库远程对象模型

远程对象交互原理
文章来自作者维护的社区微信公众号【虚拟化云计算】)
目前有两个微信群《kvm虚拟化》和《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()方法为例,(objects/instance.py ),他有一个修饰@base.remotable
    @base.remotable
    def save(self, expected_vm_state=None,
             expected_task_state=None, admin_state_reset=False):
 
remotable的定义如下(dist-packages/oslo_versionedobjects/base.py),根据indirection_api的定义情况:如果有定义indirection_api,则把save()方法作为一个参数fn来运行indirection_api.object_action,如果没有定义则运行save()
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)
 
 
============================================================
关注微信公众号【虚拟化云计算】,阅读更多虚拟化云计算知识,纯技术干货更新不停。
 

 

systemctl start openstack-nova-conductor openstack-nova-scheduler Job for openstack-nova-conductor.service failed because the control process exited with error code. See "systemctl status openstack-nova-conductor.service" and "journalctl -xe" for details. Job for openstack-nova-scheduler.service failed because the control process exited with error code. See "systemctl status openstack-nova-scheduler.service" and "journalctl -xe" for details. [root@controller ~]# [root@controller ~]# journalctl -xe Nov 19 02:06:44 controller systemd[1]: openstack-nova-conductor.service: main process exited, code=exited, status=1/FAILURE Nov 19 02:06:44 controller systemd[1]: Failed to start OpenStack Nova Conductor Server. -- Subject: Unit openstack-nova-conductor.service has failed -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit openstack-nova-conductor.service has failed. -- -- The result is failed. Nov 19 02:06:44 controller systemd[1]: Unit openstack-nova-conductor.service entered failed state. Nov 19 02:06:44 controller systemd[1]: openstack-nova-conductor.service failed. Nov 19 02:06:44 controller systemd[1]: openstack-nova-conductor.service holdoff time over, scheduling restart. Nov 19 02:06:44 controller systemd[1]: Stopped OpenStack Nova Conductor Server. -- Subject: Unit openstack-nova-conductor.service has finished shutting down -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit openstack-nova-conductor.service has finished shutting down. Nov 19 02:06:44 controller systemd[1]: Starting OpenStack Nova Conductor Server... -- Subject: Unit openstack-nova-conductor.service has begun start-up -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit openstack-nova-conductor.service has begun starting up. Nov 19 02:06:47 controller systemd[1]: openstack-nova-scheduler.service holdoff time over, scheduling restart. Nov 19 02:06:47 controller systemd[1]: Stopped OpenStack Nova Scheduler Server. -- Subject: Unit openstack-nova-scheduler.service has finished shutting down -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit openstack-nova-scheduler.service has finished shutting down. Nov 19 02:06:47 controller systemd[1]: Starting OpenStack Nova Scheduler Server... -- Subject: Unit openstack-nova-scheduler.service has begun start-up -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit openstack-nova-scheduler.service has begun starting up. lines 3387-3423/3423 (END)这是什么错误,怎么解决
最新发布
11-20
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值