一个块是一个连续的字节序列(例如一个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. vsftpd允许root用户登录

    Linux下安装vsftpd之后,默认的配置是 匿名用户可以登录,匿名帐户有两个: 用户名:anonymous 密码:空 用户名:ftp 密码:ftp 如果要用匿名进行上传删除等操作需要配置其它参数. ...

  2. iOS 9之New System Fonts(San Francisco 字体)

    金田 此次苹果发布的iOS 9系统测试版目前已经开放下载,新系统将弃用Helvetica字体,改用了San Francisco字体, 包括系统菜单.App名称等各个部分. 最初San Francisc ...

  3. Json帮助类以及如何使用

    首先要添加引用System.Runtime.Serialization. public class JSONHelper { public static string Serialize<T&g ...

  4. <转载>无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用

    转载http://blog.sina.com.cn/s/blog_6e6c5f230100p92p.html 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引 ...

  5. Gwt ListBox选中自动触发事件

    以前用TreeView显示,需求更改 需要做一个ListBox控件显示数据,和HTML中的<Select>标签一样 编辑时候自动触发选中的数据子类: 1.只要自动触发了rootListBo ...

  6. 《学习opencv》笔记——矩阵和图像操作——cvCalcCovarMatrix,cvCmp and cvCmpS

    矩阵和图像的操作 (1)cvCalcCovarMatrix函数 其结构 void cvCalcCovarMatrix(计算给定点的均值和协方差矩阵 const CvArr** vects,//给定向量 ...

  7. web工程调用hadoop集群1.2

    本实例代码在lz的资源中有上传,有需要的可以参考(下载后的文件解压后有两个,一个直接导入myeclipse工程,另外的jar放在hadoop的lib下面,只需修改Utils中的ip即可运行该程序): ...

  8. 消息摘要算法-HMAC算法

    一.简述 mac(Message Authentication Code.消息认证码算法)是含有密钥散列函数算法.兼容了MD和SHA算法的特性,并在此基础上加上了密钥.因此MAC算法也常常被称作HMA ...

  9. 绘制更Smooth的UI

    以前很长一段时间,在自定义控制绘制时,只是简单的定义一个QPainter对象而开始绘画.经常会画一些圆角矩形,甚至是一些不规则的图形.对于不规则的图形来说,如果PS技术不好,或者mask制作的不好,常 ...

  10. Hexo博客搭建图文教程

    准备 你需要准备好以下软件: Node.js环境 Git Windows 配置Node.js环境 下载Node.js安装文件: Windows Installer 32-bit Windows Ins ...