OpenStack Cinder服务状态排错

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

systemctl status openstack-cinder-volume.service

然后在控制节点查看cinder服务,openstack volume service list

正常情况下显示:

OpenStack Cinder服务状态排错

结果显示cinder-volume的state为down,查看日志发现没有任何错误信息,重启cinder的各种服务仍然没有效果,最后决定跟踪源码(说明:文中代码对应的是OpenStack Train版)。

找到openstack volume service list对应的实现代码。

OpenStack Cinder服务状态排错

now = timeutils.utcnow(with_timezone=True) 

由于openstack-cinder-api.servic服务在controller节点启动,所以获取的是controller节点的当前时间。

services = objects.ServiceList.get_all(context, filters)最终会从cinder数据库的services表中获取所有服务数据。

OpenStack Cinder服务状态排错

alive = abs(delta_sec) <= CONF.service_down_time,比较时间差的绝对值是否小于配置的service_down_time,其中service_down_time默认时间是60s。

cfg.IntOpt('service_down_time',

           default=60,

           help='Maximum time since last check-in for a service to be '

           'considered up'),

art = "up" if alive else "down" 差值小于60,则service 状态为 up,否则为down由此可见cinder servicestate值取决于cinder数据库中 service 表每行数据的 updated_at 列的值和当前 controller 节点的时间差是否在配置的范围之内。

解决问题

上面cinder-volume出现down的原因就是因为运行openstack-cinder-volume.service服务的存储节点时间与controller节点时间差值过大。为了保证状态为up,必须保证两节点的时间差在service_down_time - report_interval之内,默认情况下,差值为50秒。所以同步两台服务器时间之后,再次查看,发现cinder-volume的state变为up。

cinder服务更新机制

下面说下 Cinder Service 的更新机制。

OpenStack Cinder服务状态排错

report_interval默认时间是10s,

cfg.IntOpt('report_interval',

           default=10,

           help='Interval, in seconds, between nodes reporting state '

           'to datastore'),




OpenStack Cinder服务状态排错









了解新钛云服

新钛云服正式获批工信部ISP/IDC(含互联网资源协作)牌照

TiOps,支持多云环境安全远程运维,疫情期间免费对外开放,助力远程安全办公!

深耕专业,矗立鳌头,新钛云服获千万Pre-A轮融资

新钛云服,打造最专业的Cloud MSP+,做企业业务和云之间的桥梁

新钛云服一周年,完成两轮融资,服务五十多家客户

上海某仓储物流电子商务公司混合云解决方案

新钛云服出品的部分精品技术干货

国内主流公有云VPC使用对比及总结

万字长文:云架构设计原则|附PDF下载

刚刚,OpenStack 第 19 个版本来了,附28项特性详细解读!

Ceph OSD故障排除|万字经验总结

七个用于Docker和Kubernetes防护的安全工具

运维人的终身成长,从清单管理开始|万字长文!

OpenStack与ZStack深度对比:架构、部署、计算存储与网络、运维监控等

什么是云原生?

IT混合云战略:是什么、为什么,如何构建?

OpenStack Cinder服务状态排错