• Ceph 对象存储多站点复制:第八部分

    归档区域数据恢复实战

    在本系列的第八部分中,我们将继续探讨归档区域功能,并通过实践示例详细演示如何从归档区域恢复数据。

    功能概述

    让我们从归档区域恢复流程的可视化表示开始。了解流程后,我们将通过一个实操示例来逐步演示。

    下图展示了当用户向生产区域上传(PUT)对象时,归档区域的行为:

    1. 第一次上传:当用户首次将 object1 上传到生产区域时,该对象会作为当前版本复制到归档区域。

    2. 第二次上传:当用户第二次上传并更新 object1 时,修改后的对象会复制到归档区域。此时,修改后的对象成为当前版本,而旧的(初始的、原始的)对象仍然保留在归档区域中,这得益于 S3 版本控制功能。

    3. 第三次上传:如果用户第三次上传并更新 object1,将重复步骤 2 的过程,归档区域中将保存该对象的三个版本。

    通过这种方式,归档区域不仅保留了对象的最新版本,还保留了历史版本,为数据恢复提供了更多可能性。

    继续上面的示例,让我们看看如何从逻辑故障中恢复数据。

    1. 误删除操作:在应用程序 X 的部署过程中,用户误操作删除了生产区域中的 object1。然而,该对象并未从归档区域中删除。

    2. 应用程序故障:当生产应用程序 X 尝试访问 object1 时,操作失败。应用程序因此宕机,引发了紧急情况。

    3. 问题排查与请求:应用程序团队对问题进行了根本原因分析(RCA),并迅速联系存储团队,指定需要恢复的对象及其版本(日期/时间)。为了加快处理速度,可能还会承诺一些素食布朗尼作为感谢。

    4. 数据恢复:存储团队从归档区域复制 object1 的最新版本到生产集群中。

    通过这种方式,归档区域为应对逻辑故障提供了可靠的数据恢复机制,确保关键数据不会因误操作而永久丢失。

    从归档区Workflow中恢复对象的实践操作

    准备客户端环境

    我们将使用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 是否为空,但归档区中的对象版本 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

    现在让我们从zone1my-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 工具无缝恢复了数据。

    总结

    在本系列的第八部分也是最后一部分中,我们深入探讨了归档区域功能,并通过实践示例详细演示了如何从归档区域恢复数据。

    系列文章导航

    1. 第一部分:多站点复制基础架构

    2. 第二部分:性能优化与专用RGW服务

    3. 第三部分:同步公平性机制

    4. 第四部分:负载均衡与高可用性

    5. 第五部分:同步策略功能详解

    6. 第六部分:高级同步策略配置

    7. 第七部分:归档区域功能详解

    8. 第八部分:归档区域数据恢复(本期)

    «
    »
以专业成就每一位客户,让企业IT只为效果和安全买单

以专业成就每一位客户,让企业IT只为效果和安全买单

在线咨询
连接中...