Ceph 对象存储多站点复制系列。第八部分
IBM Storage Ceph 对象存储多站点复制系列第八部分:归档区恢复 ¶
在本 Ceph 多站点系列的第八部分中,我们将继续探索归档区。通过一个实际操作的示例,从归档区恢复数据,我们将详细介绍归档区的工作原理。
简介 ¶
让我们从一个归档区恢复工作流程的可视化表示开始。在介绍完之后,我们将按照相同的步骤进行实际操作示例。
下图显示了当用户将对象放入生产区时,归档区的行为。
- 用户首次将
object1放入生产区时,该对象将作为当前版本复制到归档区。 - 当用户发出第二个 PUT 命令更新
object1时,修改将复制到归档区。修改后的对象现在是当前版本,旧的(初始、原始)对象仍然由于 S3 版本控制而可在归档区中找到。 - 如果用户发出第三个 PUT 命令更新
object1,则会发生与步骤 2 相同的情况,并且归档区中将有三个版本的对象可用。

继续使用上面描述的示例,让我们检查如何从逻辑故障中恢复数据。
- 在应用程序 X 推出期间,用户犯了一个操作错误,并在生产区中删除了
object1。该对象未从归档区中删除。 - 当我们的生产应用程序 X 尝试访问
object1时,它会失败。应用程序崩溃了,恐慌随之而来。 - 应用程序团队对问题进行了根本原因分析 (RCA),并向存储团队拨打电话,说明对象和他们希望恢复的版本(日期/时间)。素食布朗尼的承诺可能涉及其中。
- 存储团队将
object1的最新版本从归档区复制到生产集群。

从归档区恢复对象的实际操作工作流程 ¶
准备客户端环境 ¶
我们将使用 rclone CLI 工具进行测试。首先,我们在 zone1 集群中创建一个专门的用户,运行
# radosgw-admin user create --uid=archuser --display-name="S3 user to test the archive zone" --access-key=archuser --secret-key=archuser
{
"user_id": "archuser",
"display_name": "S3 user to test the archive zone",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"subusers": [],
"keys": [
{
"user": "archuser",
"access_key": "archuser",
"secret_key": "archuser"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"default_storage_class": "",
"placement_tags": [],
"bucket_quota": {
现在我们使用此用户配置 AWS 客户端
# aws configure
AWS Access Key ID [None]: archuser
AWS Secret Access Key [None]: archuser
Default region name [None]: multizg
Default output format [None]: text
我们还将创建几个别名以使我们的生活更轻松。
zone1 和 archive 区域的别名
# alias s3apiarchive='aws --endpoint=https://object.s3.archive.dan.ceph.blue:443 s3api'
# alias s3apizone1='aws --endpoint=https://object.s3.zone1.dan.ceph.blue:443 s3api'
我们希望使用 rclone,因此让我们下载并安装适当的 rclone 包
# yum install https://downloads.rclone.org/v1.62.0/rclone-v1.62.0-linux-amd64.rpm -y
接下来,我们使用生产区端点和归档区端点配置 rclone 客户端。这样,借助 rclone,我们可以在需要时从归档区恢复数据
cat <<EOF >rclone.conf
[zone1]
type = s3
provider = Other
access_key_id = archuser
secret_access_key = archuser
endpoint = https://object.s3.zone1.dan.ceph.blue:443
location_constraint = multizg
acl = bucket-owner-full-control
[archive]
type = s3
provider = Ceph
access_key_id = archuser
secret_access_key = archuser
endpoint = https://object.s3.archive.dan.ceph.blue:443
location_constraint = multizg
acl = bucket-owner-full-control
EOF
接下来,我们创建一些测试文件并捕获它们的 MD5 校验和,以便稍后进行比较
# echo "This is file 1" > /tmp/test-file-1
# echo "This is file 2" > /tmp/test-file-2
# echo "This is file 3" > /tmp/test-file-3
# md5sum /tmp/test-file-1
88c16a56754e0f17a93d269ae74dde9b /tmp/test-file-1
# md5sum /tmp/test-file-2
db06069ef1c9f40986ffa06db4fe8fd7 /tmp/test-file-2
# md5sum /tmp/test-file-3
95227e10e2c33771e1c1379b17330c86 /tmp/test-file-3
归档区测试 ¶
我们已经准备好客户端,让我们检查一下归档区。
创建一个新的存储桶并验证该存储桶是否已在所有 RGW 区域中创建
# s3apizone1 create-bucket --bucket my-bucket
# s3apizone1 list-buckets
BUCKETS 2023-03-15T12:03:54.315000+00:00 my-bucket
OWNER S3 user to test the archive zone archuser
# s3apiarchive list-buckets
BUCKETS 2023-03-15T12:03:54.315000+00:00 my-bucket
OWNER S3 user to test the archive zone archuser
验证尚未配置对象版本控制,因为这是延迟实现的
# s3apizone1 get-bucket-versioning --bucket my-bucket
# s3apiarchive get-bucket-versioning --bucket my-bucket
将一个新对象上传到我们的存储桶 my-bucket。
# rclone copy /tmp/test-file-1 zone1:my-bucket
验证已在归档区中启用了 S3 版本控制,但在 zone1 中未启用
# s3apiarchive get-bucket-versioning --bucket my-bucket
{
"Status": "Enabled",
"MFADelete": "Disabled"
}
# s3apizone1 get-bucket-versioning --bucket my-bucket
验证主区域和辅助区域中的对象版本 ID 为空,但在归档区中不为空
# s3apizone1 list-object-versions --bucket my-bucket
{
"Versions": [
{
"ETag": "\"88c16a56754e0f17a93d269ae74dde9b\"",
"Size": 15,
"StorageClass": "STANDARD",
"Key": "test-file-1",
"VersionId": "null",
"IsLatest": true,
"LastModified": "2023-03-15T12:07:12.914000+00:00",
"Owner": {
"DisplayName": "S3 user to test the archive zone",
"ID": "archuser"
}
}
]
}
# s3apiarchive list-object-versions --bucket my-bucket
{
"Versions": [
{
"ETag": "\"88c16a56754e0f17a93d269ae74dde9b\"",
"Size": 15,
"StorageClass": "STANDARD",
"Key": "test-file-1",
"VersionId": "6DRlC7fKtpmkvHA9zknhFA87RjyilTV",
"IsLatest": true,
"LastModified": "2023-03-15T12:07:12.914000+00:00",
"Owner": {
"DisplayName": "S3 user to test the archive zone",
"ID": "archuser"
}
}
]
}
修改主区域中的对象并验证已在 RGW 归档区中创建了新版本
# rclone copyto /tmp/test-file-2 zone1:my-bucket/test-file-1
# rclone ls zone1:my-bucket
15 test-file-1
验证已在 RGW 归档区中创建了新版本
# s3apiarchive list-object-versions --bucket my-bucket
{
"Versions": [
{
"ETag": "\"db06069ef1c9f40986ffa06db4fe8fd7\"",
"Size": 15,
"StorageClass": "STANDARD",
"Key": "test-file-1",
"VersionId": "mXoINEnZsSCDNaWwCDELVysUbnMqNqx",
"IsLatest": true,
"LastModified": "2023-03-15T12:13:27.057000+00:00",
"Owner": {
"DisplayName": "S3 user to test the archive zone",
"ID": "archuser"
}
},
{
"ETag": "\"88c16a56754e0f17a93d269ae74dde9b\"",
"Size": 15,
"StorageClass": "STANDARD",
"Key": "test-file-1",
"VersionId": "6DRlC7fKtpmkvHA9zknhFA87RjyilTV",
"IsLatest": false,
"LastModified": "2023-03-15T12:07:12.914000+00:00",
"Owner": {
"DisplayName": "S3 user to test the archive zone",
"ID": "archuser"
}
}
]
}
我们可以检查 ETag:它将与对象的 MD5sum 匹配。只有在未配置多部分上传或对象加密的情况下才如此。
# md5sum /tmp/test-file-2
db06069ef1c9f40986ffa06db4fe8fd7 /tmp/test-file-2
# md5sum /tmp/test-file-1
88c16a56754e0f17a93d269ae74dde9b /tmp/test-file-1
从 Rgw 归档区恢复 S3 对象 ¶
让我们上传更多版本的对象
# rclone copyto /tmp/test-file-3 zone1:my-bucket/test-file-1
在主区域中,我们只有一个版本,即对象的当前版本
# rclone --s3-versions lsl zone1:my-bucket
15 2023-03-15 07:59:10.779573336 test-file-1
但在归档区中,我们有所有三个版本可用
# rclone --s3-versions lsl archive:my-bucket
15 2023-03-15 07:59:10.779573336 test-file-1
15 2023-03-15 07:59:03.782438991 test-file-1-v2023-03-15-121327-057
15 2023-03-15 07:58:58.135330567 test-file-1-v2023-03-15-120712-914
现在,让我们从 zone1 中的 my-bucket 中删除 test-file1,然后从归档区恢复该对象
# rclone delete zone1:my-bucket/test-file-1
# rclone --s3-versions lsl zone1:my-bucket
# rclone --s3-versions lsl archive:my-bucket
15 2023-03-15 07:59:10.779573336 test-file-1
15 2023-03-15 07:59:03.782438991 test-file-1-v2023-03-15-121327-057
15 2023-03-15 07:58:58.135330567 test-file-1-v2023-03-15-120712-914
该对象已从 zone1 中删除,但所有版本仍然在归档区中可用。如果恢复最新版本 test-file-1,它应该与我们的 test-file-3 的 MD5 校验和匹配
# rclone copyto archive:my-bucket/test-file-1 zone1:my-bucket/test-file-1
# rclone copyto zone1:my-bucket/test-file-1 /tmp/recovered-file1
# md5sum /tmp/recovered-file1
95227e10e2c33771e1c1379b17330c86 /tmp/recovered-file1
# md5sum /tmp/test-file-3
95227e10e2c33771e1c1379b17330c86 /tmp/test-file-3
现在,让我们探讨希望使用特定时间戳的版本(例如 2023-03-15-121327-057)恢复对象的情况。
# rclone --s3-versions copyto archive:my-bucket/test-file-1-v2023-03-15-121327-057 zone1:my-bucket/test-file-1
# rclone copyto zone1:my-bucket/test-file-1 /tmp/recovered-file1
# md5sum /tmp/recovered-file1
db06069ef1c9f40986ffa06db4fe8fd7 /tmp/recovered-file1
# md5sum /tmp/test-file-2
db06069ef1c9f40986ffa06db4fe8fd7 /tmp/test-file-2
这使我们完成了使用归档区的实际操作示例,并借助 rclone 无缝恢复数据的过程。
总结和下一步 ¶
在本系列的第八部分中,我们介绍了归档区功能。我们分享了一个从归档区恢复数据的实际操作示例。这使我们完成了 Ceph 对象存储多站点系列的介绍。
我们希望这些内容对您的 Ceph 工作有所帮助。
脚注 ¶
作者谨此感谢 IBM 对社区的支持,通过促使我们有时间创建这些帖子。