Ceph 对象存储多站点复制系列。第八部分

Daniel Parkes, Anthony D'Atri (IBM)

IBM Storage Ceph 对象存储多站点复制系列第八部分:归档区恢复

在本 Ceph 多站点系列的第八部分中,我们将继续探索归档区。通过一个实际操作的示例,从归档区恢复数据,我们将详细介绍归档区的工作原理。

简介

让我们从一个归档区恢复工作流程的可视化表示开始。在介绍完之后,我们将按照相同的步骤进行实际操作示例。

下图显示了当用户将对象放入生产区时,归档区的行为。

  1. 用户首次将 object1 放入生产区时,该对象将作为当前版本复制到归档区。
  2. 当用户发出第二个 PUT 命令更新 object1 时,修改将复制到归档区。修改后的对象现在是当前版本,旧的(初始、原始)对象仍然由于 S3 版本控制而可在归档区中找到。
  3. 如果用户发出第三个 PUT 命令更新 object1,则会发生与步骤 2 相同的情况,并且归档区中将有三个版本的对象可用。

继续使用上面描述的示例,让我们检查如何从逻辑故障中恢复数据。

  1. 在应用程序 X 推出期间,用户犯了一个操作错误,并在生产区中删除了 object1。该对象未从归档区中删除。
  2. 当我们的生产应用程序 X 尝试访问 object1 时,它会失败。应用程序崩溃了,恐慌随之而来。
  3. 应用程序团队对问题进行了根本原因分析 (RCA),并向存储团队拨打电话,说明对象和他们希望恢复的版本(日期/时间)。素食布朗尼的承诺可能涉及其中。
  4. 存储团队将 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

我们还将创建几个别名以使我们的生活更轻松。

zone1archive 区域的别名

# 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 对社区的支持,通过促使我们有时间创建这些帖子。