本文转载自微信公众号《新钛云服务》,作者舒竹。转载本文请联系新钛云服务公众号。最近自己手动搭建了一个openstack环境。创建硬盘时失败。我查看了日志,提示无法进行调度。怀疑是cinder节点有问题。去cinder节点查看服务,状态正常。systemctlstatusopenstack-cinder-volume.service然后查看控制节点上的cinder服务。openstack卷服务列表正常显示:结果显示cinder-volume状态为down。查看日志,发现没有报错信息。重启cinder的各项服务后,依旧没有报错信息。于是,我最终决定追源码(注:本文代码对应OpenStackTrain版本)。找到openstack卷服务列表对应的实现代码。now=timeutils.utcnow(with_timezone=True)由于controller节点上启动了openstack-cinder-api.servic服务,所以获取的是controller节点的当前时间。services=objects.ServiceList.get_all(context,filters)最终会从cinder数据库的services表中获取所有的服务数据。alive=abs(delta_sec)<=CONF.service_down_time,比较时间差的绝对值是否小于配置的service_down_time,其中service_down_time默认时间为60s。cfg.IntOpt('service_down_time',default=60,help='Maximumtimesincelastcheck-inforaservicetobe''consideredup'),art="up"如果aliveelse"down"相差小于60,则服务状态为up,否则它就下来了。可以看出,cinder服务的状态值取决于cinder数据库中service表中每行数据的updated_at列的值和当前controller节点的时间差是否在配置的范围内。问题解决上述cinder-volumedown的原因是因为运行openstack-cinder-volume.service服务的存储节点与controller节点的时间相差太大。为了保证状态为up,两个节点的时间差必须在service_down_time-report_interval之间。默认情况下,差异为50秒。于是同步了两台服务器的时间后,再次查看,发现cinder-volume的状态已经变成了up。CinderService更新机制下面说说CinderService的更新机制。report_interval默认时间为10s,cfg.IntOpt('report_interval',default=10,help='Interval,inseconds,betweennodesreportingstate''todatastore'),
