cinder snapshot and backup
TRANSCRIPT
Cinder: Snapshot & Backup
BC-EC 马琪 [email protected]
Agenda
❖ Cinder 架构❖ Snapshot 和 backup❖ Cinder 中的 snapshot 和 backup❖ Code
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 有啥区别?
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
Cinder中的 Snapshot和 Backup
❖ 特点
❖ 用法❖ snapshot :临时备份、做实验性 / 破坏性操作之前❖ backup : 永久备份、定期备份
Q1: 既然 snapshot 和 backup 区别很小,并且也能做 full backup ,为啥还要 cinder-backup?
A1: block 不可靠,即使是 Ceph 。 Cinder 利用“可靠的”对象存储(如 Swift )的来保存 block data
Q2: 怎么用 ?Q3: 怎么实现的 ?
速度 占用空间 可靠性 用途
snapshot 快 小 不可靠 创建新卷 ;不可用于恢复
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
戳这儿:灏哥的代码分析
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
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
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 计算结果不上传数据,否则保存计算结果并上传数据
Thank you.