在nova service启动时,还有一个小地方,需要提一下,那就是service group,听起来可能有些不太好理解,初始化阶段主要有三个动作和其相关:
self.servicegroup_api = servicegroup.API()
self.service_ref = objects.Service.get_by_host_and_binary(ctxt, self.host, self.binary)
self.servicegroup_api.join(self.host, self.topic, self)
关键是第三个动作join, 我们trace一下:在nova/servicegroup/api.py中的join方法:
return self._driver.join(member, group, service)
这self._driver类型有三种:
_driver_name_class_mapping = {
'db': 'nova.servicegroup.drivers.db.DbDriver',
'zk': 'nova.servicegroup.drivers.zk.ZooKeeperDriver',
'mc': 'nova.servicegroup.drivers.mc.MemcachedDriver'
}
默认为db,还有zookeeper与memcached两种,一看到zookeeper,就大概知道servicegroup的主要功能应该是统一系统状态,
hadoop中zookeeper也发挥了重要的作用,zookeeper本身的思想还是很有意思的,在marklink中有一篇不错的文章。
再看DbDriver的join方法,注册了一个period任务,定时调用_report_state方法,报告service的状态,即host上对topic进行处理的
service是否是connect状态。
三个driver都有自己的is_up函数,配置Driver之后,在openstack中需要判断service时候仍处于connected状态时候便到了其发挥作用之时:
例如在live_migration时候判断compute service时候仍在工作状态,
scheduler中调度compute node时候也判断了service的情况,等等。
mark link:
zookeeper: http://cailin.iteye.com/blog/2014486/
memcached: http://blog.sina.com.cn/s/blog_493a845501013ei0.html