一个块是一个连续的字节序列(例如一个512字节的连续数据是一个块)。基于块的存储接口通常是旋转介质,例如磁盘、光盘、软盘等。块设备接口的普及使得可以用虚拟的块设备成为和大容量数据存储系统交互的接口,如Ceph这样的系统。

注意:内核模块可以使用Linux页缓存。 对于基于librbd的应用,Ceph支持RBD缓存。

Ceph的块设备可以在为Linux的内核,KVM虚拟机,以及像OpenStack和CloudStack这种使用libvirt的云计算平台提供高性能和无限可扩展的的存储。Ceph支持在集群中同时运行Ceph的RADOS网关,Ceph的文件系统和Ceph的块存储。

块设备命令

rbd的命令能够创建、列出、内省、和删除块设备镜像。你一可以使用其来克隆镜像,创建快照,回滚快照,查看快照等。跟详细的信息可以参阅管理RADOS块设备镜像

创建一个镜像

使用镜像之前,必须在Ceph的存储集群中创建镜像。执行下面的命令:

rbd create {镜像名称} --size {镜像大小} --pool {存储池名称}

例如,在名为swinmmingpool中创建一个1GB的名字为foo的镜像:

rbd create foo --size 1024
rbd create bar --size 1024 --pool swimmingpool

你必须首先创建一个存储池(pool)

列出镜像

rbd ls
rbd ls {poolname}

获取镜像信息

rbd --image {image-name} info
rbd --image {image-name} -p {pool-name} info

改变镜像大小

rbd resize --image foo --size 2048

删除镜像

rbd rm {image-name}
rbd rm {image-name} -p {pool-name}

快照

快照是一个镜像在某一个特定时间点的只读拷贝。其中Ceph块设备的高级功能是能够创建快照保留镜像的历史状态。Ceph支持快照分层,允许快速克隆镜像。 Ceph还支持使用RDB和如KVM,libvirt等创建快照。

当做快照时需要停止I/O。如果镜像包含文件系统,文件系统必须在做快照前保持一致性

基本的快照

创建快照

rbd --pool rbd snap create --snap snapname foo
rbd snap create rbd/foo@snapname

快照回滚

rbd --pool rbd snap rollback --snap snapname foo
rbd snap rollback rbd/foo@snapname

注意:回滚快照就是将当前镜像的数据用快照重新替换。回滚的执行时间随着镜像大小的增加而增加。克隆将会比回滚快照更花时间。

分层快照

Ceph支持创建许多copy-on-write(COW)的克隆快照。 分层快照支持Ceph快设备的客户端快速创建镜像。例如,你可能创建了一个虚拟机的镜像并写入了一些数据。然后,做一个快照,保护这个快照,按照需要创建许多copy-on-write的克隆。一个快照是只读的,所以克隆快照语义上的简化让克隆的速度很快。

笔记:Parent和Child意味着一个snapshot是parent,克隆镜像是child。

每一个child存储着一个与之相关的parent镜像,能够让克隆镜像打开parent快照并从中读数据。

一个COW的克隆快照的表现形式是一个Ceph的块设备。你可以读、写、克隆和调整镜像的大小。对克隆的快照并没有更多的限制,但是克隆镜像依赖于一个之前的快照,所以你必须在克隆镜像之前保护快照。下面的图表描述了这个过程。

注意 Ceph仅仅支持两种形式的镜像。1)通过rbd创建的镜像。2)不被kernel的rbd模式支持。你必须使用qemu/kvm或者librbd直接通过克隆的方式进行。

制作分层快照

Ceph的分层快设备是一个简单的过程。你必须首先有一个镜像、创建一个这个镜像的快照,保护这个快照。一旦你做完了这三个步骤,你能够开始克隆快照。

克隆镜像必须制定一个parent快照,包括这个快照所在的pool ID、image ID和snapshot ID。包含pool ID意味着可以从另外一个pool中克隆快照。

  1. 镜像模版: 一种通用的使用分层快照的方法是创建一个主镜像和一个快照提供克隆的模版。例如,一个用户可以创建一个Linux发行版的镜像,安装完成后生成一个快照。之后对快照进行保护后克隆快照。
  2. 扩展模版: 一种更为高级的方式制作模版。例如,一个用户可能克隆了一个镜像并且安装了其他软件(例如数据库等),之后对这个镜像做快照。之后这个镜像又变成了一个新的基本镜像。
  3. 模版池: 一种使用分层块设备的方法是创建一个存储池包括主镜像,并进行各种快照扩展,用户可以以只读方式访问这个模版池。
  4. 镜像迁移和恢复 还有一种使用分层块设备的方法就是用于从不同的镜像池中迁移或者恢复数据

分层快照

克隆镜像需要访问parent快照,如果用户无意中删除了parent快照,所有的克隆将会无法恢复,所以克隆之前必须重新保护快照。

rbd --pool rbd snap protect --image my-image --snap my-snapshot
rbd snap protect rbd/my-image@my-snapshot

被保护的快照不可以删除

克隆快照

rbd clone rbd/my-image@my-snapshot rbd/new-image

你可以从一个存储池克隆快照到另一个存储池。例如,你可以修复一个只读的镜像,并且在一个存储池做一个快照模版。在另一个存储池中克隆。

取消保护快照

rbd --pool rbd snap unprotect --image my-image --snap my-snapshot
rbd snap unprotect rbd/my-image@my-snapshot

列出快照的儿子

rbd --pool rbd children --image my-image --snap my-snapshot
rbd children rbd/my-image@my-snapshot

合并镜像

克隆镜像存在依赖关系。取消这种依赖关系叫做合并镜像。合并镜像花费的时间和镜像的大小成正比。 要删除一个快照模版,必须先合并子镜像。

rbd --pool rbd flatten --image my-image
rbd flatten rbd/my-image

注意:合并的镜像会占据更多的存储空间。

在KVM中使用Ceph块设备

最常见的Ceph的块设备使用案例包括提供虚拟机设备镜像。例如,用户会创建一个主镜像安装了操作系统和相关软件并且已经配置好。之后,用户创建一个快照。最后通过克隆这个快照使用虚拟机。这种方式可以用来快速部署虚拟机。因为客户端不需要每次下载整个镜像。

Ceph的块设备能够集成在kvm的虚拟机中。

使用方法

kvm的命令行会指定存储池的名称和镜像的名称。也可以制定一个快照的名称。

kvm将会从默认的位置获取ceph的配置参数(/etc/ceph/$cluter.conf)。

qemu-img {command} [options] rbd:glance-pool/maipo:id=glance:conf=/etc/ceph/ceph.conf

创建镜像

qemu-img create -f raw rbd:data/foo 10G

重要: RAW格式是RBD原生支持的格式,qcow2和vmdk将会带来更大的开销,并且在虚拟机迁移时带来不安全。

改变大小

qemu-img resize rbd:data/foo 10G

获取镜像信息

qemu-img info rbd:data/foo

运行虚拟机

qemu -m 1024 -drive format=raw,file=rbd:data/squeeze

设定缓存选项

qemu -m 1024 -drive format=rbd,file=rbd:data/squeeze,cache=writeback

如果设定了rbd_cache=true,必须设置cache=writeback,否则有数据丢失的风险。没有设置cache=writeback,kvm将不会发送刷新请求到librbd。

支持丢弃和边界对齐

在Ceph 0.46和kvm 1.1 以后, Ceph块设备支持丢弃操作。时就意味着客户端可以发送TRIM请求让Ceph块设备释放未被使用的空间。这种操作可以通过ext4或者xfs支持。

要支持这个选项,需要这样运行虚拟机:

qemu -m 1024 -drive format=raw,file=rbd:data/squeeze,id=drive1,if=none -device driver=ide-hd,drive=drive1,discard_granularity=512

注意:必须使用IDE设备,而不能使用virtio,virtio不支持丢弃操作

如果使用libvirt,需要编辑其xml文件:

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
<qemu:commandline>
<qemu:arg value='-set'/>
<qemu:arg value='block.scsi0-0-0.discard_granularity=4096'/>
<qemu:arg value='-set'/>
<qemu:arg value='block.scsi0-0-1.discard_granularity=65536'/>
</qemu:commandline>
</domain>

Ceph的Block分析的更多相关文章

  1. Ceph分层存储分析

    最近弄Ceph集群考虑要不要加入分层存储 因此花了点时间研究了下 1,首先肯定要弄清Ceph分层存储的结构 ,结构图大概就是下图所示 缓存层(A cache tier)为Ceph客户端提供更好的I/O ...

  2. [ext4]01 磁盘布局 - block分析

    ext4文件系统最基本的分配单元是"block"(块). block是由一组连续的sectors来组成,其大小介于1k~4K之间,当然不可能是任意值,只能是2的整数次幂个secto ...

  3. iOS block分析

    block是代码块,其本质和变量类似.不同的是代码块存储的数据是一个函数体.使用Block,就可以像其他标准函数一样,传入参数,并得到返回值. 可以把Block当做Objective-C的匿名函数,B ...

  4. ceph应用情况分析

    1.概述 ceph是分布式的开源存储系统,同时支持块存储.对象存储和文件系统,ceph可以满足高性能.高可靠性和高扩展等特性. 目前ceph作为开源分布式存储已经被大量使用,尤其是在云环境下的应用,下 ...

  5. 如何使用国内源部署Ceph?

    由于网络方面的原因,Ceph的部署经常受到干扰,通常为了加速部署,基本上大家都是将Ceph的源同步到本地进行安装.根据Ceph中国社区的统计,当前已经有国内的网站定期将Ceph安装源同步,极大的方便了 ...

  6. Percona 开始尝试基于Ceph做上层感知的分布式 MySQL 集群,使用 Ceph 提供的快照,备份和 HA 功能来解决分布式数据库的底层存储问题

    本文由 Ceph 中国社区 -QiYu 翻译 英文出处:Using Ceph with MySQL 欢迎加入CCTG Over the last year, the Ceph world drew m ...

  7. ceph crush的问题

    ceph crush的问题看一遍忘一遍,现将<ceph源码分析>一书中相关章节摘抄如下: 4.2.1 层级化的Cluster Map例4-1 Cluster Map定义层级化的Cluste ...

  8. Ceph分布式存储-原理介绍及简单部署

    1)Ceph简单概述Ceph是一个分布式存储系统,诞生于2004年,最早致力于开发下一代高性能分布式文件系统的项目.Ceph源码下载:http://ceph.com/download/.随着云计算的发 ...

  9. block本质探寻八之循环引用

    说明:阅读本文,请参照之前的block文章加以理解: 一.循环引用的本质 //代码——ARC环境 void test1() { Person *per = [[Person alloc] init]; ...

随机推荐

  1. 关于zMPLS的设计解析

    zMPLS是一个关于mpls标准实现的开源软件,它起源于2002年6月份,项目终止于2006年,目前它已经可以支持ipv6,ipv4,ldp,cr-ldp,rsvp,rsvp-te等MPLS协议簇.该 ...

  2. 【Xamarin For IOS 开发需要的安装文件】

    官网安装文件下载: http://download.xamarin.com/XamarinforMac/Mac/xamarin.mac-2.0.1.64.pkghttp://download.xama ...

  3. ASP.NET WEB API 如何使用基于Post的方式传递多个值(二)

    前面我曾经写过一篇文章,是基于HttpContext的请求上下文中读取表单参数,其实还可以将其单独拆分出来. 基于Filter的方式 获取表单值:(核心代码)   public void OnActi ...

  4. C#读取文件高效方法实现

     C# Code  12345678910111213141516171819202122232425262728293031           private void button1_Click ...

  5. 文本编辑BOM标记(Byte Order Mark)

    微软的自带记事本程序notepad.exe会给UTF-8编码的文件头加入三个隐藏的字节(即BOM).这是一种很愚蠢的做法.就是为了让编辑器不去猜测文件本身是ASCII码还是UTF-8. 什么是BOM ...

  6. Delphi 调用系统中的计算器、记事本、画图软件方法

    1.直接调用    前面uses加 ShellAPI ShellExecute(Handle, 'open', PChar('calc.exe'), nil, nil, SW_SHOW); 2.直接调 ...

  7. oracle10.2 dblink impd 同库不同用户复制数据

    同库不同用户复制数据 1.授权用户导入表权限; SQL> grant exp_full_database to system; SQL> commit; 2.创建dblink; SQL&g ...

  8. Bubble Sort 冒泡排序

    //Bubble Sort ( O(n²)) public class TestBubbleSort { public int[] bubbleSortArray(int[] arr){ ; i &l ...

  9. 执行testng appium用例失败,自动截图

    新建一个截图监听类ScreenShotListener ,重写onTestFailure方法,里面定义了 监听的driver ,截图文件路径和名称 package com.fsssc.htsgl.ut ...

  10. [原创作品] RequireJs入门进阶教程

    最近我发现RSS采集数据是个很好玩的东西,就是可以直接把别人的数据放在自己的网站上.如果网友们在其他地方发现这篇文章,还是来博客园看吧(http://zhutty.cnblogs.com).这样代码比 ...