VMware 虚拟化编程(13) — VMware 虚拟机的备份方案设计

目录

前文列表

VMware 虚拟化编程(1) — VMDK/VDDK/VixDiskLib/VADP 概念简析
VMware 虚拟化编程(2) — 虚拟磁盘文件类型详解
VMware 虚拟化编程(3) —VMware vSphere Web Service API 解析
VMware 虚拟化编程(4) — VDDK 安装
VMware 虚拟化编程(5) — VixDiskLib 虚拟磁盘库详解之一
VMware 虚拟化编程(6) — VixDiskLib 虚拟磁盘库详解之二
VMware 虚拟化编程(7) — VixDiskLib 虚拟磁盘库详解之三
VMware 虚拟化编程(8) — 多线程中的 VixDiskLib
VMware 虚拟化编程(9) — VMware 虚拟机的快照
VMware 虚拟化编程(10) — VMware 数据块修改跟踪技术 CBT
VMware 虚拟化编程(11) — VMware 虚拟机的全量备份与增量备份方案
VMware 虚拟化编程(12) — VixDiskLib Sample 程序使用

备份思路

  • 在目标虚拟机上创建临时快照
  • 从目标虚拟机上获取备份数据,并保存备份数据
  • 删除临时快照

备份算法

  • 连接到备份目标虚拟机所在的 VC/ESXi
  • 使用 vSphere WS API 开启备份目标虚拟机的 CBT (视情况而定)
  • 使用 vSphere WS API 的 CreateSnapshot_Task 创建备份目标虚拟机的临时快照,如果备份要求「应用一致性」那么需要设置参数 quiescent=True
  • 获取备份目标虚拟机的虚拟磁盘数据以及虚拟机配置信息
  • 使用 VDDK 打开并读取备份目标虚拟机的虚拟磁盘和快照文件数据
  • 将虚拟磁盘、快照文件、配置信息等数据一起复制到备份存储
  • 使用 vSphere WS API 删除临时快照

备份细节

连接到 vCenter 还是 ESXi?

VMware 官方建议备份应用程序选择与 vCenter 服务器建立通信,而非 ESXi 主机。最主要的原因在于 vCenter 服务器为使用 vSphere WS API 的开发者提供了目标对象定位的透明性。由 vCenter 服务器负责跟踪目标虚拟机在不同 ESXi 主机之间的迁移,并且会隐式的将 SDK 操作重定向到当前运行目标虚拟机的 ESXi 主机。

并且 VMware 官方建议开发者应该最小化连接或会话的数量,以降低 vSphere 的资源负载。对备份应用程序来说,最好只创建一个会话,并在所有需要和 vSphere 进行交互的模块中共享该会话。这就意味着如果你希望备份应用程序支持多线程,那么你应该引入访问控制块来对连接的访问进行互斥。

如何选择快照类型?

创建临时快照时,需要充分考虑虚拟机备份的级别,根据不同的级别来创建不同类型的临时快照。EXAMPLE:

  • 只关注磁盘数据完整性的备份级别 ==> 创建崩溃一致性快照
  • 需要关注业务系统一致性的备份级别 ==> 创建 Quiseced 快照

如果是后者的话,则需要将 CreateSnapshot_Task 的「quiesce」和「memory」参数均设置为 TRUE,前置会使 FileSystem 处于静置状态,后者则允许在快照中包含开启电源状态下的虚拟机内存状态,以此获得一个「静置快照」。否则,创建出的快照会存在过渡期的系统状态,还原这种状态下的快照数据很可能会破坏业务系统的运行时状态;

NOTE:「quiesce」和「memory」标识有效的保证了备份虚拟机的文件系统一致性和应用一致性。

还有一点需要注意的是,在执行完备份之后,临时快照就无用了,切记将其删除。快照会影响到虚拟机的性能,以及占用存储空间。

是否开启 CBT?

CBT 是实现增量备份的底层支撑,如果你需要进行更加有利于节省存储空间增量备份的话,通常需要在第一个快照创建之前开启 CBT。但实际上 CBT 也存在着一些使用的限制,具体请浏览 《VMware 虚拟化编程(10) — VMware 数据块修改跟踪技术 CBT》

是否开启 CBT 的关键除了其自身使用上的限制之外,还要考虑备份目标虚拟机的重要性。如果备份目标虚拟机内运行的是核心业务系统,而且存储资源又比较充裕,那么我会建议关闭 CBT,选择使用完全备份。
1. CBT 会占用可测量的性能资源;
2. CBT 的稳定性存在着隐患;

如何获取备份数据?

获取虚拟机的备份数据需要集齐以下关键要素:

  • Snapshot MoRef:快照实际上就是虚拟磁盘的备份版本,通过 Snapshot MoRef 我们可以获取虚拟磁盘的名称和路径等信息。例如:从 Snapshot Managed Object 的 ConfigInfo 开始,能够查找到快照中所有虚拟磁盘的 BackingInfo,我们能够从这些 BackingInfo 中找到虚拟机所有虚拟磁盘相应的 changeId。所以尤其在多虚拟磁盘的场景中,如何有效的对不同的虚拟磁盘进行标识,是一个非常重要的前提条件。

  • VixDiskLib 库函数:在对虚拟磁盘进行了有效的标识之后,我们需要使用 VixDiskLib 所提供的「接口函数集」来获取实际的虚拟磁盘数据。之所以将其称之为「接口函数」,是因为 VixDiskLib 向开发者透明了虚拟磁盘操作的细节。例如,调用 VixDiskLib_Open 和 VixDiskLib_Read 函数时,VixDiskLib 允许以扇区为单位(in Sector)来访问虚拟磁盘数据,所以传输的数据总量是扇区大小的整数倍。可以看出,VixDiskLib 库函数的调用就犹如接口函数调用一般的简单直接。

  • Metadata:虚拟磁盘的元数据,是描述了虚拟磁盘配置信息的一系列键值对,包含了磁盘卷标、LUN、分区布局、链接个数、文件属性、RDM、锁等关键信息,在还原一个虚拟磁盘的时候起到了至关重要的作用。元数据信息可以通过 VixDiskLib_ReadMetadataKeys 和 VixDiskLib_ReadMetadata 来获得。

  • VixMntapi:VixMntapi 库可以获取虚拟磁盘中的 GuestOS 相关信息(如:操作系统类型等)。更重要的是 VixMntapi 支持将卷直接挂载到设备节点上,这样就能够执行面向文件的备份与还原了。

如何提高备份数据的传输率?

掌握以下使用要点,就能够有效的提高备份数据的传输率:

  • 在备份应用程序中选择使用增强型连接函数 VixDiskLib_InitEx 和 VixDiskLib_ConnectEx,增量型连接函数支持使用高级数据传输模式 SAN 和 SCSI HotAdd

  • 如果备份场景主需要读取虚拟磁盘数据,而无需修改磁盘数据的话。调用 VixDiskLib_ConnectEx 时候可以通过传入 readOnly=TRUE 来启用高性能只读访问。

  • 如果在 Linux 上使用 SAN 存储的场景中,可以选择「direct」直接读写模式 O_DIRECT,「direct」模式会阻止其他进程访问最新的虚拟磁盘数据,这意味着磁盘数据的读写都不会存在任何的缓存,这样能够避免提交写缓存前由于进程终止所造成的信息丢失。而且备份一个虚拟磁盘通常都是连续的读取不同扇区中的数据,开启 Cache 机制实际上反而降低了性能。如果备份应用按照下列原则进行读写操作,能够达到最佳的效率:

    • 在 SAN 中执行读写操作的数据偏移都应该是 Page Size 的整数倍。
    • 传输的长度应该是 Page Size 的整数倍。
    • 数据传输的缓冲区应该是页边界对齐的。

备份厚置备磁盘和精简置备磁盘有什么区别?

厚置备磁盘在 Datastore 中会直接占用其分配的所有数据空间,而精简置备磁盘只会消耗其实际使用了的数据空间,所以备份精简置备磁盘的速度会更快。

需要注意的是,厚置备磁盘又细分为「即时清零厚置备磁盘」和「延迟清零厚置备磁盘」。对于前者的全量备份而言,是否开启 CBT 的影响并不大,因为始终都会备份其所分配的容量。但对于后者的全量备份而言就有区别了,如果在全量备份一个「延迟清零厚置备磁盘」前没有开启 CBT 的话,VixDiskLib 会读取虚拟磁盘所有的扇区,并将实际没有使用到的空扇区(本来会被延迟清零的扇区)中的脏数据全部重置为 0,然后再进行备份。也就是说如果「延迟清零厚置备磁盘」在进行全量备份之前没有开启 CBT 的话,其备份数据量上是与「即时清零厚置备磁盘」一样的,而且还损耗了置零的时间,使用这样的备份数据恢复出来的虚拟磁盘类型也是「即时清零厚置备磁盘」。所以建议在对「延迟清零厚置备磁盘」进行全量备份前开启 CBT 功能,实际上如果是增量备份的场景,无论是什么类型的虚拟磁盘,都应该建议开启 CBT。

还有一点需要注意的是,精简置备虚拟磁盘的数据空间是动态的,所以其很可能不是一片连续的数据空间,其在数据存储中实际的数据空间是在第一次写入数据时才被创建的(created on first write)。所以与使用 NBD/NBDSSL/HotAdd 的厚置备磁盘相比,精简置备磁盘在首次写入时需要额外的数据块分配性能开销,不过一旦精简置备磁盘的数据空间被创建之后,其性能就与厚置备类型相差无几了。重要的是,在虚拟机对精简置备磁盘进行随机 I/O 或写操作的同时进行备份的话,即便开启的 CBT,所备份出来的数据量也很可能会大于预期的数据量。对于这种情况,进行虚拟磁盘碎片整理可能会有助于减小备份的数据量。

Thin 精简置备虚拟磁盘

在保护之前不存在 Snapshot (changeId == '*'),开启 CBT 并执行增量保护所保护的数据量是「实际已使用」的数据空间。
在保护之前已经存在 Snapshot (changeId != '*'),开启 CBT 并执行全量保护所保护的数据量是「已分配」的数据空间。

Thick-Lazy 延迟置零的厚置备虚拟磁盘

在保护之前不存在 Snapshot (changeId == '*'),开启 CBT 并执行增量保护所保护的数据量是「实际已使用」的数据空间。
在保护之前已经存在 Snapshot (changeId != '*'),开启 CBT 并执行全量保护所保护的数据量是「已分配」的数据空间。

Thick-Eager 立即置零的厚置备虚拟磁盘

在保护之前不存在 Snapshot (changeId == '*'),开启 CBT 并执行增量保护所保护的数据量是「已分配」的数据空间。
在保护之前已经存在 Snapshot (changeId != '*'),开启 CBT 并执行全量保护所保护的数据量是「已分配」的数据空间。

有什么磁盘类型是无法进行备份的?

一般来说,RDM 类型的虚拟磁盘是无法进行备份的,因为物理兼容的 RDM 磁盘设备无法进行快照。备份应用应该忽略这些无法进行快照的独立磁盘,如果创建快照,就会抛出错误。

已标记关键词 清除标记
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题设计,可以完美修复该问题。本程序中包含了最新版的DirectX redist(Jun2010),并且全部DX文件都有Microsoft的数字签名,安全放心。 本程序为了应对一般电脑用户的使用,采用了易用的一键式设计,只要点击主界面上的“检测并修复”按钮,程序就会自动完成校验、检测、下载、修复以及注册的全部功能,无需用户的介入,大大降低了使用难度。在常规修复过程中,程序还会自动检测DirectX加速状态,在异常时给予用户相应提示。 本程序适用于多个操作系统,如Windows XP(需先安装.NET 2.0,详情请参阅“致Windows XP用户.txt”文件)、Windows Vista、Windows 7、Windows 8、Windows 8.1、Windows 8.1 Update、Windows 10,同时兼容32位操作系统和64位操作系统。本程序会根据系统的不同,自动调整任务模式,无需用户进行设置。 本程序的V4.0版分为标准版、增强版以及在线修复版。所有版本都支持修复DirectX的功能,而增强版则额外支持修复c++的功能。在线修复版功能与标准版相同,但其所需的数据包需要在修复时自动下载。各个版本之间,主程序完全相同,只是其配套使用的数据包不同。因此,标准版和在线修复版可以通过补全扩展包的形式成为增强版。本程序自V3.5版起,自带扩展功能。只要在主界面的“工具”菜单下打开“选项”对话框,找到“扩展”标签,点击其中的“开始扩展”按钮即可。扩展过程需要Internet连接,扩展成功后新的数据包可自动生效。扩展用时根据网络速度不同而不同,最快仅需数秒,最慢需要数分钟,烦请耐心等待。如扩展失败,可点击“扩展”界面左上角小锁图标切换为加密连接,即可很大程度上避免因防火墙或其他原因导致的连接失败。 本程序自V2.0版起采用全新的底层程序架构,使用了异步多线程编程技术,使得检测、下载、修复单独进行,互不干扰,快速如飞。新程序更改了自我校验方式,因此使用新版本的程序时不会再出现自我校验失败的错误;但并非取消自我校验,因此程序安全性与之前版本相同,并未降低。 程序有更新系统c++功能。由于绝大多数软件运行时需要c++的支持,并且c++的异常也会导致0xc000007b错误,因此程序在检测修复的同时,也会根据需要更新系统中的c++组件。自V3.2版本开始使用了全新的c++扩展包,可以大幅提高工业软件修复成功的概率。修复c++的功能仅限于增强版,标准版及在线修复版在系统c++异常时(非丢失时)会提示用户使用增强版进行修复。除常规修复外,新版程序还支持C++强力修复功能。当常规修复无效时,可以到本程序的选项界面内开启强力修复功能,可大幅提高修复成功率。请注意,请仅在常规修复无效时再使用此功能。 程序有两种窗口样式。正常模式即默认样式,适合绝大多数用户使用。另有一种简约模式,此时窗口将只显示最基本的内容,修复会自动进行,修复完成10秒钟后会自动退出。该窗口样式可以使修复工作变得更加简单快速,同时方便其他软件、游戏将本程序内嵌,即可进行无需人工参与的快速修复。开启简约模式的方法是:打开程序所在目录下的“Settings.ini”文件(如果没有可以自己创建),将其中的“FormStyle”一项的值改为“Simple”并保存即可。 新版程序支持命令行运行模式。在命令行中调用本程序,可以在路径后直接添加命令进行相应的设置。常见的命令有7类,分别是设置语言的命令、设置窗口模式的命令,设置安全级别的命令、开启强力修复的命令、设置c++修复模式的命令、控制Direct加速的命令、显示版权信息的命令。具体命令名称可以通过“/help”或“/?”进行查询。 程序有高级筛选功能,开启该功能后用户可以自主选择要修复的文件,避免了其他不必要的修复工作。同时,也支持通过文件进行辅助筛选,只要在程序目录下建立“Filter.dat”文件,其中的每一行写一个需要修复文件的序号即可。该功能仅针对高级用户使用,并且必须在正常窗口模式下才有效(简约模式时无效)。 本程序有自动记录日志功能,可以记录每一次检测修复结果,方便在出现问题时,及时分析和查找原因,以便找到解决办法。 程序的“选项”对话框中包含了7项高级功能。点击"常规”选项卡可以调整程序的基本运行情况,包括日志记录、安全级别控制、调试模式开启等。只有开启调试模式后才能在C
<p> <span style="color:#337FE5;"><strong>【为什么还需要学习C++?】</strong></span> </p> <p style="margin-left:0cm;"> 你是否接触很多语言,但从来没有了解过编程语言的本质? </p> <p style="margin-left:0cm;text-align:start;"> 你是否想成为一名资深开发人员,想开发别人做不了的高性能程序? </p> <p style="margin-left:0cm;text-align:start;"> 你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹? </p> <p style="margin-left:0cm;text-align:start;">   </p> <p style="margin-left:0cm;text-align:start;"> 那么C++就是你个人能力提升,职业之路进阶的不二之选。 </p> <p style="margin-left:0cm;text-align:start;"> <br /> </p> <p style="margin-left:0cm;text-align:start;"> <br /> </p> <p style="margin-left:0cm;"> <strong><span style="color:#337FE5;">【课程特色】</span></strong> </p> <p style="margin-left:0cm;text-align:start;"> 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。 </p> <p style="margin-left:0cm;text-align:start;"> 2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。 </p> <p style="margin-left:0cm;text-align:start;"> 3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。 </p> <p style="margin-left:0cm;text-align:start;"> <br /> </p> <p class="ql-long-24357476"> <span style="color:#337FE5;"><strong>【学完后我将达到什么水平?】</strong></span> </p> <p class="ql-long-24357476"> 1.对C++的各个知识能够熟练配置、开发、部署; </p> <p class="ql-long-24357476"> 2.吊打一切关于C++的笔试面试题; </p> <p class="ql-long-24357476"> 3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。 </p> <p class="MsoNoSpacing" style="margin-left:18pt;"> <br /> </p> <div> <br /> </div> <p> <br /> </p> <p style="margin-left:0cm;text-align:start;"> <span style="color:#337FE5;"><strong>【面向人群】</strong></span> </p> <p style="margin-left:0cm;text-align:start;"> <span style="color:#222226;font-family:PingFangSC-Regular, "font-size:14px;background-color:#FFFFFF;">1.希望一站式快速入门的C++初学者;</span> </p> <p style="margin-left:0cm;text-align:start;"> <span style="color:#222226;font-family:PingFangSC-Regular, "font-size:14px;background-color:#FFFFFF;">2.希望快速学习 C++、掌握编程要义、修炼内功的开发者;</span> </p> <p style="margin-left:0cm;text-align:start;"> <span style="color:#222226;font-family:PingFangSC-Regular, "font-size:14px;background-color:#FFFFFF;">3.有志于挑战更高级的开发项目,成为资深开发的工程师。</span> </p> <p style="margin-left:0cm;text-align:start;"> <br /> </p> <p> <br /> </p> <p> <span style="color:#337FE5;"><strong>【课程设计】</strong></span> </p> <p> 本课程包含3大模块 </p> <p> <strong>基础篇</strong><br /> 本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。 </p> <p> <br /> <strong>进阶篇</strong><br /> 本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。 </p> <p> <br /> <strong>提升篇:</strong><br /> 本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。 </p> <p> <img src="https://img-bss.csdnimg.cn/202007091130239667.png" alt="" /> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页