分享

【OpenStack】F版和G版中的Availability Zone

本帖最后由 xioaxu790 于 2014-5-27 08:36 编辑
问题导读:
1、Folso版和Grizzly版本的区别有哪些 ?


2、如何在G版中创建主机 ?





对比版本:

Folsom 2012.2 release版
Grizzly 2013.6.3 master分支

Availability Zone的概念在Folsom和Grizzly中,在使用上有很大的不同。怎么确定一个host属于哪个Availability Zone呢?分别看一下F版和G版的实现。

1. F版
之前很多人问,在命令行界面通过nova-manage service list看到有些服务状态(比如nova-compute)不是笑脸,而是XXX,为什么?

回答这个问题之前,我们必须知道服务状态是如何确定的?在F版中,每一个服务启动时都会有一个循环任务report_state,在循环任务中,会向数据库(确切的说是Service表)写入一些信息,比如一个计数report_count以及更新该记录的时间。还是贴点代码以示诚意吧:


  1. <font color="#000"><font face="Arial">def report_state(self):  
  2.     """Update the state of this service in the datastore."""  
  3.     ctxt = context.get_admin_context()  
  4.     zone = FLAGS.node_availability_zone  
  5.     state_catalog = {}  
  6.     try:  
  7.         try:  
  8.             service_ref = db.service_get(ctxt, self.service_id)  
  9.         except exception.NotFound:  
  10.             LOG.debug(_('The service database object disappeared, '  
  11.                         'Recreating it.'))  
  12.             self._create_service_ref(ctxt)  
  13.             service_ref = db.service_get(ctxt, self.service_id)  
  14.   
  15.         state_catalog['report_count'] = service_ref['report_count'] + 1  
  16.         if zone != service_ref['availability_zone']:  
  17.             state_catalog['availability_zone'] = zone  
  18.   
  19.         db.service_update(ctxt,  
  20.                          self.service_id, state_catalog)  
  21.   
  22.         # TODO(termie): make this pattern be more elegant.  
  23.         if getattr(self, 'model_disconnected', False):  
  24.             self.model_disconnected = False  
  25.             LOG.error(_('Recovered model server connection!'))  
  26.   
  27.     # TODO(vish): this should probably only catch connection errors  
  28.     except Exception:  # pylint: disable=W0702  
  29.         if not getattr(self, 'model_disconnected', False):  
  30.             self.model_disconnected = True  
  31.             LOG.exception(_('model server went away'))  </font></font>
复制代码

而判断该服务状态时,就会读取Service表,看当前时刻与该服务上次更新的时间的差值是否在允许的范围内(配置项service_down_time),如果超出了service_down_time,就认为该服务状态异常。所以,总结一下,一个服务状态是XXX的原因,要么是该服务出现了异常,要么是时间不同步导致。

但这跟我要说的Availability Zone有啥关系?

需要注意的是,在report_state中,除了report_count,还有一个更新的字段:availability_zone。该字段来源于配置项node_availability_zone。举个例子,一个nova-compute服务,它的Availability Zone就依赖于配置文件中的node_availability_zone配置项。同时,一个nova-compute仅属于一个AZ。

所以,我们通过nova-manage service list看到的服务所属的zone,也就是管理员在每个计算节点上配置的zone。

还有一点要注意,我们创建aggregate时也可以指定Availability Zone,然后向aggregate中添加主机时,要求主机的zone与aggregate的zone一致。


2. G版

上面的情况在G版发生了比较大的改变。

首先,G版中对服务的管理增加了很多方式,可以是老的更新数据的方式(如果节点不多,可以使用这种,不会对数据库造成大的压力),但如果节点较多,使用数据库的方式就不太明智了,此时可以选择效率较高的memcached或者zookeeper。

同时,Service表中也不再保存availability_zone字段,配置项node_availability_zone也不再使用。那么这时,如何确定一个host属于哪个zone呢?


G版中,默认情况下,对Nova服务分为两类,一类是controller节点的服务进程,如nova-api, nova-scheduler, nova-conductor等;另一类是计算节点进程,nova-compute。对于第一类服务,默认的zone是配置项internal_service_availability_zone,而nova-compute所属的zone由配置项default_availability_zone决定。所以,一个新的环境,我们看到的服务如下:


  1. <font color="#000"><font face="Arial">root@controller23:~# nova-manage service list 2>/dev/null  
  2. Binary           Host                                 Zone             Status     State Updated_At  
  3. nova-cert        controller23                         internal         enabled    :-)   2013-06-03 05:01:42  
  4. nova-conductor   controller23                         internal         enabled    :-)   2013-06-03 05:01:39  
  5. nova-consoleauth controller23                         internal         enabled    :-)   2013-06-03 05:01:42  
  6. nova-scheduler   controller23                         internal         enabled    :-)   2013-06-03 05:01:42  
  7. nova-compute     controller23                         nova             enabled    :-)   2013-06-03 05:01:37  
  8. nova-compute     compute24                            nova             enabled    :-)   2013-06-03 05:01:43  </font></font>
复制代码

可以看到internal和nova两个默认的Availability Zone。



可能是社区的开发人员意识到,让管理员通过配置的方式管理zone不太合适,不够灵活,所以在G版中将这一方式修改。那么如何修改一个host所属的zone呢?这里需要提到G版的另一个改变。


G版中,创建一个aggregate可以指定一个参数availability_zone:


  1. <font color="#000"><font face="Arial">root@controller23:~# nova help aggregate-create  
  2. usage: nova aggregate-create <name> [<availability-zone>]  
  3.   
  4. Create a new aggregate with the specified details.  
  5.   
  6. Positional arguments:  
  7.   <name>               Name of aggregate.  
  8.   <availability-zone>  The availability zone of the aggregate (optional).  </font></font>
复制代码

意思是,创建一个aggregate,同时把它作为一个zone,此时aggregate=zone。因为大家知道,aggregate是管理员可见,普通用户不可见的对象,那么这个改变,就可以使普通用户能够通过使用zone的方式来使用aggregate。



创建完aggregate之后,向aggregate里加主机时,该主机就自动属于aggregate表示的zone。


因此,在G版,可以认为aggregate取代了zone,但同时又不影响aggregate与flavor的配合使用,因为这是两个调度层面。同时又要注意,一个主机可以加入多个aggregate中,所以G版中一个主机可以同时属于多个Availability Zone,这一点与F版也不同。



3. 实践

Folsom已是过去式,这里就在Grizzly环境中实践。我就直接使用我的团队中一个同事的总结截图。

1. 创建aggregate,指定zone

11.png


2. 添加主机

22.png


3. 查询主机与服务所属的zone

33.png

44.png


4. 再将主机加入另一个aggregate,再次查询

20130603133051609.png




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

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

本版积分规则

关闭

推荐上一条 /2 下一条