7.10. bucket 生命周期

作为存储管理员,您可以使用存储桶生命周期配置来管理对象,以便它们在整个生命周期中有效地存储。例如,您可以根据您的用例,将对象转换为更昂贵的存储类、存档甚至删除它们。

RADOS 网关支持 S3 API 对象到期,以利用为一组 bucket 对象定义的规则。每个规则都有一个前缀,用于选择对象,以及若干天,对象不可用。

注意

radosgw-admin lc reshard 命令在 Red Hat Ceph Storage 3.3 中已弃用,Red Hat Ceph Storage 4 及更新的版本中不被支持。

7.10.1. 创建生命周期管理策略

您可以使用标准 S3 操作来管理存储桶生命周期策略配置,而不是使用 FQDN -admin 命令。RADOS 网关仅支持将部分 Amazon S3 API 策略语言应用到 bucket。生命周期配置包含一组 bucket 对象定义的一个或多个规则。

先决条件

  • 正在运行的红帽存储集群。
  • 安装 Ceph 对象网关.
  • Ceph 对象网关节点的根级别访问权限.
  • S3 存储桶被创建。
  • 创建的用户具有访问权限的 S3 用户。
  • 访问安装了 AWS CLI 软件包的 Ceph 对象网关客户端。

流程

  1. 为生命周期配置创建 JSON 文件:

    示例

    [user@client ~]$ vi lifecycle.json

  2. 在文件中添加特定的生命周期配置规则:

    示例

    {
    	"Rules": [
            {
    		    "Filter": {
    			    "Prefix": "images/"
    		    },
    		    "Status": "Enabled",
    		    "Expiration": {
    			    "Days": 1
    		    },
    		    "ID": "ImageExpiration"
    	    }
        ]
    }

    生命周期配置示例在 images 目录中过期对象,这些对象超过 1 天。

  3. 在存储桶上设置生命周期配置:

    语法

    aws --endpoint-url=RADOSGW_ENDPOINT_URL:PORT s3api put-bucket-lifecycle-configuration --bucket BUCKET_NAME --lifecycle-configuration file://PATH_TO_LIFECYCLE_CONFIGURATION_FILE/LIFECYCLE_CONFIGURATION_FILE.json

    示例

    [user@client ~]$ aws --endpoint-url=http://host01:80 s3api put-bucket-lifecycle-configuration --bucket testbucket --lifecycle-configuration file://lifecycle.json

    在这个示例中,生命周期.json 文件存在于当前目录中。

验证

  • 检索存储桶的生命周期配置:

    语法

    aws --endpoint-url=RADOSGW_ENDPOINT_URL:PORT s3api get-bucket-lifecycle-configuration --bucket BUCKET_NAME

    示例

    [user@client ~]$ aws --endpoint-url=http://host01:80 s3api get-bucket-lifecycle-configuration --bucket testbucket
    {
    	"Rules": [
            {
    		    "Expiration": {
    			    "Days": 1
    		    },
    		    "ID": "ImageExpiration",
    		    "Filter": {
    			    "Prefix": "images/"
    		    },
    		    "Status": "Enabled"
    	    }
        ]
    }

  • 可选:在 Ceph 对象网关节点中,登录 Cephadm shell 并检索存储桶生命周期配置:

    语法

    radosgw-admin lc get --bucket=BUCKET_NAME

    示例

    [ceph: root@host01 /]# radosgw-admin lc get --bucket=testbucket
    {
    	"prefix_map": {
    		"images/": {
    			"status": true,
    			"dm_expiration": false,
    			"expiration": 1,
    			"noncur_expiration": 0,
    			"mp_expiration": 0,
    			"transitions": {},
    			"noncur_transitions": {}
    		}
    	},
    	"rule_map": [
            {
    		"id": "ImageExpiration",
    		"rule": {
    			"id": "ImageExpiration",
    			"prefix": "",
    			"status": "Enabled",
    			"expiration": {
    				"days": "1",
    				"date": ""
    			},
    			"mp_expiration": {
    				"days": "",
    				"date": ""
    			},
    			"filter": {
    				"prefix": "images/",
    				"obj_tags": {
    					"tagset": {}
    				}
    			},
    			"transitions": {},
    			"noncur_transitions": {},
    			"dm_expiration": false
    		}
    	}
      ]
    }

其它资源

  • 详情请参阅 Red Hat Ceph Storage Developer Guide 中的 S3 存储桶生命周期 部分。
  • 有关使用 AWS CLI 管理生命周期配置的更多信息,请参阅 Amazon Simple Storage Service 文档中的 设置生命周期配置 部分。

7.10.2. 删除生命周期管理策略

您可以使用 s3api delete-bucket-lifecycle 命令删除指定存储桶的生命周期管理策略。

先决条件

  • 正在运行的红帽存储集群。
  • 安装 Ceph 对象网关.
  • Ceph 对象网关节点的根级别访问权限.
  • S3 存储桶被创建。
  • 创建的用户具有访问权限的 S3 用户。
  • 访问安装了 AWS CLI 软件包的 Ceph 对象网关客户端。

流程

  • 删除生命周期配置:

    语法

    aws --endpoint-url=RADOSGW_ENDPOINT_URL:PORT s3api delete-bucket-lifecycle --bucket BUCKET_NAME

    示例

    [user@client ~]$ aws --endpoint-url=http://host01:80 s3api delete-bucket-lifecycle --bucket testbucket

验证

  • 检索存储桶的生命周期配置:

    语法

    aws --endpoint-url=RADOSGW_ENDPOINT_URL:PORT s3api get-bucket-lifecycle-configuration --bucket BUCKET_NAME

    示例

    [user@client ~]# aws --endpoint-url=http://host01:80  s3api get-bucket-lifecycle-configuration --bucket testbucket

  • 可选:在 Ceph Object Gateway 节点上,检索存储桶生命周期配置:

    语法

    radosgw-admin lc get --bucket=BUCKET_NAME

    示例

    [ceph: root@host01 /]# radosgw-admin lc get --bucket=testbucket

    注意

    如果没有存储桶生命周期策略,则 命令不会返回任何信息。

其它资源

7.10.3. 更新生命周期管理策略

您可以使用 s3cmd put-bucket-lifecycle-configuration 命令更新生命周期管理策略。

注意

put-bucket-lifecycle-configuration 覆盖现有的存储桶生命周期配置。如果要保留任何当前生命周期策略设置,则必须在生命周期配置文件中包括它们。

先决条件

  • 正在运行的红帽存储集群。
  • 安装 Ceph 对象网关.
  • Ceph 对象网关节点的根级别访问权限.
  • S3 存储桶被创建。
  • 创建的用户具有访问权限的 S3 用户。
  • 访问安装了 AWS CLI 软件包的 Ceph 对象网关客户端。

流程

  1. 为生命周期配置创建 JSON 文件:

    示例

    [user@client ~]$ vi lifecycle.json

  2. 在文件中添加特定生命周期配置规则:

    示例

    {
    	"Rules": [
            {
    		    "Filter": {
    			    "Prefix": "images/"
    		    },
    		    "Status": "Enabled",
    		    "Expiration": {
    			    "Days": 1
    		    },
    		    "ID": "ImageExpiration"
    	    },
    		{
    			"Filter": {
    				"Prefix": "docs/"
    			},
    			"Status": "Enabled",
    			"Expiration": {
    				"Days": 30
    			},
    			"ID": "DocsExpiration"
    		}
    	]
    }

  3. 更新存储桶的生命周期配置:

    语法

    aws --endpoint-url=RADOSGW_ENDPOINT_URL:PORT s3api put-bucket-lifecycle-configuration --bucket BUCKET_NAME --lifecycle-configuration file://PATH_TO_LIFECYCLE_CONFIGURATION_FILE/LIFECYCLE_CONFIGURATION_FILE.json

    示例

    [user@client ~]$ aws --endpoint-url=http://host01:80 s3api put-bucket-lifecycle-configuration --bucket testbucket --lifecycle-configuration file://lifecycle.json

验证

  • 检索存储桶的生命周期配置:

    语法

    aws --endpointurl=RADOSGW_ENDPOINT_URL:PORT s3api get-bucket-lifecycle-configuration --bucket BUCKET_NAME

    示例

    [user@client ~]$ aws -endpoint-url=http://host01:80 s3api get-bucket-lifecycle-configuration --bucket testbucket
    
    {
        "Rules": [
            {
                "Expiration": {
                    "Days": 30
                },
                "ID": "DocsExpiration",
                "Filter": {
                    "Prefix": "docs/"
                },
                "Status": "Enabled"
            },
            {
                "Expiration": {
                    "Days": 1
                },
                "ID": "ImageExpiration",
                "Filter": {
                    "Prefix": "images/"
                },
                "Status": "Enabled"
            }
        ]
    }

  • 可选:在 Ceph 对象网关节点中,登录 Cephadm shell 并检索存储桶生命周期配置:

    语法

    radosgw-admin lc get --bucket=BUCKET_NAME

    示例

    [ceph: root@host01 /]# radosgw-admin lc get --bucket=testbucket
    {
    	"prefix_map": {
            "docs/": {
    			"status": true,
    			"dm_expiration": false,
    			"expiration": 1,
    			"noncur_expiration": 0,
    			"mp_expiration": 0,
    			"transitions": {},
    			"noncur_transitions": {}
    		},
    		"images/": {
    			"status": true,
    			"dm_expiration": false,
    			"expiration": 1,
    			"noncur_expiration": 0,
    			"mp_expiration": 0,
    			"transitions": {},
    			"noncur_transitions": {}
    		}
    	},
    	"rule_map": [
            {
            "id": "DocsExpiration",
        	"rule": {
        		"id": "DocsExpiration",
        		"prefix": "",
        		"status": "Enabled",
        		"expiration": {
        			"days": "30",
        			"date": ""
        		},
                "noncur_expiration": {
                    "days": "",
                    "date": ""
                },
        		"mp_expiration": {
        			"days": "",
        			"date": ""
        		},
        		"filter": {
        			"prefix": "docs/",
        			"obj_tags": {
        				"tagset": {}
        			}
        		},
        		"transitions": {},
        		"noncur_transitions": {},
        		"dm_expiration": false
        	}
        },
        {
    		"id": "ImageExpiration",
    		"rule": {
    			"id": "ImageExpiration",
    			"prefix": "",
    			"status": "Enabled",
    			"expiration": {
    				"days": "1",
    				"date": ""
    			},
    			"mp_expiration": {
    				"days": "",
    				"date": ""
    			},
    			"filter": {
    				"prefix": "images/",
    				"obj_tags": {
    					"tagset": {}
    				}
    			},
    			"transitions": {},
    			"noncur_transitions": {},
    			"dm_expiration": false
    		}
    	}
      ]
    }

其它资源

7.10.4. 监控存储桶生命周期

您可以使用 radosgw-admin lc listradosgw-admin lc process 命令监控生命周期并手动处理存储桶的生命周期。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • Ceph 对象网关节点的根级别访问权限.
  • 应用了带有生命周期配置策略的 S3 存储桶。

流程

  1. 登录到 Cephadm shell:

    示例

    [root@host01 ~]# cephadm shell

  2. 列出存储桶生命周期进度:

    示例

    [ceph: root@host01 /]# radosgw-admin lc list
    
    [
       {
             “bucket”: “:testbucket:8b63d584-9ea1-4cf3-8443-a6a15beca943.54187.1”,
             “started”: “Thu, 01 Jan 1970 00:00:00 GMT”,
             “status” : “UNINITIAL”
       },
       {
             “bucket”: “:testbucket1:8b635499-9e41-4cf3-8443-a6a15345943.54187.2”,
             “started”: “Thu, 01 Jan 1970 00:00:00 GMT”,
             “status” : “UNINITIAL”
       }
    ]

    bucket 生命周期处理状态可以是以下之一:

    • UNINITIAL - 该进程尚未运行。
    • PROCESSING - 当前正在运行。
    • COMPLETE - 过程已完成。
  3. 可选:您可以手动处理存储桶生命周期策略:

    1. 处理单个存储桶的生命周期策略:

      语法

      radosgw-admin lc process --bucket=BUCKET_NAME

      示例

      [ceph: root@host01 /]# radosgw-admin lc process --bucket=testbucket1

    2. 立即处理所有存储桶生命周期策略:

      示例

      [ceph: root@host01 /]# radosgw-admin lc process

验证

  • 列出存储桶生命周期策略:

    [ceph: root@host01 /]# radosgw-admin lc list
    [
        {
              “bucket”: “:testbucket:8b63d584-9ea1-4cf3-8443-a6a15beca943.54187.1”,
              “started”: “Thu, 17 Mar 2022 21:48:50 GMT”,
              “status” : “COMPLETE”
        }
        {
              “bucket”: “:testbucket1:8b635499-9e41-4cf3-8443-a6a15345943.54187.2”,
              “started”: “Thu, 17 Mar 2022 20:38:50 GMT”,
              “status” : “COMPLETE”
        }
    ]

其它资源

7.10.5. 配置生命周期过期窗口

您可以通过设置 rgw_lifecycle_work_time 参数来设置生命周期管理每天运行的时间。默认情况下,生命周期处理每天会在午夜进行一次。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 安装 Ceph 对象网关.
  • Ceph 对象网关节点的根级别访问权限.

流程

  1. 登录到 Cephadm shell:

    示例

    [root@host01 ~]# cephadm shell

  2. 设置生命周期过期时间:

    语法

    ceph config set client.rgw rgw_lifecycle_work_time %D:%D-%D:%D

    %d:%d-%d:%d 替换为 start_hour:start_minute-end_hour:end_minute

    示例

    [ceph: root@host01 /]# ceph config set client.rgw rgw_lifecycle_work_time 06:00-08:00

验证

  • 检索生命周期过期时间:

    示例

    [ceph: root@host01 /]# ceph config get client.rgw rgw_lifecycle_work_time
    
    06:00-08:00

其它资源

7.10.6. S3 bucket 生命周期在存储集群中转换

您可以使用 bucket 生命周期配置来管理对象,以便在整个对象生命周期内有效存储对象。对象生命周期转换规则允许您在对象生命周期内管理并有效地存储对象。您可以将对象转换为更昂贵的存储类、存档甚至删除它们。

您可以为以下对象创建存储类:

  • 快速介质,如 SSD 或 NVMe 用于 I/O 敏感工作负载。
  • Magnetic 介质慢,比如用于存档的 SAS 或 SATA。

您可以为热存储类和冷存储类之间的数据移动创建调度。您可以在指定时间后调度此移动,以便对象过期并被永久删除,例如,您可以在创建对象 30 天后将其转换为存储类,甚至可以在创建对象后一年将对象归档到存储类。您可以通过转换规则完成此操作。这个规则适用于从一个存储类转换到另一个存储类的对象。生命周期配置包含使用 <Rule> 元素的一个或多个规则。

其它资源

  • 有关 bucket 生命周期 的详细信息,请参阅 Red Hat Ceph Storage 开发人员指南

7.10.7. 将对象从一个存储类转换到另一个存储类

对象生命周期转换规则允许您将对象从一个存储类转换为另一个类。

您可以在复制池、纠删代码池之间迁移数据,复制到纠删代码池,或使用 Ceph 对象网关生命周期转换策略迁移到复制池。

先决条件

  • 安装 Ceph 对象网关软件.
  • Ceph 对象网关节点的根级别访问权限.
  • 创建的用户具有访问权限的 S3 用户。

流程

  1. 创建新数据池:

    语法

    ceph osd pool create POOL_NAME

    示例

    [ceph: root@host01 /]# ceph osd pool create test.hot.data

  2. 添加新存储类:

    语法

    radosgw-admin zonegroup placement add  --rgw-zonegroup default --placement-id PLACEMENT_TARGET --storage-class STORAGE_CLASS

    示例

    [ceph: root@host01 /]# radosgw-admin zonegroup placement add  --rgw-zonegroup default --placement-id default-placement --storage-class hot.test
    {
            "key": "default-placement",
            "val": {
                "name": "default-placement",
                "tags": [],
                "storage_classes": [
                    "STANDARD",
                    "hot.test"
                ]
            }
        }

  3. 为新存储类提供区放置信息:

    语法

    radosgw-admin zone placement add --rgw-zone default --placement-id PLACEMENT_TARGET --storage-class STORAGE_CLASS --data-pool DATA_POOL

    示例

    [ceph: root@host01 /]# radosgw-admin zone placement add --rgw-zone default --placement-id default-placement --storage-class hot.test --data-pool test.hot.data
    {
               "key": "default-placement",
               "val": {
                   "index_pool": "test_zone.rgw.buckets.index",
                   "storage_classes": {
                       "STANDARD": {
                           "data_pool": "test.hot.data"
                       },
                       "hot.test": {
                           "data_pool": "test.hot.data",
                      }
                   },
                   "data_extra_pool": "",
                   "index_type": 0
               }

    注意

    在创建具有写入一次的冷或归档数据存储池时,请考虑设置 compression_type

  4. 在 data 池中启用 rgw 应用程序:

    语法

    ceph osd pool application enable POOL_NAME rgw

    示例

    [ceph: root@host01 /]# ceph osd pool application enable test.hot.data rgw
    enabled application 'rgw' on pool 'test.hot.data'

  5. 重新启动所有 rgw 守护进程。
  6. 创建存储桶:

    示例

    [ceph: root@host01 /]# aws s3api create-bucket --bucket testbucket10 --create-bucket-configuration LocationConstraint=default:default-placement --endpoint-url http://10.0.0.80:8080

  7. 添加对象:

    示例

    [ceph: root@host01 /]# aws --endpoint=http://10.0.0.80:8080 s3api put-object --bucket testbucket10  --key compliance-upload --body /root/test2.txt

  8. 创建第二个数据池:

    语法

    ceph osd pool create POOL_NAME

    示例

    [ceph: root@host01 /]# ceph osd pool create test.cold.data

  9. 添加新存储类:

    语法

    radosgw-admin zonegroup placement add  --rgw-zonegroup default --placement-id PLACEMENT_TARGET --storage-class STORAGE_CLASS

    示例

    [ceph: root@host01 /]# radosgw-admin zonegroup placement add  --rgw-zonegroup default --placement-id default-placement --storage-class cold.test
    {
            "key": "default-placement",
            "val": {
                "name": "default-placement",
                "tags": [],
                "storage_classes": [
                    "STANDARD",
                    "cold.test"
                ]
            }
        }

  10. 为新存储类提供区放置信息:

    语法

    radosgw-admin zone placement add --rgw-zone default --placement-id PLACEMENT_TARGET --storage-class STORAGE_CLASS --data-pool DATA_POOL

    示例

    [ceph: root@host01 /]# radosgw-admin zone placement add --rgw-zone default --placement-id default-placement --storage-class cold.test --data-pool test.cold.data

  11. 在数据池中启用 rgw 应用程序:

    语法

    ceph osd pool application enable POOL_NAME rgw

    示例

    [ceph: root@host01 /]# ceph osd pool application enable test.cold.data rgw
    enabled application 'rgw' on pool 'test.cold.data'

  12. 重新启动所有 rgw 守护进程。
  13. 要查看 zone group 配置,请运行以下命令:

    语法

    radosgw-admin zonegroup get
    {
        "id": "3019de59-ddde-4c5c-b532-7cdd29de09a1",
        "name": "default",
        "api_name": "default",
        "is_master": "true",
        "endpoints": [],
        "hostnames": [],
        "hostnames_s3website": [],
        "master_zone": "adacbe1b-02b4-41b8-b11d-0d505b442ed4",
        "zones": [
            {
                "id": "adacbe1b-02b4-41b8-b11d-0d505b442ed4",
                "name": "default",
                "endpoints": [],
                "log_meta": "false",
                "log_data": "false",
                "bucket_index_max_shards": 11,
                "read_only": "false",
                "tier_type": "",
                "sync_from_all": "true",
                "sync_from": [],
                "redirect_zone": ""
            }
        ],
        "placement_targets": [
            {
                "name": "default-placement",
                "tags": [],
                "storage_classes": [
                    "hot.test",
                    "cold.test",
                    "STANDARD"
                ]
            }
        ],
        "default_placement": "default-placement",
        "realm_id": "",
        "sync_policy": {
            "groups": []
        }
    }

  14. 要查看区配置,请运行以下命令:

    语法

    radosgw-admin zone get
    {
        "id": "adacbe1b-02b4-41b8-b11d-0d505b442ed4",
        "name": "default",
        "domain_root": "default.rgw.meta:root",
        "control_pool": "default.rgw.control",
        "gc_pool": "default.rgw.log:gc",
        "lc_pool": "default.rgw.log:lc",
        "log_pool": "default.rgw.log",
        "intent_log_pool": "default.rgw.log:intent",
        "usage_log_pool": "default.rgw.log:usage",
        "roles_pool": "default.rgw.meta:roles",
        "reshard_pool": "default.rgw.log:reshard",
        "user_keys_pool": "default.rgw.meta:users.keys",
        "user_email_pool": "default.rgw.meta:users.email",
        "user_swift_pool": "default.rgw.meta:users.swift",
        "user_uid_pool": "default.rgw.meta:users.uid",
        "otp_pool": "default.rgw.otp",
        "system_key": {
            "access_key": "",
            "secret_key": ""
        },
        "placement_pools": [
            {
                "key": "default-placement",
                "val": {
                    "index_pool": "default.rgw.buckets.index",
                    "storage_classes": {
                        "cold.test": {
                            "data_pool": "test.cold.data"
                        },
                        "hot.test": {
                            "data_pool": "test.hot.data"
                        },
                        "STANDARD": {
                            "data_pool": "default.rgw.buckets.data"
                        }
                    },
                    "data_extra_pool": "default.rgw.buckets.non-ec",
                    "index_type": 0
                }
            }
        ],
        "realm_id": "",
        "notif_pool": "default.rgw.log:notif"
    }

  15. 创建存储桶:

    示例

    [ceph: root@host01 /]# aws s3api create-bucket --bucket testbucket10 --create-bucket-configuration LocationConstraint=default:default-placement --endpoint-url http://10.0.0.80:8080

  16. 在转换前列出对象:

    示例

    [ceph: root@host01 /]# radosgw-admin bucket list --bucket testbucket10
    
            {
                "ETag": "\"211599863395c832a3dfcba92c6a3b90\"",
                "Size": 540,
                "StorageClass": "STANDARD",
                "Key": "obj1",
                "VersionId": "W95teRsXPSJI4YWJwwSG30KxSCzSgk-",
                "IsLatest": true,
                "LastModified": "2023-11-23T10:38:07.214Z",
                "Owner": {
                    "DisplayName": "test-user",
                    "ID": "test-user"
                }
            }

  17. 为生命周期配置创建 JSON 文件:

    示例

    [ceph: root@host01 /]# vi lifecycle.json

  18. 在文件中添加特定生命周期配置规则:

    示例

    {
        "Rules": [
            {
                "Filter": {
                    "Prefix": ""
                },
                "Status": "Enabled",
                "Transitions": [
                    {
                        "Days": 5,
                        "StorageClass": "hot.test"
                    },
     {
                        "Days": 20,
                        "StorageClass": "cold.test"
                    }
                ],
                "Expiration": {
                    "Days": 365
                },
                "ID": "double transition and expiration"
            }
        ]
    }

    生命周期配置示例显示一个对象,它将在 5 天后从默认 STANDARD 存储类过渡到 hot.test 存储类,在 20 天后过渡到 cold.test 存储类,并在冷 .test 存储类中最终 365 天后过期。

  19. 在存储桶上设置生命周期配置:

    示例

    [ceph: root@host01 /]# aws s3api put-bucket-lifecycle-configuration --bucket testbucket20 --lifecycle-configuration file://lifecycle.json

  20. 检索存储桶上的生命周期配置:

    示例

    [ceph: root@host01 /]# aws s3api get-bucket-lifecycle-configuration --bucket testbucket20
    {
        "Rules": [
            {
                "Expiration": {
                    "Days": 365
                },
                "ID": "double transition and expiration",
                "Prefix": "",
                "Status": "Enabled",
                "Transitions": [
                    {
                        "Days": 20,
                        "StorageClass": "cold.test"
                    },
                    {
                        "Days": 5,
                        "StorageClass": "hot.test"
                    }
                ]
            }
        ]
    }

  21. 验证对象是否已转换为给定存储类:

    示例

    [ceph: root@host01 /]# radosgw-admin bucket list --bucket testbucket10
    
            {
                "ETag": "\"211599863395c832a3dfcba92c6a3b90\"",
                "Size": 540,
                "StorageClass": "cold.test",
                "Key": "obj1",
                "VersionId": "W95teRsXPSJI4YWJwwSG30KxSCzSgk-",
                "IsLatest": true,
                "LastModified": "2023-11-23T10:38:07.214Z",
                "Owner": {
                    "DisplayName": "test-user",
                    "ID": "test-user"
                }
            }

其它资源

  • 有关 bucket 生命周期 的详细信息,请参阅 Red Hat Ceph Storage 开发人员指南

7.10.8. 为 S3 启用对象锁定

使用 S3 对象锁定机制,您可以使用对象锁定概念,如保留周期、法律持有者和存储桶配置来实现 Write-Once-Read_Many(WORM)功能,作为自定义工作流覆盖数据删除权限的一部分。

重要

对于对象锁定正确执行来支持 GOVERNANCECOMPLIANCE 模式,定义并需要的值是对象版本而不是对象名称。在编写对象时,您需要知道对象的版本,以便稍后检索该对象。

先决条件

  • 安装了 Ceph 对象网关的正在运行的 Red Hat Ceph Storage 集群。
  • Ceph 对象网关节点的根级别访问权限.
  • 具有版本-bucket 创建访问权限的 S3 用户。

流程

  1. 创建启用了对象锁定的存储桶:

    语法

    aws --endpoint=http://RGW_PORT:8080 s3api create-bucket --bucket BUCKET_NAME --object-lock-enabled-for-bucket

    示例

    [root@rgw-2 ~]# aws --endpoint=http://rgw.ceph.com:8080 s3api create-bucket --bucket worm-bucket --object-lock-enabled-for-bucket

  2. 为存储桶设置保留周期:

    语法

    aws --endpoint=http://RGW_PORT:8080 s3api put-object-lock-configuration --bucket BUCKET_NAME --object-lock-configuration '{ "ObjectLockEnabled": "Enabled", "Rule": { "DefaultRetention": { "Mode": "RETENTION_MODE", "Days": NUMBER_OF_DAYS }}}'

    示例

    [root@rgw-2 ~]# aws --endpoint=http://rgw.ceph.com:8080 s3api put-object-lock-configuration --bucket worm-bucket --object-lock-configuration '{ "ObjectLockEnabled": "Enabled", "Rule": { "DefaultRetention": { "Mode": "COMPLIANCE", "Days": 10 }}}'

    注意

    您可以在 S3 对象锁定中为 RETENTION_MODE 选择 GOVERNANCECOMPLIANCE 模式,以将不同的保护级别应用到受对象锁定保护的任何对象版本。

    GOVERNANCE 模式中,用户无法覆盖或删除对象版本或更改其锁定设置,除非它们有特殊权限。

    COMPLIANCE 模式中,保护的对象版本不能被任何用户覆盖或删除,包括 AWS 帐户中的 root 用户。当对象锁定在 COMPLIANCE 模式中时,无法更改其 RETENTION_MODE,且其保留周期不能缩短。COMPLIANCE 模式有助于确保在期间内无法覆盖或删除对象版本。

  3. 使用保留时间设置将对象放入存储桶中:

    语法

    aws --endpoint=http://RGW_PORT:8080 s3api put-object --bucket BUCKET_NAME --object-lock-mode RETENTION_MODE --object-lock-retain-until-date "DATE" --key compliance-upload --body TEST_FILE

    示例

    [root@rgw-2 ~]# aws --endpoint=http://rgw.ceph.com:8080 s3api put-object --bucket worm-bucket --object-lock-mode COMPLIANCE --object-lock-retain-until-date "2022-05-31" --key compliance-upload --body test.dd
    {
        "ETag": "\"d560ea5652951637ba9c594d8e6ea8c1\"",
        "VersionId": "Nhhk5kRS6Yp6dZXVWpZZdRcpSpBKToD"
    }

  4. 使用相同的密钥上传新对象:

    语法

    aws --endpoint=http://RGW_PORT:8080 s3api put-object --bucket BUCKET_NAME --object-lock-mode RETENTION_MODE --object-lock-retain-until-date "DATE" --key compliance-upload --body PATH

    示例

    [root@rgw-2 ~]# aws --endpoint=http://rgw.ceph.com:8080 s3api put-object --bucket worm-bucket --object-lock-mode COMPLIANCE --object-lock-retain-until-date "2022-05-31" --key compliance-upload --body /etc/fstab
    {
        "ETag": "\"d560ea5652951637ba9c594d8e6ea8c1\"",
        "VersionId": "Nhhk5kRS6Yp6dZXVWpZZdRcpSpBKToD"
    }

命令行选项

  • 在对象版本中设置对象锁定法律保留:

    示例

    [root@rgw-2 ~]# aws --endpoint=http://rgw.ceph.com:8080 s3api put-object-legal-hold --bucket worm-bucket --key compliance-upload --legal-hold Status=ON

    注意

    通过使用对象锁定的合法操作,您可以在对象版本上放置法律,从而防止对象版本被覆盖或删除。法律持有者没有相关的保留周期,因此在删除前仍有效。

  • 列出存储桶中的对象,以仅检索对象的最新版本:

    示例

    [root@rgw-2 ~]# aws --endpoint=http://rgw.ceph.com:8080 s3api list-objects --bucket worm-bucket

  • 列出存储桶中的对象版本:

    示例

    [root@rgw-2 ~]# aws --endpoint=http://rgw.ceph.com:8080 s3api list-objects --bucket worm-bucket
    {
        "Versions": [
            {
                "ETag": "\"d560ea5652951637ba9c594d8e6ea8c1\"",
                "Size": 288,
                "StorageClass": "STANDARD",
                "Key": "hosts",
                "VersionId": "Nhhk5kRS6Yp6dZXVWpZZdRcpSpBKToD",
                "IsLatest": true,
                "LastModified": "2022-06-17T08:51:17.392000+00:00",
                "Owner": {
                    "DisplayName": "Test User in Tenant test",
                    "ID": "test$test.user"
                }
                }
            }
        ]
    }

  • 使用 version-ids 访问对象:

    示例

    [root@rgw-2 ~]# aws --endpoint=http://rgw.ceph.com:8080 s3api get-object --bucket worm-bucket  --key compliance-upload --version-id 'IGOU.vdIs3SPduZglrB-RBaK.sfXpcd' download.1
    {
        "AcceptRanges": "bytes",
        "LastModified": "2022-06-17T08:51:17+00:00",
        "ContentLength": 288,
        "ETag": "\"d560ea5652951637ba9c594d8e6ea8c1\"",
        "VersionId": "Nhhk5kRS6Yp6dZXVWpZZdRcpSpBKToD",
        "ContentType": "binary/octet-stream",
        "Metadata": {},
        "ObjectLockMode": "COMPLIANCE",
        "ObjectLockRetainUntilDate": "2023-06-17T08:51:17+00:00"
    }