分享

openstack nova后端使用ceph rbd(增加在线迁移live_migrate和快照snapshot功能)

问题导读
1、如何获取nova service数据库表所有数据?
2、怎样检测服务是否为alive?
3、怎样判断服务状态呢?






环境:centos6.5 openstack ice版

1、
1.png


2、
2.png


3、
  1. vim /usr/bin/nova-manage
复制代码

3.png

  1. load_entry_point('nova==2014.1.1', 'console_scripts', 'nova-manage')()
  2. 第一个参数定向到 /usr/lib/python2.6/site-packages/nova-2014.1.1-py2.6.egg-info/
复制代码


然后搜索EGG-INFO/entry_points.txt
  1. vim /usr/lib/python2.6/site-packages/nova-2014.1.1-py2.6.egg-info/entry_points.txt
复制代码

4.png


搜索
  1. load_entry_point('nova==2014.1.1', 'console_scripts', 'nova-manage')()
复制代码


第二、第三个参数:
  1. console_scripts、nova-manage
复制代码


得到入口地址为:
  1. nova-manage = nova.cmd.manage:main
复制代码



4、
1.png


2.png


3.JPG



5、
1.png



  1. @args('--host', metavar='<host>', help='Host')
  2.     @args('--service', metavar='<service>', help='Nova service')
  3.     def list(self, host=None, service=None):
  4.         """Show a list of all running services. Filter by host & service
  5.         name
  6.         """
  7.         servicegroup_api = servicegroup.API()
  8.         ctxt = context.get_admin_context()
  9.         services = db.service_get_all(ctxt) #获取nova service数据库表所有数据
  10.         services = availability_zones.set_availability_zones(ctxt, services)
  11.         if host:
  12.             services = [s for s in services if s['host'] == host]
  13.         if service:
  14.             services = [s for s in services if s['binary'] == service]
  15.         print_format = "%-16s %-36s %-16s %-10s %-5s %-10s"
  16.         print(print_format % ( #此处打印出图1.1
  17.                     _('Binary'),
  18.                     _('Host'),
  19.                     _('Zone'),
  20.                     _('Status'),
  21.                     _('State'),
  22.                     _('Updated_At')))
  23.         for svc in services:
  24.             alive = servicegroup_api.service_is_up(svc) #检测服务是否为alive 、重点解析此处的代码根据
  25.             art = (alive and ":-)") or "XXX"
  26.             active = 'enabled'
  27.             if svc['disabled']:
  28.                 active = 'disabled'
  29.             print(print_format % (svc['binary'], svc['host'],
  30.                                   svc['availability_zone'], active, art,
  31.                                   svc['updated_at']))
复制代码


图1.1:
1.png


6、service_is_up:(根据到7讲解is_up函数)
2.png



注:大家可以再下图中看到,判断服务状态,可以有多重方式,有db、还有zookeeper等。从上图可知本次中使用的为db检查服务状态。
3.png


7、讲解is_up函数:
4.png


  1.     def is_up(self, service_ref):
  2.         """Moved from nova.utils
  3.         Check whether a service is up based on last heartbeat.
  4.         """
  5.         last_heartbeat = service_ref['updated_at'] or service_ref['created_at'] #获取服务最后一次更新时间,或者第一次创建时间,最为心跳时间
  6.         if isinstance(last_heartbeat, six.string_types): #此处代码就是将上面获取的心跳时间,转换成datetime时间
  7.             # NOTE(russellb) If this service_ref came in over rpc via
  8.             # conductor, then the timestamp will be a string and needs to be
  9.             # converted back to a datetime.
  10.             last_heartbeat = timeutils.parse_strtime(last_heartbeat)
  11.         else:
  12.             # Objects have proper UTC timezones, but the timeutils comparison
  13.             # below does not (and will fail)
  14.             last_heartbeat = last_heartbeat.replace(tzinfo=None)
  15.         # Timestamps in DB are UTC.
  16.         elapsed = timeutils.delta_seconds(last_heartbeat, timeutils.utcnow()) #此处计算出心跳时间与当前时间的差值
  17.         LOG.debug('DB_Driver.is_up last_heartbeat = %(lhb)s elapsed = %(el)s',
  18.                   {'lhb': str(last_heartbeat), 'el': str(elapsed)})
  19.         return abs(elapsed) <= CONF.service_down_time#此处根据差值来判断服务是否正常(比较时间为配置文件配置。如下图:)
复制代码
5.png


nova.conf中:
6.png


所以最近更新时间,或者第一次创建时间与当前时间间隔少于CONF.service_down_time(60秒),则认为服务alive
从这里也可以得知为什么控制节点和计算节点的时间要一致。

接下来试验验证一下:
7.JPG



现在强制修改数据库表中nova-compute的update_at时间:
由2014-08-04 23:51:24修改为:2014-08-04 22:51:24
8.png



再来查看状态:
9.png


没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条