Launch和Shut Off操做详解 - 天天5分钟玩转 OpenStack(30)

本节详细分析 instance launch 和 shut off 操做,以及如何在日志中快速定位有用信息的技巧。web

Launch

Launch instance 应该算 Nova 最重要的操做。算法

仔细研究 lanuch 操做可以帮助咱们充分理解 Nova 各个子服务的协调配合和运行机制。 数据库

前面咱们已经以 launch 操做为例详细讨论了各个 nova-* 子服务。 这里再也不赘述,只是再回顾一下流程。 api

image146.png

  1. 客户(能够是 OpenStack 最终用户,也能够是其余程序)向 API(nova-api)发送请求:“帮我建立一个 Instance” 性能

  2. API对请求作一些必要处理后,向 Messaging(RabbitMQ)发送了一条消息:“让 Scheduler 建立一个 Instance” spa

  3. Scheduler(nova-scheduler)从 Messaging 获取到 API 发给它的消息,而后执行调度算法,从若干计算节点中选出节点 A debug

  4. Scheduler 向 Messaging 发送了一条消息:“在计算节点 A 上建立这个 Instance” 3d

  5. 计算节点 A 的 Compute(nova-compute)从 Messaging 中获取到 Scheduler 发给它的消息,而后经过本节点的 Hypervisor Driver 建立 Instance。 日志

  6. 在 Instance 建立的过程当中,Compute 若是须要查询或更新数据库信息,会经过 Messaging 向 Conductor(nova-conductor)发送消息,Conductor 负责数据库访问。 orm

Shut Off

下面是 shut off instance 的流程图

  1. 向 nova-api 发送请求

  2. nova-api 发送消息

  3. nova-compute 执行操做

下面咱们详细讨论每个步骤。

向 nova-api 发送请求

客户(能够是 OpenStack 最终用户,也能够是其余程序)向 API(nova-api)发送请求:“帮我关闭这个 Instance”

查看日志 /opt/stack/logs/n-api.log

对于如何在日志文件中快速查找到有用的信息这里多聊几句。 对于初学者,这不是一件容易的事情,由于日志里条目和内容不少,特别是 debug 选项打开以后,容易让人眼花缭乱,无从下手。

这里给你们几个小窍门:

  1. 先肯定大的范围,好比在操做以前用 tail -f 打印日志文件,这样须要查看的日志确定在操做以后的打印输出的这些内容里。 另外也能够经过时间戳来肯定须要的日志范围。

  2. 利用 “代码模块” 快速定位有用的信息。 nova-* 子服务都有本身特定的代码模块:
    nova-api
    nova.api.openstack.compute.servers
    nova.compute.api
    nova.api.openstack.wsgi

    nova-compute
    nova.compute.manager
    nova.virt.libvirt.*

    nova-scheduler
    nova.scheduler.*

  3. 利用 Request ID 查找相关的日志信息。 在上面的日志中个,咱们能够利用 “req-1758b389-a2d0-44cc-a95a-6f75e4dc07fd” 这个 Request ID 快速定位 n-api.log 中相与 shut off 操做的其余日志条目。 须要补充说明的是,Request ID 是跨日志文件的,这一个特性能帮助咱们在其余子服务的日志文件中找到相关信息,咱们后面立刻将会看到这个技巧的应用。

nova-api 发送消息

nova-api 向 Messaging(RabbitMQ)发送了一条消息:“关闭这个 Instance” nova-api 没有将发送消息的操做记录到日志中,不过咱们能够经过查看源代码来验证。 一提到源代码,你们可能觉得要大海捞针了。其实很简单,上面日志已经清楚地告诉咱们须要查看的源代码在 /opt/stack/nova/nova/compute/api.py 的 1977 行,方法是 force_stop。

force_stop 方法最后调用的是对象 self.compute_rpcapi 的 stop_instance 方法。 在 OpenStack 源码中,以 xxx_rpcapi 命名的对象,表示的就是 xxx 的消息队列。 xxx_rpcapi.yyy() 方法则表示向 xxx 的消息队列发送 yyy 操做的消息。

因此 self.compute_rpcapi.stop_instance() 的做用就是向 RabbitMQ 上 nova-compute 的消息队列里发送一条 stop instance 的消息。

这里补充说明一下: 关闭 instance 的前提是 instance 当前已经在某个计算节点上运行,因此这里不须要 nova-scheduler 再帮咱们挑选合适的节点,这个跟 launch 操做不一样。

nova-compute 执行操做

查看计算节点上的日志 /opt/stack/logs/n-cpu.log

这里咱们利用了 Request ID “req-1758b389-a2d0-44cc-a95a-6f75e4dc07fd” 在 n-cpu.log 中快速定位到 nova-compute 关闭 instance 的日志条目。

小结

分析某个操做时,咱们首先要理清该操做的内部流程,而后再到相应的节点上去查看日志。 例如shut off 的流程为:

  1. 向 nova-api 发送请求

  2. nova-api 发送消息

  3. nova-compute 执行操做

1,2 两个步骤是在控制节点上执行的,查看 nova-api 的日志。 第 3 步是在计算节点上执行的,查看 nova-compute 的日志。

 

相关文章
相关标签/搜索