1 问题

controller 上的 cinder-scheduler 和 block1 节点上 cinder-volume 的状态都为 down。

root@openstack-ctl:~# cinder service-list
+------------------+--------------------------------+------+----------+-------+----------------------------+-----------------+
|      Binary      |              Host              | Zone |  Status  | State |         Updated_at         | Disabled Reason |
+------------------+--------------------------------+------+----------+-------+----------------------------+-----------------+
| cinder-scheduler |        openstack-ctl-k         | nova | enabled  |   up  | 2018-03-21T00:42:31.000000 |       None      |
| cinder-scheduler |        openstack-ctl2-k        | nova | enabled  |  down | 2018-03-21T01:59:17.000000 |       None      |
|  cinder-volume   |       ubuntu-1404-cinder       | nova | enabled  |  down | 2018-03-21T01:59:10.000000 |       None      |

2 问题原因

(1). 检查 block1 的时间

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

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

发现 cinder-scheduler 的 updated_at 是 2018-03-21T00:42:31.000000, 而 controller 的当前时间是 Wed Mar 21 08:54:47 CST 2018。排除时间差因素,基本可以确定是该服务的时间上报出了问题。检查 cinder-schedule 的log,发现因为 bug 该 service 真的down了。fix bug,然后重启服务,其状态变为 up。

3 问题解决

检查与配置网络时间协议(NTP)

安装Chrony,一个在不同节点同步服务实现NTP的方案。我们建议你配置控制器节点引用更准确的(lower stratum)NTP服务器,然后其他节点引用控制节点。

3.1 控制节点服务器

在控制节点上执行这些步骤。

安全并配置组件

1. 安装软件包:

# apt-get install chrony

2. 编辑 /etc/chrony/chrony.conf 文件,按照你环境的要求,对下面的键进行添加,修改或者删除:

server NTP_SERVER iburst

使用NTP服务器的主机名或者IP地址替换 NTP_SERVER 。配置支持设置多个 server 值。

注解

控制节点默认跟公共服务器池同步时间。但是你也可以选择性配置其他服务器,比如你组织中提供的服务器。

3. 重启 NTP 服务:

# service chrony restart

3.2 其它节点服务器

其他节点会连接控制节点同步时间。在所有其他节点执行这些步骤。

安全并配置组件

1. 安装软件包:

# apt-get install chrony

2. 编辑``/etc/chrony/chrony.conf`` 文件并注释除``server`` 值外的所有内容。修改它引用控制节点:

server controller iburst

3. 重启 NTP 服务:

# service chrony restart

3.3 验证操作

我们建议您在继续进一步的操作之前验证 NTP 的同步。有些节点,特别是哪些引用了控制节点的,需要花费一些时间去同步。

1. 在控制节点上执行这个命令:

# chronyc sources210 Number of sources = 2MS Name/IP address         Stratum Poll Reach LastRx Last sample===============================================================================^- 192.0.2.11                    2   7    12   137  -2814us[-3000us] +/-   43ms^* 192.0.2.12                    2   6   177    46    +17us[  -23us] +/-   68ms

在 Name/IP address 列的内容应显示NTP服务器的主机名或者IP地址。在 S 列的内容应该在NTP服务目前同步的上游服务器前显示*

2. 在所有其他节点执行相同命令:

# chronyc sources210 Number of sources = 1MS Name/IP address         Stratum Poll Reach LastRx Last sample===============================================================================^* controller                    3    9   377   421    +15us[  -87us] +/-   15ms

在 Name/IP address 列的内容应显示控制节点的主机名。

4 实现代码

4.1 先来看看 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: //轮询每个 servicedelta = 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,否则为 downactive = 'enabled'......svcs.append(ret_fields)return {'services': svcs}

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

4.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_zonestate_catalog = {}try:...service_ref = db.service_get(ctxt, self.service_id) // 获取service 的 ref...db.service_update(ctxt, self.service_id, state_catalog) //更新该 service
            ...

4.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

5 从原理角度理解

openstack块存储服务(cinder)为虚拟机增加持久性存储,块存储为管理卷提供基础设施,与openstack 计算提供的实例存储相互作用。这个也启用了volume 快照管理,和volume 类型。
块存储由以下内容组成:
cinder-api
接受一些请求,并把他们发送给 cinder-volume

cinder-scheduler 守护进程
选择最优节点存储创建卷,与nova-scheduler组件类似

cinder-volume
直接与块存储服务相互作用,处理比如cinder-scheduler(cinder调度),它通过消息队列直接与这些过程相互作用。cinder-volume服务响应读写请求。cinder-volume通过驱动与可以使用不同供应商的存储设置

消息队列
块存储之间传递信息

6 cinder插件

1.6.1 LVMISCSIDriver

1.6.2 IBM SVC/DS8K/XIV 插件

1.6.3 LVM插件和Vendor插件的比较

参考:

1 https://www.cnblogs.com/sammyliu/p/4219974.html

2 https://www.cnblogs.com/sammyliu/p/4417091.html

cinder service 状态为 down相关推荐

  1. 查看journalnode节点状态信息_OpenStack Cinder服务状态排错

    作者:舒祝 最近手动搭建了一个openstack环境,创建硬盘时失败,查看日志,提示无法进行调度,怀疑是cinder节点出现问题,去cinder节点查看服务 ,状态显示正常.systemctl sta ...

  2. 服务中没有ASP.net State service 状态服务 (ASP.NET state server)

    Windows7\8 装完后,服务中没有ASP.net状态服务 (ASP.NET state server) 没有找到具体的解决办法,有遇到同样问题的吗? 装IIS就行了,步骤是: 进入控制面板--- ...

  3. shell 拿到service状态_9个实战及面试会经常用到的Shell脚本!

    注意事项: 1)开头加解释器:#!/bin/bash 2)语法缩进,使用四个空格:多加注释说明. 3)命名建议规则:变量名大写.局部变量小写,函数名小写,名字体现出实际作用. 4)默认变量是全局的,在 ...

  4. 请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同...

    异常详细信息: System.Web.HttpException: 无法向会话状态服务器发出会话状态请求.请确保已启动 ASP.NET State service,并且客户端和服务器端口是相同的.如果 ...

  5. Cinder LVM backend cinder-volume service down

    目录 文章目录 目录 问题 调查 解决 问题 [stack@manager ~]$ cinder service-list +------------------+------------------ ...

  6. Android实例-手机安全卫士(三十六)-根据Service是否开启确定CheckBox选中状态

    一.目标 1.根据service是否在后台运行情况来确定CheckBox的选中状态: 2.解决"设置中心"的"开启来电号码显示归属地"功能在退出程序再进入时选中 ...

  7. cinder存储服务

    一.cinder 介绍: 理解 Block Storage 操作系统获得存储空间的方式一般有两种: 1.通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区.格式化.创建文件系 ...

  8. openstack核心组件-块存储 (Block Storage) : Cinder

    cinder 介绍: 理解 Block Storage 操作系统获得存储空间的方式一般有两种: 通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区.格式化.创建文件系统:或者 ...

  9. Cinder 组件详解

    理解 Block Storage 操作系统获得存储空间的方式一般有两种: 通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区.格式化.创建文件系统:或者直接使用裸硬盘存储数据 ...

最新文章

  1. 偏差是什么?一文读懂偏差
  2. DriverManager 驱动管理器类简介 JDBC简介(三)
  3. vue+iview 设置全局的url以及跨越问题
  4. MX130+python3.7.6+CUDA 10.0+CUDNN 7.4.2+TensorFlow-gpu安装
  5. 设计模式(4)建造者模式/生成器模式(Builder)
  6. Linux watch 监控系统状态
  7. 记录平时编程或者阅读英文文档的时候不认识的英文单词
  8. (转)ZwQuerySystemInformation枚举内核模块及简单应用
  9. 电脑删除的文件怎么恢复?你要找的方案
  10. Angular学习笔记第一节 基本概念
  11. linux挂载硬盘_Linux把内存挂载成硬盘提高读写速度-内存虚拟盘
  12. stm32的rxcallback再debug界面显示没有编译,uC/OS-III
  13. 动态时钟html代码_超炫酷的时钟软件推荐
  14. 史上最详细解说!小白iriver T60拆机
  15. 戴尔笔记本电脑 N4010 14R-468 BOIS简单解析
  16. sublime快捷键操作
  17. 创建一个名为MyFileReader的类,设计一个方法 String read(String fileName, int n),该读取名为fileName的文件,返回文件中第n行的内容
  18. 计算机启动显示不正确的分区表,电脑开机黑屏提示无效的分区表如何解决_电脑开不了机显示无效的分区表如何处理...
  19. 10个办公必备神器PPT网站,免费!!!
  20. 如何利用ChatGPT学习量化投资?

热门文章

  1. 云发布的Docker部署文档
  2. Python版SM2加密
  3. mknod Permission denied
  4. hive中的nvl函数
  5. Qt - QTableView
  6. site about oo
  7. WPF ListView 排序
  8. 【MAC】brew privoxy安装和配置
  9. 到底什么是文件描述符???
  10. 微信分享链接出现config:invalid signature错误的解决方法