处理版本管理与生命周期
目标
一次性掌握开启版本控制、版本逐渐累积的过程、删除如何以 delete marker 来表示,以及清理它们的生命周期规则。
为什么重要
版本控制是用来从误操作中恢复的安全网,但同时也是一个成本陷阱。如果对每天都向同一个键覆盖写入日志的代码开启版本控制,一年后这一个键下就会堆积 365 个版本。列表里看上去只是一个对象,费用却是 365 倍。而“明明都删了,费用却没变”这类咨询的原因,就是 delete marker——不带版本 ID 删除时,数据原封不动,只是多了一个标记。因此在实际工作中,开启版本控制的决定和设置生命周期规则的决定,总是一并做出。本实验的第 7 步讲的就是这套基本组合的三项内容。
步骤
- 创建存储桶
lab-vers并开启版本控制。aws --profile local s3api get-bucket-versioning --bucket lab-vers中必须能看到Enabled。 - 向
s3://lab-vers/doc.txt上传 3 次不同的内容。aws --profile local s3api list-object-versions --bucket lab-vers --prefix doc.txt的Versions必须有 3 个。 - 用版本 ID 指定最旧的版本,下载为
/root/vers/v1.txt。内容必须是第一次上传的内容。 - 不指定版本,删除
doc.txt。版本列表中必须新增一个DeleteMarkers,使全部条目变为 4 个。在/root/vers/marker.txt中写入versions=4 has_delete_marker=true。 - 用版本 ID 指定 delete marker 并删除它。
aws --profile local s3 cp s3://lab-vers/doc.txt -必须返回第 3 次的内容。在/root/vers/restore.txt中写入restored=true。 - 在
/root/vers/versions.txt中写入current_bytes=<n>、noncurrent_bytes=<n>、total_bytes=<n>(占位符均为字节数)三行。total 是两个值之和,noncurrent 必须大于 0。 - 把生命周期规则写入
/root/vers/lifecycle.json,并用aws s3api put-bucket-lifecycle-configuration --bucket lab-vers --lifecycle-configuration file:///root/vers/lifecycle.json应用。必须同时包含三个动作:非当前版本 30 天后过期、清理已过期的 delete marker、未完成的分段上传 7 天后中止。把aws s3api get-bucket-lifecycle-configuration --bucket lab-vers的输出保存到/root/vers/ilm.txt。
参考
- 版本列表:
aws s3api list-object-versions --bucket lab-vers --prefix doc.txt——Versions中最新的排在前面,每个条目的IsLatest表示是否为当前版本。delete marker 会单独出现在DeleteMarkers中。 - 指定版本查询:
aws s3api get-object --bucket lab-vers --key doc.txt --version-id <id> /root/vers/v1.txt(占位符为版本 ID) - 指定版本删除:
aws s3api delete-object --bucket lab-vers --key doc.txt --version-id <id>(占位符为版本 ID)(无法撤销) - 版本 ID 的形态因服务器而异(AWS 是大约 32 个字符的随机字符串,这台服务器是十六进制字符串)。不要假设格式,从列表中选取。
- 这台服务器(SeaweedFS)会接收并保存生命周期规则,也会原样返回。30 天过期是否真正生效,在本实验的时间内看不到,所以评分只检查存储桶上是否设置了规则。
- 常见错误 1:不带版本 ID 删除,就以为“已经删了”——数据和费用都原封不动。
- 常见错误 2:只开启版本控制而不设置生命周期——费用会悄悄累积。
开启存储桶版本控制
创建存储桶 lab-vers 并开启版本控制。aws --profile local s3api get-bucket-versioning --bucket lab-vers 中必须能看到 Enabled。
这是存储桶级别的设置。开启后查询状态来确认。
向同一个键写入三次,累积版本
向 s3://lab-vers/doc.txt 上传 3 次不同的内容。aws --profile local s3api list-object-versions --bucket lab-vers --prefix doc.txt 的 Versions 必须有 3 个。
每次内容都要不同,以后才能区分。查询一下版本列表。
读取旧版本
用版本 ID 指定最旧的版本,下载为 /root/vers/v1.txt。内容必须是第一次上传的内容。
指定版本标识符进行查询。必须得到第一次上传的内容。
删除后确认 delete marker
不指定版本,删除 doc.txt。版本列表中必须新增一个 DeleteMarkers,使全部条目变为 4 个。在 /root/vers/marker.txt 中写入 versions=4 has_delete_marker=true。
不指定版本删除的话,并不会真正消失。版本列表中会多出一个新条目。
删除 delete marker 以恢复
用版本 ID 指定 delete marker 并删除它。aws --profile local s3 cp s3://lab-vers/doc.txt - 必须返回第 3 次的内容。在 /root/vers/restore.txt 中写入 restored=true。
删除标记之后,紧接在它下面的版本会重新成为当前版本。这就是从误操作中恢复的机制。
计算非当前版本的容量
在 /root/vers/versions.txt 中写入 current_bytes=<n>、noncurrent_bytes=<n>、total_bytes=<n>(占位符均为字节数)三行。total 是两个值之和,noncurrent 必须大于 0。
列表里看上去是一个对象,但费用会计在所有版本上。亲自算出合计。
应用生命周期规则
把生命周期规则写入 /root/vers/lifecycle.json,并用 aws s3api put-bucket-lifecycle-configuration --bucket lab-vers --lifecycle-configuration file:///root/vers/lifecycle.json 应用。必须同时包含三个动作:非当前版本 30 天后过期、清理已过期的 delete marker、未完成的分段上传 7 天后中止。把 aws s3api get-bucket-lifecycle-configuration --bucket lab-vers 的输出保存到 /root/vers/ilm.txt。
非当前版本过期、清理已过期的标记、中止未完成的上传,这三项是基本组合。