在openstack中,消息的传递一共有两种方式,分别是:服务之间的传递调用Restful api,服务中模块之间的传递使用消息队列。每一个模块在启动是都会启动消息队列,等待队列中的有消息到来。所以模块的启动是openstack运行起来最早做的工作。以nova-compute模块为例,说明该服务模块是如何启动并运行的。

nova的架构设计图如下:

aaarticlea/png;base64,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" alt="" />

nova启动时使用service命令,如下图:

service命令实际上是调用/etc/init.d/nova-compute来实现的。在/etc/init.d/文件下有一个nova-compute脚本,负责nova-compute的启动,停止,状态查询等。

/etc/init.d/nova-compute脚本的执行是通过/etc/init/nova-compute.conf中的配置项来完成的,下面看看nova-compute.conf文件中的内容。

/etc/init/nova-compute.conf

 #!/bin/sh
### BEGIN INIT INFO
# Provides: nova-compute
# Required-Start: $network $local_fs $remote_fs $syslog
# Required-Stop: $remote_fs
# Should-Start: libvirt-bin postgresql mysql keystone rabbitmq-server ntp neutron-ovs-cleanup
# Should-Stop: libvirt-bin postgresql mysql keystone rabbitmq-server ntp
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Nova Compute server
# Description: Provides compute server resources for the
# OpenStack cloud computing system
### END INIT INFO # Author: Julien Danjou <acid@debian.org> # PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="OpenStack Compute"
PROJECT_NAME=nova
NAME=${PROJECT_NAME}-compute
DAEMON_ARGS=""
if [ -f '/etc/nova/nova-compute.conf' ] ; then
DAEMON_ARGS="--config-file=/etc/nova/nova-compute.conf"
fi #!/bin/sh
# The content after this line comes from openstack-pkg-tools
# and has been automatically added to a .init.in script, which
# contains only the descriptive part for the daemon. Everything
# else is standardized as a single unique script. # Author: Thomas Goirand <zigo@debian.org> # PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin if [ -z "${DAEMON}" ] ; then
DAEMON=/usr/bin/${NAME}
fi
PIDFILE=/var/run/${PROJECT_NAME}/${NAME}.pid
if [ -z "${SCRIPTNAME}" ] ; then
SCRIPTNAME=/etc/init.d/${NAME}
fi
if [ -z "${SYSTEM_USER}" ] ; then
SYSTEM_USER=${PROJECT_NAME}
fi
if [ -z "${SYSTEM_GROUP}" ] ; then
SYSTEM_GROUP=${PROJECT_NAME}
fi
if [ "${SYSTEM_USER}" != "root" ] ; then
STARTDAEMON_CHUID="--chuid ${SYSTEM_USER}:${SYSTEM_GROUP}"
fi
if [ -z "${CONFIG_FILE}" ] ; then
CONFIG_FILE=/etc/${PROJECT_NAME}/${PROJECT_NAME}.conf
fi
LOGFILE=/var/log/${PROJECT_NAME}/${NAME}.log
if [ -z "${NO_OPENSTACK_CONFIG_FILE_DAEMON_ARG}" ] ; then
DAEMON_ARGS="--config-file=${CONFIG_FILE} ${DAEMON_ARGS}"
fi # Exit if the package is not installed
[ -x $DAEMON ] || exit 0 # If ran as root, create /var/lock/X, /var/run/X, /var/lib/X and /var/log/X as needed
if [ `whoami` = "root" ] ; then
for i in lock run lib ; do
mkdir -p /var/$i/${PROJECT_NAME}
chown ${SYSTEM_USER}:${SYSTEM_GROUP} /var/$i/${PROJECT_NAME}
done
for i in log ; do
mkdir -p /var/$i/${PROJECT_NAME}
chown ${SYSTEM_USER}:adm /var/$i/${PROJECT_NAME}
done
fi # This defines init_is_upstart which we use later on (+ more...)
. /lib/lsb/init-functions # Manage log options: logfile and/or syslog, depending on user's choosing
[ -r /etc/default/openstack ] && . /etc/default/openstack
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
[ "x$USE_SYSLOG" = "xyes" ] && DAEMON_ARGS="$DAEMON_ARGS --use-syslog"
if [ -z "${NO_OPENSTACK_LOGFILE_DAEMON_ARG}" ] ; then
[ "x$USE_LOGFILE" != "xno" ] && DAEMON_ARGS="$DAEMON_ARGS --log-file=$LOGFILE"
fi do_start() {
start-stop-daemon --start --quiet --background ${STARTDAEMON_CHUID} --make-pidfile --pidfile ${PIDFILE} --chdir /var/lib/${PROJECT_NAME} --startas $DAEMON \
--test > /dev/null || return 1
start-stop-daemon --start --quiet --background ${STARTDAEMON_CHUID} --make-pidfile --pidfile ${PIDFILE} --chdir /var/lib/${PROJECT_NAME} --startas $DAEMON \
-- $DAEMON_ARGS || return 2
} do_stop() {
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE
RETVAL=$?
rm -f $PIDFILE
return "$RETVAL"
} do_systemd_start() {
exec $DAEMON $DAEMON_ARGS
} case "$1" in
start)
init_is_upstart > /dev/null 2>&1 && exit 1
log_daemon_msg "Starting $DESC" "$NAME"
do_start
case $? in
0|1) log_end_msg 0 ;;
2) log_end_msg 1 ;;
esac
;;
stop)
init_is_upstart > /dev/null 2>&1 && exit 0
log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case $? in
0|1) log_end_msg 0 ;;
2) log_end_msg 1 ;;
esac
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
systemd-start)
do_systemd_start
;;
restart|force-reload)
init_is_upstart > /dev/null 2>&1 && exit 1
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case $? in
0|1)
do_start
case $? in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*) log_end_msg 1 ;; # Failed to stop
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload|systemd-start}" >&2
exit 3
;;
esac exit 0

/etc/init/nova-compute.conf

 # vim: set ft=upstart et ts=2:
description "Nova compute worker"
author "Soren Hansen <soren@linux2go.dk>" start on runlevel [2345]
stop on runlevel [!2345] chdir /var/run env MAX_STATUS_CHECK_RETRIES=20 pre-start script
mkdir -p /var/run/nova
chown nova:root /var/run/nova/ mkdir -p /var/lock/nova
chown nova:root /var/lock/nova/ # Only try to modprobe if not running within a container
if [ ! -f /run/container_type ]; then
modprobe nbd
fi # If libvirt-bin is installed, always wait for it to start first
if status libvirt-bin; then
start wait-for-state WAIT_FOR=libvirt-bin WAIT_STATE=running WAITER=nova-compute
fi # If installed, wait for neutron-ovs-cleanup to complete prior to starting
# nova-compute.
if status neutron-ovs-cleanup; then
# See LP #1471022 for explanation of why we do like this
retries=$MAX_STATUS_CHECK_RETRIES
delay=1
while true; do
# Already running?
s=`status neutron-ovs-cleanup`
echo $s
`echo $s| grep -qE "\sstart/running"` && break
if retries=`expr $retries - 1`; then
# Give it a push
echo "Attempting to start neutron-ovs-cleanup"
start neutron-ovs-cleanup || :
# Wait a bit to avoid hammering ovs-cleanup (which itself may be waiting
# on dependencies)
echo "Recheck neutron-ovs-cleanup status in ${delay}s"
sleep $delay
if _=`expr $retries % 2`; then
delay=`expr $delay + 2`
fi
else
echo "Max retries ($MAX_STATUS_CHECK_RETRIES) reached - no longer waiting for neutron-ovs-cleanup to start"
break
fi
done
fi
end script exec start-stop-daemon --start --chuid nova --exec /usr/bin/nova-compute -- --config-file=/etc/nova/nova.conf --config-file=/etc/nova/nova-compute.conf

其中最后一行代码是关键代码,这个脚本之所以能启动是执行了nova-compute的可执行脚本,位置在/usr/bin/nova-compute。

/usr/bin/nova-compute

 #!/usr/bin/python
# PBR Generated from u'console_scripts' import sys from nova.cmd.compute import main if __name__ == "__main__":
sys.exit(main())

该脚本导入了/nova/cmd/compute中的main函数来完成启动任务。

/nova/nova/cmd/compute

 # Copyright 2010 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License. """Starter script for Nova Compute.""" import shlex
import sys import os_vif
from oslo_log import log as logging
from oslo_privsep import priv_context
from oslo_reports import guru_meditation_report as gmr from nova.cmd import common as cmd_common
from nova.conductor import rpcapi as conductor_rpcapi
import nova.conf
from nova import config
from nova import objects
from nova.objects import base as objects_base
from nova import service
from nova import utils
from nova import version CONF = nova.conf.CONF
LOG = logging.getLogger('nova.compute') def main():
config.parse_args(sys.argv)
logging.setup(CONF, 'nova')
priv_context.init(root_helper=shlex.split(utils.get_root_helper()))
utils.monkey_patch()
objects.register_all()
# Ensure os-vif objects are registered and plugins loaded
os_vif.initialize() gmr.TextGuruMeditation.setup_autorun(version) cmd_common.block_db_access('nova-compute')
objects_base.NovaObject.indirection_api = conductor_rpcapi.ConductorAPI() server = service.Service.create(binary='nova-compute',
topic=CONF.compute_topic)
service.serve(server)
service.wait()
 # Copyright 2010 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
# Copyright 2012 Red Hat, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License. from oslo_log import log from nova.common import config
import nova.conf
from nova.db.sqlalchemy import api as sqlalchemy_api
from nova import rpc
from nova import version CONF = nova.conf.CONF def parse_args(argv, default_config_files=None, configure_db=True,
init_rpc=True):
log.register_options(CONF)
# We use the oslo.log default log levels which includes suds=INFO
# and add only the extra levels that Nova needs
if CONF.glance.debug:
extra_default_log_levels = ['glanceclient=DEBUG']
else:
extra_default_log_levels = ['glanceclient=WARN']
log.set_defaults(default_log_levels=log.get_default_log_levels() +
extra_default_log_levels)
rpc.set_defaults(control_exchange='nova')
config.set_middleware_defaults() CONF(argv[1:],
project='nova',
version=version.version_string(),
default_config_files=default_config_files) if init_rpc:
rpc.init(CONF) if configure_db:
sqlalchemy_api.configure(CONF)

/nova/nova/service.py

 class Service(service.Service):
"""Service object for binaries running on hosts. A service takes a manager and enables rpc by listening to queues based
on topic. It also periodically runs tasks on the manager and reports
its state to the database services table.
""" def __init__(self, host, binary, topic, manager, report_interval=None,
periodic_enable=None, periodic_fuzzy_delay=None,
periodic_interval_max=None, db_allowed=True,
*args, **kwargs):
super(Service, self).__init__()
self.host = host
self.binary = binary
self.topic = topic
self.manager_class_name = manager
self.servicegroup_api = servicegroup.API()
manager_class = importutils.import_class(self.manager_class_name)
self.manager = manager_class(host=self.host, *args, **kwargs)
self.rpcserver = None
self.report_interval = report_interval
self.periodic_enable = periodic_enable
self.periodic_fuzzy_delay = periodic_fuzzy_delay
self.periodic_interval_max = periodic_interval_max
self.saved_args, self.saved_kwargs = args, kwargs
self.backdoor_port = None
self.conductor_api = conductor.API(use_local=db_allowed)
self.conductor_api.wait_until_ready(context.get_admin_context())

/nova/nova/service.py

 @classmethod
def create(cls, host=None, binary=None, topic=None, manager=None,
report_interval=None, periodic_enable=None,
periodic_fuzzy_delay=None, periodic_interval_max=None,
db_allowed=True):
"""Instantiates class and passes back application object. :param host: defaults to CONF.host
:param binary: defaults to basename of executable
:param topic: defaults to bin_name - 'nova-' part
:param manager: defaults to CONF.<topic>_manager
:param report_interval: defaults to CONF.report_interval
:param periodic_enable: defaults to CONF.periodic_enable
:param periodic_fuzzy_delay: defaults to CONF.periodic_fuzzy_delay
:param periodic_interval_max: if set, the max time to wait between runs """
if not host:
host = CONF.host
if not binary:
binary = os.path.basename(sys.argv[0])
if not topic:
topic = binary.rpartition('nova-')[2]
if not manager:
manager_cls = ('%s_manager' %
binary.rpartition('nova-')[2])
manager = CONF.get(manager_cls, None)
if report_interval is None:
report_interval = CONF.report_interval
if periodic_enable is None:
periodic_enable = CONF.periodic_enable
if periodic_fuzzy_delay is None:
periodic_fuzzy_delay = CONF.periodic_fuzzy_delay debugger.init() service_obj = cls(host, binary, topic, manager,
report_interval=report_interval,
periodic_enable=periodic_enable,
periodic_fuzzy_delay=periodic_fuzzy_delay,
periodic_interval_max=periodic_interval_max,
db_allowed=db_allowed) return service_obj

/nova/nova/service.py

 def serve(server, workers=None):
global _launcher
if _launcher:
raise RuntimeError(_('serve() can only be called once')) _launcher = service.launch(CONF, server, workers=workers)

未完待续。。。。。

openstack服务启动之nova-compute的更多相关文章

  1. (原创)OpenStack服务如何使用Keystone(一)---Keystone端的操作

    (一)Keystone端的操作 (二)如何在OpenStack服务上部署Keystone中间件 (三)详细配置keystonemiddleware OpenStack项目如果要使用Keystone作为 ...

  2. openstack Q版部署-----nova服务配置-控制节点(5)

    一.创建数据库(控制节点) 创建数据库以及用户: CREATE DATABASE nova_api; CREATE DATABASE nova; CREATE DATABASE nova_cell0; ...

  3. Openstack 03 - Nova Compute

    1.前言 非常早之前就開始着手写Openstack 系列的博客了,在写了总体架构和Keystone之后,准备写Nova,可是每次写到一半,自己心里就认为不踏实,由于似乎我并没有真正理解Nova,或者说 ...

  4. S1_搭建分布式OpenStack集群_06 nova服务配置 (控制节点)

    一.创建数据库(控制节点)创建数据库以及用户:# mysql -uroot -p12345678MariaDB [(none)]> CREATE DATABASE nova_api;MariaD ...

  5. OpenStack 服务状态检查

    openstack服务不正常 使用命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [root@node-5 TimaIaas]# nova- ...

  6. openstack安装newton版本Nova部署(三)

    一.控制节点安装部署Nova Nova 包含API(负责接收相应外部请求,支持OpenStackAPI,EC2API):cert:负责身份认证:schedule:用于云主机调度(虚拟机创建在哪台主机上 ...

  7. 在Openstack H版部署Nova Cell 时 ,终端输入nova service-list 和 nova host-list 命令将报错

    关于Cell的基本介绍,可以参考贤哥的一篇文章: [OpenStack]G版中关于Nova的Cell  http://blog.csdn.net/lynn_kong/article/details/8 ...

  8. OpenStack kilo版(3) Nova部署

    部署在controller和compute节点 配置数据库 MariaDB [(none)]> CREATE DATABASE nova;  Query OK, 1 row affected ( ...

  9. OpenStack 虚拟机启动流程 UML 分析(内含 UML 源码)

    目录 文章目录 目录 前言 API 请求 Nova API 阶段 Nova Conductor 阶段 Nova Scheduler 阶段 Nova Compute 阶段(计算节点资源分配部分) Nov ...

随机推荐

  1. 【支付宝】支付 系统繁忙,请稍后再试(ALIN10146)

    https://openclub.alipay.com/read.php?tid=6918&fid=60 我碰到的是这个问题导致 把signType 改为  RSA2   改成      

  2. JavaWeb架构发展

    原文:JavaWeb项目为什么我们要放弃jsp?为什么要前后端解耦?为什么要前后端分离?2.0版,为分布式架构打基础 前戏 前后端分离已成为互联网项目开发的业界标准使用方式,通过Nginx + Tom ...

  3. 【转】从Vue.js源码看异步更新DOM策略及nextTick

    在使用vue.js的时候,有时候因为一些特定的业务场景,不得不去操作DOM,比如这样: <template> <div> <div ref="test" ...

  4. 解决SSH连接出现 Software caused connection abort 的问题

    修改服务器中/etc/ssh/sshd.config 文件,将LoginGraceTime的值设为0,默认为2m,TCPKeepAlive 设为yes, 然后使用service sshd restar ...

  5. 为什么分布式一定要有redis?

    为什么分布式一定要有redis? 孤独烟 架构师小秘圈 昨天 作者:孤独烟 来自:http://rjzheng.cnblogs.com/ 1.为什么使用redis   分析:博主觉得在项目中使用red ...

  6. go语言通道详解

    https://www.ardanlabs.com/blog/2017/10/the-behavior-of-channels.html Introduction When I started to ...

  7. cf 990G - GCD Counting

    题意 #include<bits/stdc++.h> #define t 200000 #define MAXN 200100 using namespace std; int n; in ...

  8. 洛谷P1731 生日蛋糕

    李煜东太神了啊啊啊啊啊! 生日蛋糕,著名搜索神题(还有虫食算). 当年的我30分.... 这哥们的程序0ms... 还有他的树网的核也巨TM神. 疯狂剪枝! DFS(int d, int s, int ...

  9. 利用pandas对numpy数组进行简单的科学计算

    二维数组转换为DataFrame pandas可直接进行科学计算形式: import numpy as np import pandas as pd a = [1,2,3] b = [4,5,6] # ...

  10. cookie 常用操作

    Cookie:指网站为了辨别用户身份.进行会话跟踪而储存在用户本地的 key/value 型数据(通常经过加密), cookie key/value 型数据可以由服务器端自己定义. Cookie是由服 ...