SnapshotVolume
- Launchpad 条目: NovaSpec:snapshot-volume
- 创建: 2011-4-19
- 贡献者: Kazutaka Morita
总结
使用 EC2 API 对 nova 卷进行快照
发布说明
这增加了对卷快照(EBS 快照)的支持。 OpenStack API 不支持卷快照,因此我们从使用 EC2 API 实现此功能开始。
这仅调用后端块存储系统的快照命令。 未来,我们应该将创建的卷快照备份到 Swift,就像 Amazon EBS 将快照备份到 S3 一样。
原理
这对于获取卷的一致镜像至关重要,该镜像用于备份或创建黄金卷。
用户故事
- 用户创建快照以备份卷
- 用户创建黄金卷以快速提供服务
$ euca-create-volume -s 4 -z 0 VOLUME vol-00000001 4 creating (admin, None, None, None) 2011-04-19T20:18:10Z $ euca-create-snapshot vol-00000001 SNAPSHOT snap-00000001 vol-00000001 creating 2011-04-19T20:18:19Z 0%
前提条件
nova-volume 的后端存储必须支持即时快照。
实现
这在数据库中添加了一个新的表 'snapshots'
snapshots = Table('snapshots', meta,
Column('created_at', DateTime(timezone=False)),
Column('updated_at', DateTime(timezone=False)),
Column('deleted_at', DateTime(timezone=False)),
Column('deleted', Boolean(create_constraint=True, name=None)),
Column('id', Integer(), primary_key=True, nullable=False),
Column('volume_id', Integer(), nullable=False),
Column('user_id',
String(length=255, convert_unicode=False, assert_unicode=None,
unicode_error=None, _warn_on_bytestring=False)),
Column('project_id',
String(length=255, convert_unicode=False, assert_unicode=None,
unicode_error=None, _warn_on_bytestring=False)),
Column('status',
String(length=255, convert_unicode=False, assert_unicode=None,
unicode_error=None, _warn_on_bytestring=False)),
Column('progress',
String(length=255, convert_unicode=False, assert_unicode=None,
unicode_error=None, _warn_on_bytestring=False)),
Column('volume_size', Integer()),
Column('scheduled_at', DateTime(timezone=False)),
Column('display_name',
String(length=255, convert_unicode=False, assert_unicode=None,
unicode_error=None, _warn_on_bytestring=False)),
Column('display_description',
String(length=255, convert_unicode=False, assert_unicode=None,
unicode_error=None, _warn_on_bytestring=False))
)
并在卷驱动程序中添加了两个接口
class VolumeDriver(object):
...
def create_snapshot(self, snapshot):
"""Creates a snapshot."""
raise NotImplementedError()
def delete_snapshot(self, snapshot):
"""Deletes a snapshot."""
raise NotImplementedError()