cinder snapshot and backup

10
Cinder: Snapshot & Backup BC-EC 马马 [email protected] 2015.10

Upload: felix-ma

Post on 11-Apr-2017

567 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: Cinder snapshot and backup

Cinder: Snapshot & Backup

BC-EC 马琪 [email protected]

Page 2: Cinder snapshot and backup

Agenda

❖ Cinder 架构❖ Snapshot 和 backup❖ Cinder 中的 snapshot 和 backup❖ Code

Page 3: Cinder snapshot and backup

Cinder 架构❖ Block service (移动硬盘)❖ Block driver

❖ LVM

❖ CEPH

❖ EBS

❖ APIvolume/backup/snapshot API

Q1: 怎么没有 cinder-snapshot?

A1: 在 cinder-volume 中。Q2: Why cinder-volume?

A2: snapshot 一般是 block driver 的概念,依赖于原 volume 。

Q3: Snapshot 和 backup 有啥区别?

Page 4: Cinder snapshot and backup

Snapshot和 Backup

❖ 字面含义是相似的 - 对用户来说都是备份❖ 从 driver 理解(只研究了 lvm/ceph )

❖ 只有 snapshot 命令,没有 backup 命令❖ LVM : lvcreate --snap -n my_snap --size 1G /dev/vg/orig_lv❖ Ceph : rbd snap create my_pool/my_image@my_snap

❖ snapshot 原理 - 很多 driver 使用 COW方式❖ backup 怎么做( full backup )

❖ LVM (cinder create volume from snap)1. create snap 2. create new_lv3. dd if=/dev/snap of=/dev/new_lv

❖ Ceph1. create snap 2. protect snap3. clone snap to new image 4. flatten new image

Page 5: Cinder snapshot and backup

Cinder中的 Snapshot和 Backup

❖ 特点

❖ 用法❖ snapshot :临时备份、做实验性 / 破坏性操作之前❖ backup : 永久备份、定期备份

Q1: 既然 snapshot 和 backup 区别很小,并且也能做 full backup ,为啥还要 cinder-backup?

A1: block 不可靠,即使是 Ceph 。 Cinder 利用“可靠的”对象存储(如 Swift )的来保存 block data

Q2: 怎么用 ?Q3: 怎么实现的 ?

速度 占用空间 可靠性 用途

snapshot 快 小 不可靠 创建新卷 ;不可用于恢复

backup 慢 大(需对象存储) 可靠 不可创建新卷;可用于恢复

Page 6: Cinder snapshot and backup

Cinder Snapshot的实现❖ Driver 实现( snapshot create )

❖ LVM :构造命令: lvcreate --name lv_snap_name --snapshot -L source_lv_name

❖ Ceph :调用 Ceph Python library rbd.py 中的 create_snap/protect_snap 方法❖ Code

❖ LVMcinder/volume/drivers/lvm.py create_snapshotcinder/brick/local_dev/lvm.py create_lv_snapshot

❖ Cephcinder/volume/drivers/rbd.py create_snapshot/usr/lib/python2.7/dist-packages/rbd.py create_snap/protect_snap

戳这儿:灏哥的代码分析

Page 7: Cinder snapshot and backup

Cinder Backup的实现流程:

1. cinder/api/contrib/backup.py 的 create -> self.backup_api.create2. cinder/backup/api.py 的 create -> cinder/backup/rpcapi.py 的

create_backup ,发送 rpc 请求到 rabbitmq server3. cinder/backup/manager.py 中的 create_backup 方法处理 rpc 请求

略去细节,第 3 步最终的处理方法是: backup_service = self.service.get_backup_driver(context) self._get_driver(backend).backup_volume(context, backup, backup_service)Note :

❖ backup_service 表示 cinder-backup 的对象存储的后端,如 Ceph , Swift❖ backup_volume 不是由 cinder-backup 定义,而是定义在 cinder/volume/drivers/xxx.py 中❖ 实际上是 source 和 destination 的关系:

❖ source :调用 cinder-volume block driver 的 backup_volume 方法读取 block data ,如: cinder/volume/drivers/lvm.py backup_volume

❖ destination :调用 cinder-backup 对象存储的 driver 的 backup 方法保存 block data ,如: cinder/backup/drivers/ceph.py backup

Page 8: Cinder snapshot and backup

Cinder Incremental Backup

BP : https://blueprints.launchpad.net/cinder/+spec/incremental-backupSpec :https://github.com/openstack/cinder-specs/blob/master/specs/kilo/incremental-backup.rst

❖ 完全依赖于 cinder-backup 对象存储 driver 的实现❖ Ceph

❖ source volume 为 RBD ,做增量备份(不考虑 --incr 参数);失败,做 full backup

❖ 类似使用 rbd export-diff/import-diff --from-snap (说明)❖ source volume 为非 RBD ,做 full backup (不考虑 --incr 参数)

❖ Swift调用 cinder/backup/chunkeddriver.py 中的 backup

Page 9: Cinder snapshot and backup

Cinder Incremental Backup (cont’d)全量备份一般过程(切片、计算、上传):

1. 对 volume data 切分,每次读入 chunk_size_bytes 大小的数据;2. 对读入的数据,每 sha_block_size 字节的数据做 SHA 计算,保存计算结果;3. 将 chunk_size_bytes 的数据上传到对象存储上,形成一个对象;4. 依次循环,至所有数据备份完毕对象存储上的文件:

❖ volume data 对象❖ metadata :记录 backup_name , volume_id , volume_meta 等❖ sh256file :按照顺序记录了 SHA 计算的结果

增量备份一般过程:5. 获得上次备份的 sh256file6. 对 volume data 切分,每次读入 chunk_size_bytes 大小的数据;7. 对读入的数据,每 sha_block_size 字节的数据做一次 SHA 计算,和上次备份的结

果进行比较;8. 如果相同,则只保存 SHA 计算结果不上传数据,否则保存计算结果并上传数据

Page 10: Cinder snapshot and backup

Thank you.