openstack-虛擬機在線遷移失敗問題及解決辦法

原博客地址:http://blog.csdn.net/lynn_kong

內容系本人學習、研究和總結,如有雷同,實屬榮幸!


更新歷史;

2013.07.17  該問題在最新的主幹分支中不存在了,因爲nova-scheduler中的代碼有部分重構過,不知是無意還是有意,修復了這個bug

/、雖然修改了,通過這個學習可以瞭解更多


version:OpenStack Grizzly 2013.1.2

hypervisor:KVM

shared  storage: no


1、問題描述

我的環境上有一臺虛擬機,信息如下:

[plain] view plaincopy
  1. root@controller:~# nova show ubuntu_bdm_with_keypair  
  2. +-------------------------------------+----------------------------------------------------------+  
  3. | Property                            | Value                                                    |  
  4. +-------------------------------------+----------------------------------------------------------+  
  5. | status                              | ACTIVE                                                   |  
  6. | updated                             | 2013-07-11T05:15:46Z                                     |  
  7. | OS-EXT-STS:task_state               | None                                                     |  
  8. | OS-EXT-SRV-ATTR:host                | controller                                               |  
  9. | key_name                            | mykey                                                    |  
  10. | image                               | Attempt to boot from volume - no image supplied          |  
  11. | hostId                              | 6c1b0e7f432cdca4fe62380f271d7b83999b3aeee6e6893cc90db44a |  
  12. | OS-EXT-STS:vm_state                 | active                                                   |  
  13. | OS-EXT-SRV-ATTR:instance_name       | instance-00000005                                        |  
  14. | OS-EXT-SRV-ATTR:hypervisor_hostname | controller.konglingxian.com                              |  
  15. | flavor                              | kong.flavor (6)                                          |  
  16. | id                                  | 6cd558d9-e924-4598-8e63-e86a20929bd9                     |  
  17. | security_groups                     | [{u'name': u'default'}]                                  |  
  18. | demo_net1 network                   | 10.1.1.2, 128.3.11.101                                   |  
  19. | user_id                             | 9bfc5979e8774ea99f54ba78d07c3bc0                         |  
  20. | name                                | ubuntu_bdm_with_keypair                                  |  
  21. | created                             | 2013-07-10T07:48:04Z                                     |  
  22. | tenant_id                           | d9a9b59b0be94489a85f51ba3ced15ce                         |  
  23. | OS-DCF:diskConfig                   | MANUAL                                                   |  
  24. | metadata                            | {}                                                       |  
  25. | accessIPv4                          |                                                          |  
  26. | accessIPv6                          |                                                          |  
  27. | progress                            | 0                                                        |  
  28. | OS-EXT-STS:power_state              | 1                                                        |  
  29. | OS-EXT-AZ:availability_zone         | nova                                                     |  
  30. | config_drive                        |                                                          |  
  31. +-------------------------------------+----------------------------------------------------------+  
環境上兩個節點:

[plain] view plaincopy
  1. root@controller:~# nova hypervisor-list  
  2. +----+-----------------------------+  
  3. | ID | Hypervisor hostname         |  
  4. +----+-----------------------------+  
  5. | 1  | compute.konglingxian.com    |  
  6. | 2  | controller.konglingxian.com |  
  7. +----+-----------------------------+  
虛擬機正常運行,對虛擬機執行live-migration操作:

[plain] view plaincopy
  1. nova live-migration --block-migrate 6cd558d9-e924-4598-8e63-e86a20929bd9  

返回的異常信息如下:

[plain] view plaincopy
  1. {  
  2.     "badRequest": {  
  3.         "message": "Live migration of instance 6cd558d9-e924-4598-8e63-e86a20929bd9 to host controller failed",  
  4.         "code": 400  
  5.     }  
  6. }  


2、問題分析

先查看日誌中的異常堆棧:

[plain] view plaincopy
  1. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions Traceback (most recent call last):  
  2. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   
  3. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   File "/usr/lib/python2.7/dist-packages/nova/openstack/common/rpc/amqp.py", line 430, in _process_data  
  4. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions     rval = self.proxy.dispatch(ctxt, version, method, **args)  
  5. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   
  6. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   File "/usr/lib/python2.7/dist-packages/nova/openstack/common/rpc/dispatcher.py", line 133, in dispatch  
  7. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions     return getattr(proxyobj, method)(ctxt, **kwargs)  
  8. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   
  9. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   File "/usr/lib/python2.7/dist-packages/nova/scheduler/manager.py", line 117, in live_migration  
  10. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions     context, ex, {})  
  11. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   
  12. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   File "/usr/lib/python2.7/contextlib.py", line 24, in __exit__  
  13. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions     self.gen.next()  
  14. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   
  15. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   File "/usr/lib/python2.7/dist-packages/nova/scheduler/manager.py", line 96, in live_migration  
  16. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions     block_migration, disk_over_commit)  
  17. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   
  18. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   File "/usr/lib/python2.7/dist-packages/nova/scheduler/driver.py", line 196, in schedule_live_migration  
  19. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions     ignore_hosts)  
  20. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   
  21. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   File "/usr/lib/python2.7/dist-packages/nova/scheduler/driver.py", line 272, in _live_migration_dest_check  
  22. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions     filter_properties)[0]  
  23. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   
  24. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   File "/usr/lib/python2.7/dist-packages/nova/scheduler/filter_scheduler.py", line 146, in select_hosts  
  25. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions     request_spec, filter_properties, instance_uuids)]  
  26. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   
  27. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   File "/usr/lib/python2.7/dist-packages/nova/scheduler/filter_scheduler.py", line 336, in _schedule  
  28. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions     filter_properties)  
  29. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   
  30. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   File "/usr/lib/python2.7/dist-packages/nova/scheduler/host_manager.py", line 342, in get_filtered_hosts  
  31. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions     hosts, filter_properties)  
  32. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   
  33. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   File "/usr/lib/python2.7/dist-packages/nova/filters.py", line 53, in get_filtered_objects  
  34. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions     return list(objs)  
  35. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   
  36. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   File "/usr/lib/python2.7/dist-packages/nova/filters.py", line 39, in filter_all  
  37. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions     if self._filter_one(obj, filter_properties):  
  38. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   
  39. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   File "/usr/lib/python2.7/dist-packages/nova/scheduler/filters/__init__.py", line 30, in _filter_one  
  40. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions     return self.host_passes(obj, filter_properties)  
  41. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   
  42. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   File "/usr/lib/python2.7/dist-packages/nova/scheduler/filters/image_props_filter.py", line 78, in host_passes  
  43. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions     image_props = spec.get('image', {}).get('properties', {})  
  44. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   
  45. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions AttributeError: 'NoneType' object has no attribute 'get'  
  46. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   
  47. 2013-07-10 15:07:44.979 32348 TRACE nova.api.openstack.compute.contrib.admin_actions   
  48. 2013-07-10 15:07:44 INFO [nova.api.openstack.wsgi 673] [32348] HTTP exception thrown: Live migration of instance 6cd558d9-e924-4598-8e63-e86a20929bd9 to another host failed  

原來問題出在調度上,日誌說的很明顯了,是在image_props_filter中出現異常,spec.get('image', {})返回了None,導致python異常。那麼spec.get('image', {})爲什麼返回None呢?從代碼追溯一下spec中的image屬性從何而來:

[python] view plaincopy
  1. if not instance_ref['image_ref']:  
  2.     image = None  
  3. else:  
  4.     image = self.image_service.show(context,  
  5.                                     instance_ref['image_ref'])  
  6. request_spec = {'instance_properties': instance_ref,  
  7.                 'instance_type': instance_type,  
  8.                 'instance_uuids': [instance_ref['uuid']],  
  9.                 'image': image}  
再回頭看一下虛擬機信息,發現這個虛擬機是一個後端卷啓動的虛擬機(boot from volume),至此,問題根因分析清楚。


3、問題解決

有兩種解決方法:
1)修改在線遷移虛擬機的命令參數,強制指定目的主機,跳過schedule的階段,改成如下(注意,如果是後端卷啓動,就不能加--block-migrate參數,詳細原因請參見:http://blog.csdn.net/lynn_kong/article/details/9186201):
[plain] view plaincopy
  1. nova live-migration 6cd558d9-e924-4598-8e63-e86a20929bd9 compute  
2)修改Nova的配置項scheduler_default_filters(默認配置是['RetryFilter', 'AvailabilityZoneFilter', 'RamFilter', 'ComputeFilter', 'ComputeCapabilitiesFilter', 'ImagePropertiesFilter']),將其中的ImagePropertiesFilter刪除,重啓nova-scheduler進程後再次執行遷移,成功。
發佈了108 篇原創文章 · 獲贊 13 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章