Cinder 调试 - cinder service 状态为 down

1. 问题

我们经常会发现某个cinder service 的状态为 down。比如下面例子中 controller 上的 cinder-scheduler 和 block1 节点上 cinder-volume 的状态都为 down。

[email protected]:~$ cinder service-list

+------------------+---------------------------+------+---------+-------+----------------------------+-----------------+
| Binary | Host | Zone | Status | State | Updated_at | Disabled Reason |
+------------------+---------------------------+------+---------+-------+----------------------------+-----------------+
| cinder-backup | controller | nova | enabled | up | 2015-03-30T00:53:32.000000 | None |
| cinder-scheduler | controller | nova | enabled | down | 2015-03-30T00:51:53.000000 | None |
| cinder-volume | block1 | nova | enabled | down | 2015-03-30T00:54:43.000000 | None |
| cinder-volume | [email protected] | az1 | enabled | up | 2015-03-30T00:54:14.000000 | None |
| cinder-volume | [email protected] | az1 | enabled | up | 2015-03-30T00:54:13.000000 | None |
| cinder-volume | [email protected] | nova | enabled | up | 2015-03-30T00:54:08.000000 | None |
+------------------+---------------------------+------+---------+-------+----------------------------+-----------------+

先来看看 cinder-list 的实现代码:

class ServiceController(wsgi.Controller):
    @wsgi.serializers(xml=ServicesIndexTemplate)
    def index(self, req):
        """Return a list of all running services.
        Filter by host & service name.
        """
        context = req.environ[‘cinder.context‘]
        authorize(context)
        detailed = self.ext_mgr.is_loaded(‘os-extended-services‘)
        now = timeutils.utcnow() //获取controller 当前的时间
        services = db.service_get_all(context) //从 db 获取所有的 cinder service 列表
        ...
        svcs = []
        for svc in services: //轮询每个 service
            delta = now - (svc[‘updated_at‘] or svc[‘created_at‘]) //获取 updated_at。不存在的话,获取 created_at,并和当前时间计算时间差
            alive = abs(utils.total_seconds(delta)) <= CONF.service_down_time //获取时间差值的绝对值,并检查是否小于配置的 server_down_time,该配置项默认是60秒
            art = (alive and "up") or "down" //如果差值小于60,则service 状态为 up,否则为 down
            active = ‘enabled‘
            ......
            svcs.append(ret_fields)
        return {‘services‘: svcs}

可见 service 的 up/down 状态取决于数据库中 service 表对应某 service 的行的 updated_at 列的值和当前 controller 节点的时间的差值是否在配置的范围之内。

2. Cinder Service 的 update_at 值更新机制

cinder 的各种service,比如cinder-api,cinder-backup 等,都是 /cinder/service.py 文件中 class Service(service.Service) 的一个实例,该类的 start 方法如下:

def start(self):
        version_string = version.version_string()
        LOG.info(_(‘Starting %(topic)s node (version %(version_string)s)‘),
                 {‘topic‘: self.topic, ‘version_string‘: version_string})
        ...if self.report_interval: //如果设置了 report_interval 配置项,那么该 service 将启动一个无限循环来执行 report_state 方法,运行间隔就是 report_interval,其默认值是 10 秒
            pulse = loopingcall.FixedIntervalLoopingCall(
                self.report_state)
            pulse.start(interval=self.report_interval,
                        initial_delay=self.report_interval)
            self.timers.append(pulse)
report_state 方法会更新 db 中serive 的各个属性,其中 updated_at 的值就是所在节点上执行一次该方法的时刻。
def report_state(self):
        """Update the state of this service in the datastore."""
        ctxt = context.get_admin_context()
        zone = CONF.storage_availability_zone
        state_catalog = {}
        try:
            ...
                service_ref = db.service_get(ctxt, self.service_id) // 获取service 的 ref
            ...
            db.service_update(ctxt, self.service_id, state_catalog) //更新该 service
            ...

3. 问题定位步骤

(1)看看是不是在 cinder.conf 中 report_interval 配置项的值是多少,如果超过了 service_down_time 配置项默认的 60 秒,那么该service 的状态肯定就是 ‘down‘ 了。

(2)看 service 所在节点的时间,它的时间和 controller 节点的时间误差必须在 [service_down_time - report_interval ] 之内,也就是在使用默认配置情况下,时间差必须在 50 秒之内。

(3)看看 service 的 log 文件中,确认 report_state  方法是不是都按时被调用了,不方便看的话,在代码中加个注释吧。比如:

2015-04-11 15:26:24.210 8517 DEBUG cinder.service [-] enter report_state .. report_state /usr/lib/python2.7/dist-packages/cinder/service.py:283

4. 问题解决

(1). 检查 block1 的时间

发现 block1 的时间 和 controller 不同步。通过同步 block1 和 controller 的时间,block1 上的 cinder-volume 的状态变为了 up。

(2). 检查 cinder-scheduler service 的 updated_at

发现 cinder-scheduler 的 updated_at 是 2015-03-30 01:32:26, 而 controller 的当前时间是 2015-04-11 02:26:20。排除时间差因素,基本可以确定是该服务的时间上报出了问题。检查 cinder-schedule 的log,发现因为 bug 该 service 真的down了。fix bug,然后重启服务,其状态变为 up。

时间: 2025-01-09 12:31:04

Cinder 调试 - cinder service 状态为 down的相关文章

【转载】用VS(c#)创建、调试windows service以及部署卸载

用VS(c#)创建.调试windows service以及部署卸载 同事问到windows service的东东,现在整理一下,用c#如何创建一个windows service,以及如何调试.部署.卸载. 一.创建windows service 1. 打开VS2008,新建一个Project, Project类型选择Visual C#-Windows,在Templates中选择Windows Service, 其他可以默认,点击OK. 2. 在Solution Explorer中会看到自动产生了

学习Cinder——建立Cinder工程

==引子== 先请看几个使用Cinder开发的案例: ==Cinder简介== Cinder是一个由社区开发,开源,高质量C++库,功能和Processing类似,主要是致力于绘图以及艺术化的表现,使用它就可以开发出各种绚丽的效果.其实Cinder是一个工具箱式的函数库,里面包含了图形.图像等等多种工具,使用时可以很轻松的信手拈来,而不必考虑其他. 官网简介:http://libcinder.org/about/ 官方文档:http://libcinder.org/docs/dev/index.

在 UWP 应用中创建、使用、调试 App Service (应用服务)

在 Windows 10 中微软为 UWP 引入了 App Service (即应用服务)这一新特性用以提供应用间交互功能.提供 App Service 的应用能够接收来自其它应用传入的参数进行处理后返回数据. 创建应用服务 要使应用支持提供 App Service 非常简单.只需正确配置应用的清单文件后添加服务相关的代码即可. 配置应用清单文件 打开项目中的 Package.appxmanifest 文件. 切换到 Declarations 选项卡. 在左侧 Available Declara

SaltStack源码分析之service状态模块

/usr/lib/python2.6/site-packages/salt/states/service.py 这个模块用于启动或重启服务和后台进程 starting or restarting of services and daemons ============================================== Services are defined as system daemons typically started with system init or rc s

SharePoint 2013 Service 状态无法启动,显示“启动中(Starting)”

Problem 在SharePoint 2013 Central Administration中启动 SharePoint Service(也称为:Service Machine Instance)时,有时会出现"卡住"这种情况,直接的体现就是某个SharePoint Service一直停留在Starting状态,如下图所示: Resolution 当SharePoint Service的状态为Starting时,不管经过多少时间,仍然没有被启动,就仿佛被"卡住了"

问题:webservice浏览后 无法输入参数;结果:调试Web Service时不能输入参数的解决办法

使用.NET 开发Web Service,有一个很方便的功能就是可以通过IE直接测试Web Service.当你的Web Service的参数都是元数据类型,那么只要你使用IE浏览Web Service就可以页面的输入框中输入必需的参数,点击调用,即可完成Web Service的测试调用.方便! 但是,在有些情况下,虽然我们开发的Web Service都使用元数据类型的参数,为什么死活都无法直接调用测试呢?点击方法链接也只是出现SOAP消息的格式定义?原来这个问题一直都没有解 决,google一

vs2013创建、安装、调试Windows Service程序

Windows服务以服务的形式运行,有些情况下非常有用.用VS2013创建windows服务的过程如下: 创建服务. 1.文件->新建->项目->windows桌面->windows服务,修改你要的项目名称.我这不改名,仍叫WindowsService1,确定. 2.产生的项目文件结构如图所示.右侧的Program.cs文件是入口,Service1.cs是服务文件,所有的逻辑都在这.Service1.cs包含两部分,一部分是Designer,可以在这里面添加各种组件.一部分是后台文

c#访问远程计算机的Windows Service状态

1 static void Main(string[] args) 2 { 3 ConnectionOptions op = new ConnectionOptions(); // 登陆远程计算机的远程, 4 op.Username = "Domain\\Domainuser"; 5 op.Password = "password"; 6 // 该处不能使用ip必须是"计算机名称.域名\root\cimv2" 7 ManagementScope

MVC 5 Ajax + bootstrap+ handle bar 例: 实现service 状态

Js Script <script src="../../Scripts/handlebars-v1.3.0.js"></script> <script id="service-status-details-template" type="text/x-handlebars-template"> {{#each values}} <div class="top-buffer-10"&g