OpenStack 存储热迁移

2023-05-16

随着存储技术的不断发展,云计算中的存储后端种类越来越多。而在不同存储后端之间进行存储热迁移则是和普遍的需求。在 OpenStack 中,云硬盘(volume)支持在不同后端之间进行数据移。具体的可分为两类,一种是云硬盘未挂载的,另一种是已经挂载的。前一种比较简单,后面一种就是存储热迁移了。下面对这两种方式在 OpenStack 中具体实现简单介绍,此外还介绍如何实现把虚拟机从本地启动的方式热迁移到云硬盘中。

未挂载云硬盘的迁移

detached volume 指未挂载到虚拟机上的 volume,状态为available。对 detached volume 进行迁移的流程比较简单,直接将数据从原来的 volume 拷贝到新的 volume 就可以了。在迁移的过程中需要注意 volume 状态的变化、对异常的处理,保证 volume 状态的一致性。整个流程如图1所示。

3-5

图1  detach volume迁移流程图

下面简单介绍 Cinder(即 OpenStack 中 volume 的管理组件)的实现细节。

  1. cinder-api 接收 migrate 请求
    cinder-api 收到 client 发来的 migrate 请求后,经过 paste.deploy 和 route 的映射,交给 cinder.api.contrib.admin_actions.API 类中的 migrate_volume 方法。该方法首先会检查迁移的目的 host 上的 cinder volume 服务是否正常,然后将目标 volume 的 migration_status 设为migrating。当这些预处理全部完成后,cinder api 通过 rpc 将请求转到 cinder-scheduler。
  2. cinder-scheduler 对目的 host 进行检查
    cinder-scheduler 收到 cinder-api 发过来的请求后,会对迁移的目的 host 进行检查,根据配置文件对 host 进行容量等检查,以判断该 host 能否创建新的 volume。
  3. cinder-volume 处理 migrate
    当 source host 的 cinder-volume 服务收到处理请求后,会执行以下三个操作:
    通过 rpc 调用目的 host 上的 cinder-volume 服务新建一个 volume;
    当新的 volume 创建完毕后,使用 dd 命令进行复制;
    复制完成后,对 volume 的状态进行修改并删除旧的 volume。

已挂载的云硬盘的热迁移

attached volume 指已经挂载到虚拟机,状态是 in-use 的 volume,对 attached volume 进行热迁移需要在不中断虚拟机业务的同时进行 volume 的复制和切换。OpenStack 中使用 libvirt 的 rebase方法来实现 volume 的热迁移。OpenStack API 流程处理如图2所示。

3-1

图2 attach volume热迁移整体流程

如图2所示,attached volume 需要 cinder 和 nova 两个组件共同协作才能完成迁移。下面简单介绍 API 处理流程。

  1. cinder 向 nova 发起 swap volume 请求
    cinder-volume 服务收到 volume migration 请求后,如果发现 volume 状态为 attached,则通过 novaclient 向 nova 发起 swap volume 请求。
  2. nova api 对请求进行预处理
    nova-api 收到该请求后,通过 paste.deploy 和 route 的引导和映射,请求进入 VolumeAttachmentController 的 update方法。该方法先会进行例行检查,如对新旧 volume 的状态进行判断,确保能够执行 detach 和 attach 操作;对虚拟机的 Block Device Mapping 进行检查;中间还会调用 cinderclient 来更新新旧 volume 的状态。这部分的代码逻辑主要是对资源在数据库中的状态进行判断。然后,nova-api 通过 rpc 将请求提交到虚拟机所在主机的nova-compute 服务中,这时候就开始执行 volume 的热迁移了。
  3. nova-compute 调用 libvirt 执行具体的热迁移操作
    nova.compute.manager. ComputeManager 类中的 swap_volume 方法是真正执行的入口,主要流程如图3所示。3-2

     

    图3  swap volume操作流程图

  4. cinder-volume 处理 volume 热迁移后的一些状态更新
    经过 nova 的 swap volume 步骤后,新旧 volume 之间的数据已经复制并同步,并且虚拟机已经使用新的 volume 了。接下来 cinder 需要处理一些数据库相关的信息更新。cinder 会交换新旧 volume 在数据库中的元信息,具体交换的内容为 provider-location 和volume-type 这两个字段,该交换过程如图4所示
    3-33-4

     

    图4 volume信息交换示意图

    现在需要将旧的 volume 的状态改回 attached 并添加新的 attachment 记录,然后把新的 volume 的记录删除。

Ceph RBD 支持

OpenStack 社区目前对 volume 的迁移主要考虑了 LVM 等 iSCSI 协议的后端。对 Ceph RBD 后端的支持比较有限,目前还不支持从 LVM 迁移到 RBD,这时需要进行进一步开发。目前我们进行了相关的测试,使得可以热迁移到 Ceph RBD。

虚拟机系统盘热迁移

虚拟机如果一开始就是从云硬盘启动的,那么我们可以方便地将虚拟机在各个存储后端直接迁移。然而虚拟机如果是从本地镜像启动的,我们想要迁移就比较麻烦了。一种简单的方式是迁移整个虚拟机到其他存储后端的 nova 计算节点上。这里我们介绍另一种方法,直接将虚拟机的本地启动镜像迁移到云硬盘中,同时这个云硬盘还能使用上述的热迁移的方法,进一步迁移到其他存储上。

Libvirt 的 rebase 功能

在讲如何实现迁移到云硬盘功能之前,我们来回顾下 volume 热迁移时提到的 libvirt rebase 方法。Libvirt rebase 主要是用到了 QEMU live block copy 的功能,这个具体在 libvirt 中如何实现我们暂且不讨论。我们来看下 nova 在 swap volume 时如何调用 libvirt rebase 的。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

def _swap_volume(self, guest, disk_path, new_path, resize_to):

    """Swap existing disk with a new block device."""

    dev = guest.get_block_device(disk_path)

 

    # Save a copy of the domain's persistent XML file

    xml = guest.get_xml_desc(dump_inactive=True, dump_sensitive=True)

 

    # Abort is an idempotent operation, so make sure any block

    # jobs which may have failed are ended.

    try:

        dev.abort_job()

    except Exception:

        pass

 

    reraise = False

    try:

    # NOTE (rmk): blockRebase cannot be executed on persistent

    # domains, so we need to temporarily undefine it.

    # If any part of this block fails, the domain is

    # re-defined regardless.

    if guest.has_persistent_configuration():

    guest.delete_configuration()

 

    # Start copy with VIR_DOMAIN_REBASE_REUSE_EXT flag to

    # allow writing to existing external volume file

    dev.rebase(new_path, copy=True, reuse_ext=True)

 

    while not dev.is_job_complete():

        time.sleep(0.5)

 

    dev.abort_job(pivot=True)

    # NOTE(alex_xu): domain.blockJobAbort isn't sync call. This

    # is bug in libvirt. So we need waiting for the pivot is

    # finished. libvirt bug #1119173

    while not dev.is_job_complete():

        time.sleep(0.5)

 

    if resize_to:

        dev.resize(resize_to * units.Gi / units.Ki)

    except Exception:

        dev.abort_job()

        reraise = True

    finally:

    # NOTE(mdbooth): We don't know if we're in exception context or

    # not. reraise=False will not fail if we're not in exception

    # context.

        with excutils.save_and_reraise_exception(reraise=reraise):

            self._host.write_instance_config(xml)

注意到 _swap_volume 函数并没有指定旧的磁盘是否必须是 cinder 提供的 volume,如果被迁移的磁盘是本地的系统盘呢?其实也是可以的。

实现迁移系统盘到云硬盘中

考虑到 _swap_volume 函数也能支持将本地的系统盘迁移到 volume 上,我们可以实现新的 nova API 来调用此函数。

基本步骤如下:

  1. 调用 cinder 创建新的 volume
  2. 调用 libvirt driver 来进行热迁移
  3. 对 nova 中虚拟机的信息进行更新,将虚拟机的状态改为从云硬盘启动

 

 

转载自:http://blog.umcloud.com/openstack-block-live-migrate/

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenStack 存储热迁移 的相关文章

  • cmake:pkg_check_modules

    此文为 xff1a 轻松入门cmake系列教程 理论 是什么 xff1f pkg check modules是 CMake 自己的 pkg config 模块的一个用来简化的封装 xff1a 你不用再检查 CMake 的版本 xff0c 加
  • Unix/Linux编程:针对目录文件描述符的相关操作

    始于版本2 6 16 xff0c Linux内核提供了一系列新的系统调用 xff0c 在执行与传统系统调用相似任务的同时 xff0c 还提供了一些附加功能 xff0c 对某些应用程序非常有用 新 接 口类似的传统接口备 注faccessat
  • ROS:参数服务器通信

    为什么需要 在机器人开发中 xff0c 会有很多参数和设置可以后期需要调整的 xff0c 如果都放到源码里很难实现动态修改和管理 xff0c ROS2为了解决这一问题 xff0c 提出了参数这一通信机制 是什么 如何理解 参数 xff1f
  • MySQL面试:查询性能的优化方法

    实践中如何优化MySQL 四条从效果上第一条影响最大 xff0c 后面越来越小 SQL语句以及索引的优化数据库表结构的优化系统配置的优化硬件优化 查询性能的优化方法 减少请求的数据量 只返回必要的列 xff1a 最好不要使用 SELECT
  • 基础:怎样理解Linux软中断

    软中断 softirq CPU使用率升高也是最常见的一种性能问题 从 取外卖 看中断 中断是系统用来响应硬件设备请求的一种机制 它会打断进程的正常调度和执行 xff0c 然后调用内核中的中断处理程序来响应设备的请求 为什么要有中断呢 xff
  • HTTP:HTTP报文是什么样子的

    引言 如果说HTTP是因特网的信使 xff0c 那么HTTP报文就是它用来搬东西的包裹了HTTP报文是在HTTP应用程序之间发送的数据块 这些数据块以一些文本形式的元信息 meta information 开头 xff0c 这些信息模式了报
  • ROS:服务通信

    话题通信的数据传输是单向的 xff0c 订阅端被动接收发布端的数据 这时候有人就问了 xff0c 如果发布端想主动接收数据怎么办 ROS中提供了另一种通信方式 xff1a 服务通信 ROS xff1a 通信模型 Service通信是双向的
  • linux操作系统:线程,令复杂的项目并行执行

    为什么要有线程 其实 xff0c 对于任何一个进程来讲 xff0c 即使我们没有主动去创建线程 xff0c 进程也是默认会有一个主线程的 线程是负责执行二进制指令的 xff0c 它会根据项目执行计划书 xff08 二进制文件 xff09 一
  • 存储创建及openstack对接——LVM

    说明 本方案是在每一个计算节点 上安装cinder volumes组件来完成对本地存储的管理 若无特殊说明 xff0c 以下步骤仅在计算节点执行 1 前期准备 检查计算节点是否安装 lvm xff0c iscsi 磁盘分区和格式化 裸盘不能
  • clion:输出中文乱码终极解决方案

    临时解决方案 如果在windows时发现clion乱码 xff0c 可以在cmakelist txt中 xff1a c 43 43 在cmakelist txt添加set CMAKE CXX FLAGS 34 CMAKE CXX FLAGS
  • ROS:节点

    节点 ROS xff1a 节点是什么 机器人是各种功能的综合体 xff0c 每一项功能就像机器人的一个工作细胞 xff0c 众多细胞通过一些机制连接到一起 xff0c 成为了一个机器人整体 在ROS中 xff0c 我们给这些 细胞 取了一个
  • VSCode:配置C/C++开发环境

    准备 区分编辑器 编译器 IDE xff1a 作者 xff1a C语言教学 编辑器就是处理文本 xff08 源码 xff09 的程序 xff0c 写代码写的就是文本 xff0c 编辑器可能提供智能提示 代码高亮等辅助功能 xff0c 但不负
  • NXP MIMXRT1052CVL5B + 正点原子 + MCUXpresso IDE 开发环境搭建

    NXP MIMXRT1052CVL5B 43 正点原子 43 MCUXpresso IDE 开发环境搭建 说明资料准备一切就绪 xff0c 搞他安装 IDE 及生成基本工程安装 J Link 及配置开始调试下载点击 运行 按钮 xff0c
  • c语言学习笔记(1) C语言库函数

    1 xff1a ASLL可现实字符 2 xff1a c文件 span class token macro property span class token directive hash span span class token dire
  • 查看ROS的版本

    查看ROS的版本 启动ROS核心 xff1a roscore获取ROS参数 xff1a rosparam get rosdistro
  • ROS 版本选择和安装

    文章目录 声明 xff1a ROS 的版本选择ROS 的安装ROS 的安装方式软件源安装步骤 声明 xff1a 本文中的内容参考了市面上绝大多数畅销的ROS书籍 xff0c 本文只作个人学习记录和学习分享使用 xff0c 不作任何商业用途
  • 数据结构(考研&面试)

    数据结构和算法 xff08 持续更新 xff09 参考清华大学严蔚敏数据结构与算法 适用于考研 amp 求职 数据结构与算法JAVA落地版 Java 数据结构与算法 xff08 代码实现 下载链接 xff09 本教程全部采用C语言实现 1
  • Sphinx入门

    文章目录 Sphinx画流程图和时序图 最近在使用sphinx的时候遇到了一点问题 xff0c 首先是不支持中文检索 xff0c 为此进行了一些配置 xff0c 参考链接 首先安装jieba库 xff0c python3的安装命令是 xff
  • Linux系统信息查看命令大全

    系统 QUOTE uname a 查看内核 操作系统 CPU信息 head n 1 etc issue 查看操作系统版本 cat proc cpuinfo 查看CPU信息 hostname 查看计算机名 lspci tv 列出所有PCI设备
  • linux系统触摸板用不了(解决)

    安装好linux系统可能出现用不了触摸板的情况 xff0c 只可以单击 xff0c 不可以滑动 解决方式一 sudo modprobe psmouse sudo modprobe r psmouse 解决方式二 sudo modprobe

随机推荐

  • 百度移动软件开发面试题(20131018)

    1 new与malloc的区别 xff1f 分析 xff1a 一 new和malloc都是用于申请动态内存 new使用delete释放空间 xff0c malloc使用free释放 new和delete是C 43 43 中的运算符 xff0
  • Ubuntu 中apt update和upgrade 的区别

    转自https blog csdn net csdn duomaomao article details 77802673 简要说明 xff1a apt update xff1a 只检查 xff0c 不更新 xff08 已安装的软件包是否有
  • ubuntu下域名解析出问题的解决办法

    内网服务器配置了固定ip xff0c 未配置dns xff0c 临时需要接入外网时 xff0c 域名解析失败 xff0c 需要临时添加域名解析 操作如下 xff1a sudo vim etc resolv conf 然后底下插入你的好用的d
  • Git clone wiringPi出现Connection reset by peer的解决办法

    Git clone wiringPi出现Connection reset by peer的解决办法 小伙伴们按照正常的方法来安装强大的GPIO库wiringPi一般为如下几步 xff1a git span class hljs keywor
  • Linux内存占用过高?非也

    前言 今天在我的RPi2上测试GPIO程序 xff0c 忽然发现机器超卡 xff0c 重启之后依然如此 于是我top了一下发现了一个问题就是内存爆满 xff01 xff01 可我还啥都没干呢这是咋了 xff1f 于是我呵呵地开始查资料 xf
  • MPC控制笔记(一)

    转自 我的博客 笔记参考1 xff1a Understanding Model Predictive Control Youtube 带自动生成字幕 笔记参考2 xff1a Understanding Model Predictive Co
  • [强化学习笔记专题(二)]Nature DQN

    转自 我的博客 DQN Nature 一 算法流程 xff1a 定义可配置参数 episode 数量 M最大仿真时间 T xff0c g r
  • [强化学习论文] (HDQN) Integrating Temporal Abstraction and Intrinsic Motivation

    转自我的博客 论文 题目 Hierarchical Deep Reinforcement Learning Integrating Temporal Abstraction and Intrinsic Motivation 作者 Tejas
  • 强化学习专题笔记(一) 强化学习基础

    一 长期回报 对于问题的简化 xff0c 采用理想的MDP xff0c 简化问题到具有马尔科夫性 xff0c 对于马尔科夫决策过程而言 xff0c 在理想状态下 xff0c 每一个行动都要为最终的目标最大化长期回报 而努力 max t
  • [马士兵] 一. 初识JAVA 10.notepad++的安装_配置系统环境变量path

    1 安装记事本 xff1a notepad 2 安装 xff1a 一直下一步 3 打开记事本进行设置 xff1a 设置 首选项 xff1a 设置 语言格式设置 xff1a 4 打开notepad 43 43 xff08 1 xff09 方式
  • MPC控制笔记(一)

    转自 我的博客 笔记参考1 xff1a Understanding Model Predictive Control Youtube 带自动生成字幕 笔记参考2 xff1a Understanding Model Predictive Co
  • 【简单数学概念】为什么傅里叶变换能把时域变为频域?

    一 定义 频率 xff1a 在1秒时间内 xff0c 完成相同变化的次数 周期 xff1a 完成1次变化所消耗的时间 两者的关系为 xff1a 频率 61 1 周期 时域 xff1a 描述数学函数或物理信号对时间的关系 xff08 横轴是时
  • 一文彻底搞懂嵌入式中UART、RS232、RS485、CAN协议

    一文彻底搞懂嵌入式中UART RS232 RS485 CAN协议 之前分享过一些使用UART RS232 RS485 CAN协议进行传感器数据读取 伺服电机控制的文章 xff0c 但这些协议之间到底有什么不同 xff0c 工作原理又到底是什
  • ROS回调函数传参

    一 回调函数仅含单个参数 C 43 43 代码 void chatterCallback const std msgs String ConstPtr amp msg ROS INFO 34 I heard s 34 msg gt data
  • eclipse更改tomcat部署路径

    eclipse中默认的项目部署路径是在项目的路径 xff0c 不像myeclipse那样部署后项目在Tomcat的安装路径webapps下 这样虽然可以运行 xff0c 但是不方便开发和调试 xff0c 本文将介绍如何改变eclipse中T
  • OpenStack Neutron 对接OVN 使用 networking-ovn

    OVN是OVS的控制平面 xff0c 它给 OVS 增加了对虚拟网络的原生支持 xff0c 大大提高了 OVS 在实际应用环境中的性能和规模 使用neutron 配置mechanism drivers 为OVN时 xff0c 会有以下优点
  • Openstack Neutron 集成 SDN控制器

    Neutron 集成SDN控制器 一 xff0e Neutron的组成元素 Neutron server 可以理解为一个专门用来接收Neutron REST API 调用的服务器 xff0c 然后负责将不同的REST API分发到不同的ne
  • OpenStack云平台网络模式(flat\flatdhcp\vlan)及其工作机制

    网络 xff0c 是OpenStack的部署中最容易出问题的 xff0c 也是其结构中难以理清的部分 经常收到关于 OneStack部署网络方面问题和OpenStack网络结构问题的邮件 下面根据自己的理解 xff0c 谈一谈OpenSta
  • Openstack卷迁移状态图

  • OpenStack 存储热迁移

    随着存储技术的不断发展 xff0c 云计算中的存储后端种类越来越多 而在不同存储后端之间进行存储热迁移则是和普遍的需求 在 OpenStack 中 xff0c 云硬盘 xff08 volume xff09 支持在不同后端之间进行数据移 具体