Cinder卷迁移流程

  • Post author:
  • Post category:IT
  • Post comments:0评论

Cinder卷迁移流程

Openstack支持不同后端间的卷迁移,Cinder中的卷迁移流程如下:

(1)存储后端自身提供卷迁移,这种方式需要存储后端支持卷迁移特性。在LVM存储后端中,源卷和目的卷需在同一个服务器上的不同backend上,且当前卷未挂载的情况下, LVM可通过自身迁移的方式迁移卷。

(2)如果存储后端不支持迁移特性,则通过Host完成卷迁移,分为两种情况:

  • (a)当前卷处于未挂载状态,则通过块存储服务将原卷的数据拷贝到目的卷
  • (b)当前卷处于挂载状态,则通过Nova计算节点进行卷的热迁移(利用Libvirt中卷的热迁移特性进行迁移)

Cinder中卷迁移的核心函数调用关系如下图所示(以LVM存储后端为例):

VolumeManager
                       migrate_volume()
                             |
                   +--------------------+
            【1】  |                    |
       force_host_copy=False         not moved   
                   |                    |
             LVMISCSIDriver        VolumeManager                          
        driver.migrate_volume()  _migrate_volume_generic()                 
                   |                    |
         volutils.copy_volume()   rpcapi.create_volume()
               dd命令拷贝               |                                   
                                        |                                   
                          +--------------------------+
                   【2】  |                          |  【3】                  
                       not attach                 attached
                          |                          |                       
                     VolumeDriver          nova_api.update_server_volume()
               driver.copy_volume_data()             |             
                          |                          |
                     VolumeDriver               ComputeManager        
               self._attach_volume(dest_vol)     swap_volume()        
               self._attach_volume(src_vol)          |
                          |                          |                 
              volume_utils.copy_volume()        LibvirtDriver
                     dd命令拷贝               driver.swap_volume()
                          |                          |
                     VolumeDriver                    |                      
               self._detach_volume(src_vol)          |
               self._detach_volume(dest_vol)   domain.blockRebase()

说明:

  • force_host_copy表示是否强制通过Host进行卷的迁移动作
  • force_host_copy默认值为false,则首先会进入流程①,如果底层存储不支持卷迁移或迁移失败,则返回not moved,进入流程②或③
  • 卷的冷迁移最终都是采用dd命令完成
  • 若当前卷处于挂载状态,则通过Nova进行迁移(流程③),最终调用Libvirt接口进行热迁移

发表评论