OpenStack从数据库恢复Volume状态

问题
OpenStack中很容易导致数据库和真实状态不一致的情况。因为OpenStack中操作基本都是分步完成的,从api接受请求到调度再到具体的操作节点,每一步都有可能更新数据库状态,如果哪一个出错就会直接抛出异常导致整个操作链中断,然后数据库就处于上一个操作后的更新状态。比较典型的就是删除实例,如果在nova-compute出错那这个实例的状态就可能永远处于deleting状态了。

现在我遇到这样一个问题,我有一个Volume挂载在一个实例上,但是不知道什么原因,这个Volume与这个实例的联系断了,在nova-volume通过tgtadm查看发现已经没有客户端连接到该Volume了。但是数据库中该记录还在,这导致以下结果:
1) 删除实例时无法删除,提示“Stderr: 'iscsiadm: No records found'”
2) 无法从实例卸载Volume 。于是只能直接操作数据库了。

与Volume相关的表
数据库中与Volume直接相关的几个表如下所示

OpenStack从数据库恢复Volume状态

操作Volume时数据库的相关数据变化
新建Volume:

  1. select * from volumes where id = 40\G 
  2. *************************** 1. row *************************** 
  3.          created_at: 2012-10-29 07:00:23 
  4.          updated_at: 2012-10-29 07:00:25 
  5.          deleted_at: NULL 
  6.             deleted: 0 
  7.                  id: 40 
  8.              ec2_id: NULL 
  9.             user_id: 397dd3be88b6492caa88521502b07617 
  10.          project_id: c6159a4f3dd34a2b83527499a40dbd2b 
  11.                host: store2.sigsit.org 
  12.                size: 20 
  13.   availability_zone: nova 
  14.         instance_id: NULL 
  15.          mountpoint: NULL 
  16.         attach_time: NULL 
  17.              status: available 
  18.       attach_status: detached 
  19.        scheduled_at: 2012-10-29 07:00:23 
  20.         launched_at: 2012-10-29 07:00:25 
  21.       terminated_at: NULL 
  22.        display_name: test 
  23. display_description:   
  24.   provider_location: 10.61.2.14:3260,5 iqn.2010-10.org.openstack:volume-00000028 1 
  25.       provider_auth: NULL 
  26.         snapshot_id: NULL 
  27.      volume_type_id: NULL 
  28.  
  29. select * from volume_metadata where volume_id = 40\G 
  30.  
  31. select * from iscsi_targets where volume_id = 40\G 
  32. *************************** 1. row *************************** 
  33. created_at: 2012-09-24 09:00:36 
  34. updated_at: 2012-10-29 07:00:24 
  35. deleted_at: NULL 
  36.    deleted: 0 
  37.         id: 205 
  38. target_num: 5 
  39.       host: store2.sigsit.org 
  40.  volume_id: 40 
  41.  
  42. select * from block_device_mapping where volume_id = 40\G 
  43.  
  44. select * from sm_volume where id = 40\G 

相关推荐