​这是 OpenStack 实施经验分享系列的第 13 篇。

instance snapshot 操作可用于备份或者将 instance 保存为新的 image。如果在生产系统中执行 snapshot 操作,必须确保此操作快速且安全。这里有两个关键点:

  1. 快速。 
    为保证数据的一致性,snapshot 时需要 pause instance,操作完后再 resume。在这个过程中 instance 是无法对外服务的,为了减少对业务的影响,我们希望 snapshot 越快越好。

  2. 安全。 
    即数据一致性,snapshot 出来的 image 不能有没落盘的数据,能够正常启动。所以通常在执行 snapshot 前要 pause instance,暂停所有的 IO 操作。

默认的 snapshot

默认配置下的 snapshot 操作是否能满足快速和安全这两个条件呢?

snapshot 是对 instance 的镜像文件(系统盘)做快照,镜像文件位于计算节点 /var/lib/nova/instances/<instance id>/disk。在第036篇中我们详细讨论了 snapshot 的执行步骤:

  1. pause instance

  2. 执行 qemu-img convert 命令复制 disk 文件,生成快照文件

  3. resume instance

  4. 将快照文件上传到 Glance

其中第 1 步保证了 安全,而是否 快速 取决于第 2 步要花多长时间。qemu-img convert 的执行时间取决于 disk 及其 backing 文件的大小,通常 instance 系统盘都以 G 为单位,所以第 2 步花费的时间是分钟级别的。

让生产系统暂停几分钟通常是不能被接受的,所以默认的 snapshot 操作没法做到 快速。

解决方案是什么呢?

不靠谱的 live snapshot

Nova 很早就提出了 live snapshot 的替代方案,具体见官网 http://docs.openstack.org/ops-guide/ops-user-facing-operations.html#live-snapshots

live snapshot 的原理是:做快照时不 pause instance,直接执行 qemu-img convert。也就是去掉第 1 和 第 3 步。

这样虽然 快速 条件满足了,业务不会受到影响。但由于没有 pause instance,有可能出现快照过程中不断有新数据写进 disk 文件的情况,很难保证数据的一致性,结果 安全 又成了问题。

官网文档建议:如果要做 live snapshot,用户必须自己保证数据的一致性,比如做快照前确保所有数据已经落盘,并且不会有新数据写进来。个人觉得,live snapshot 基本上没法在生产中使用。

那到底有没有既 安全 又 快速 的方案呢?

真正的解决方案

默认 snapshot 的问题在于 qemu-img convert 耗时太长,而耗时太长的原因是 instance 的系统盘是文件,拷贝文件本身就是一个耗时的操作。真正的解决方案是:

让 instance 从 cinder volume 启动,利用 storage provider 自己的 snapshot 技术实现快速复制。

现代存储系统(无论开源还是商业存储)基本上都提供了 volume 的 snapshot 功能,而这个 snapshot 是基于指针的,不会真正拷贝数据,所以非常快,通常一瞬间就完成,对业务几乎没有影响。所以如果 instance 是从 cinder volume 启动的,那么做快照的时候 OpenStack 就会使用 storage provider 的 snapshot 完成操作。这就实现了既 安全 又 快速。

下面我们使用流行的分布式存储系统 ceph 来演示这个过程。这里省略了 ceph 作为 cinder backend 的配置方法,如果有兴趣可以参考官网 http://docs.ceph.com/docs/master/rbd/rbd-openstack/

boot from volume

部署 instance 时指定创建 volume。

这里我们选择的 image 是 xenial(Ubuntu 16.04),大小为 2.20 GB。确保 Create New Volume 选项为 Yes。Volume Size 为 3(大于 image 2.20 GB)。执行部署后,OpenStack 会完成如下工作:

  1. 在 ceph 中创建一个 3 GB 的 volume。

  2. 将 image 数据拷贝到该 volume。

  3. instance 从该 volume 启动。

在 volume 管理界面可以看到这个新创建的 volume。

ubuntu-test 就是我们部署的 instance。接下来对 ubuntu-test 执行 snapshot 操作。

操作瞬间完成!

注意到快照 snap-test 的 Size 是 0 字节,这是因为它真正的存放位置在 cehp。通过 snap-test 部署出来的 instance 直接就是 boot from volume 的。

boot from volume 其实是 OpenStack 部署 instance 的最佳实践,instance 的启动盘和数据盘都由 cinder 管理,而且做快照和做备份都很方便。

下期预告

到这里,实施经验分享部分就先告一段落。按照之前的计划,接下来是容器技术的内容。不过最近收到很多同学的留言,希望讲一讲 cloud-init 的工作原理和相关应用。

instance 定制化其实是个非常重要的内容,在生产环境中的需求很大。目前最主流的方案就是 cloud-init,当然仅仅 cloud-init 是不够的,还得需要 OpenStack 服务的支持。前面之所以没有讨论,主要是因为这个主题会同时涉及 nova 和 neutron 两大模块,要求的知识和技能比较综合,不过现在则是个非常好的时机。

接下来 CloudMan 会系统讲解 instance 定制化这个主题,从原理到实践力求把它讲透。只是容器部分不得不再多等一下了,见谅见谅。

你真的会 snapshot 吗? - 每天5分钟玩转 OpenStack(163)的更多相关文章

  1. 每天5分钟 玩转OpenStack 目录列表

    最近在学习 OpenStack 的相关知识,一直苦于 OpenStack 的体系庞大以及复杂程度,学习没有进度,停滞不前.偶然机会在 51CTO 上发现了一个热点的专题关于 OpenStack 的,题 ...

  2. 写在最前面 - 每天5分钟玩转 OpenStack(1)

    <每天5分钟玩转 OpenStack>是一个 OpenStack 教程,这是第 1 篇. 这个教程有下面两个特点: 系统讲解 OpenStack 从架构到各个组件:从整体到细节逐一讨论 重 ...

  3. 学习 OpenStack 的方法论 - 每天5分钟玩转 OpenStack(150)

    作为 OpenStack 的核心教程,我们已经到了最后总结的部分. OpenStack 目前已经有好几十个模块,本教程讨论的是最最重要的核心模块:Keystone,Nova,Glance,Cinder ...

  4. cloud-init 典型应用 - 每天5分钟玩转 OpenStack(174)

    本节介绍几个 cloud-init 的典型应用:设置 hostanme,设置用户初始密码,安装软件. 设置 hostname cloud-init 默认会将 instance 的名字设置为 hostn ...

  5. Snapshot Volume 操作 - 每天5分钟玩转 OpenStack(58)

    Snapshot 可以为 volume 创建快照,快照中保存了 volume 当前的状态,以后可以通过 snapshot 回溯.snapshot 操作实现比较简单,流程图如下: 向 cinder-ap ...

  6. Snapshot Instance 操作详解 - 每天5分钟玩转 OpenStack(36)

    本节我们通过日志详细讨论 instance 的 snapshot 操作. 有时候操作系统损坏得很严重,通过 Rescue 操作无法修复,那么我们就得考虑通过备份恢复了.当然前提是我们之前对instan ...

  7. nova-compute 部署 instance 详解 - 每天5分钟玩转 OpenStack(28)

    本节讨论 nova-compute,并详细分析 instance 部署的全过程. 先给大家道个歉:今天这篇文章的篇幅比以往要多一些,本来想分两次发,但考虑到文章的完整和系统性,还是一次发了出来,这次可 ...

  8. Boot from Volume - 每天5分钟玩转 OpenStack(61)

    Volume 除了可以用作 instance 的数据盘,也可以作为启动盘(Bootable Volume),那么如何使 volume 成为 bootable 呢? 现在我们打开 instance 的 ...

  9. Backup Volume 操作 - 每天5分钟玩转 OpenStack(59)

    本节我们讨论 volume 的 Backup 操作. Backup 是将 volume 备份到别的地方(备份设备),将来可以通过 restore 操作恢复. Backup VS Snapshot 初看 ...

随机推荐

  1. HDU4474

    Yet Another Multiple Problem Time Limit: 40000/20000 MS (Java/Others)    Memory Limit: 65536/65536 K ...

  2. 【G】开源的分布式部署解决方案(二) - 好项目是从烂项目基础上重构出来的

    分析目前项目结构 眼前出现这么一坨坨的文件夹,相信很多人已经看不下去了.是的,首先就是要把它给做掉. 按照这个项目文件夹的命名意图,大概可以划分如下: 1.Business:业务代码 2.Data:数 ...

  3. MEAN教程1-MongoDB安装和使用

    MEAN是MongoDB.Express.AngularJS和Node.js的缩写.其理念是仅使用JavaScript一种语言来驱动整个应用.其最鲜明的特点有以下几个:1整个应用只使用一种语言:2整个 ...

  4. 三分钟解读springmvc依赖

    长期以来都在写SSM框架的项目,却未能深入理解框架的搭建原理,而只是浅薄的理解前辈的架构,然后不断套用,项目做过几个,但框架的内涵却没有把握.小编打算今天从SpringMVC的依赖分析做起,一步步进行 ...

  5. jq操作img大小(动态修改)

    今天适配app页面是约到一个问题 当我们要显示后台传过来若干个尺寸不一的图片时,为了保证图片大小的一致性及比例的协调,需要动态改变图片显示尺寸. 通过搜索,我们可以从网上找到实现此功能的jQuery代 ...

  6. 使用JAVA开发微信公众平台(一)——环境搭建与开发接入

    一. 初始微信公众平台 微信公众平台,即我们平时所说的"公众号",曾用名"官方平台"."媒体平台",但最终命名为"公众平台&quo ...

  7. iOS程序生命周期 AppDelegate

    iOS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的. iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受 ...

  8. java gui三个组件的使用

    链接: http://blog.sina.com.cn/s/blog_614f347b0101egah.html 代码: import java.awt.*; import java.awt.even ...

  9. JUnit与JMock学习

    JUnit与JMock学习 测试驱动编程和持续集成部署应该说是现在软件开发者的必备武器,不过跟其他很多好东西一样,在我们公司的推广总要慢上一拍,毕竟老板看的是你能够把功能实现好让客户满意,所以能不折腾 ...

  10. wpf中子窗口的几个问题

    今天研究了一下wpf中的窗口,写这篇文章来总结一下今天的收获.(转载请注明出处~) 总所周知,窗口是windows系统中十分重要的一个元素(从名字上就能体现出来),而一个应用程序总是包含很多窗口(主窗 ...