刷新 Amazon S3 存储桶对象缓存 - AWS Storage Gatewa

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

刷新 Amazon S3 存储桶对象缓存

当您的 NFS 或 SMB 客户端执行文件系统操作时,您的网关会维护与您的文件共享关联的 Amazon S3 对象缓存中的对象清单。您的网关使用此缓存库存来降低 Amazon S3 请求的延迟和频率。此操作不会将文件导入 S3 文件网关缓存存储空间。它仅更新缓存的清单,以反映 Amazon S3 对象缓存中对象清单的变化。

要刷新文件共享的 S3 存储桶对象缓存,请从以下列表中选择最适合您的用例的方法,然后完成以下相应步骤。

注意

无论您使用哪种方法,首次列出目录都会对其进行初始化,从而使网关列出 Amazon S3 中该目录的元数据内容。初始化目录所需的时间与该目录中的条目数成正比。

使用 Storage Gateway 控制台配置自动缓存刷新计划

以下过程根据您指定的生存时间 (TTL) 值配置自动缓存刷新计划。在配置基于 TTL 的缓存刷新计划之前,请考虑以下事项:

  • TTL 以自给定目录上次刷新缓存以来的时间长度来衡量。

  • 仅当在指定的 TTL 期限到期后访问给定目录时,才会进行基于 TTL 的缓存刷新。

  • 刷新是不可递归的。它仅出现在正在访问的特定目录上。

  • 只有在 TTL 到期后尚未同步的目录上,刷新才会产生 Amazon S3 API 费用。

    • 只有当 NFS 或 SMB 活动访问目录时,目录才会同步。

    • 同步的频率不会超过您指定的 TTL 周期。

  • 仅当您经常在网关和 Amazon S3 存储桶之间的工作流程之外直接更新 Amazon S3 存储桶的内容时,才建议配置基于 TTL 的缓存刷新。

  • 当网关刷新目录内容时,访问已过期目录的 NFS 和 SMB 操作 TTLs 将被阻止。

    注意

    由于缓存刷新可能会阻止目录访问操作,因此我们建议您配置最长 TTL 周期,以便您的部署。

使用 Storage Gateway 控制台配置自动缓存刷新计划
  1. https://console.aws.amazon.com/storagegateway/家中打开 Storage Gateway 控制台。

  2. 选择 “文件共享”。

  3. 选择要为其配置刷新计划的文件共享。

  4. 在 “操作” 中,选择 “编辑文件共享设置”

  5. 对于之后从 S3 自动刷新缓存,请选中该复选框并使用存活时间 (TTL) 设置以天、小时和分钟为单位刷新文件共享缓存的时间。TTL 是自上次刷新以来的时间长度,在这段时间之后,对目录的访问将导致文件网关首先从 Amazon S3 存储桶中刷新该目录的内容。

  6. 选择保存更改

使用 AWS Lambda Amazon CloudWatch 规则配置自动缓存刷新计划

使用 AWS Lambda Amazon CloudWatch 规则配置自动缓存刷新计划
  1. 确定 S3 文件网关使用的 S3 存储桶。

  2. 检查 “活动” 部分是否为空。稍后它会自动填充。

  3. 创建 IAM 角色,并允许建立 Lambda lambda.amazonaws.com 的信任关系。

  4. 使用以下政策。

    JSON
    { "Version": "2012-10-17", "Statement": [ { "Sid": "StorageGatewayPermissions", "Effect": "Allow", "Action": "storagegateway:RefreshCache", "Resource": "*" }, { "Sid": "CloudWatchLogsPermissions", "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:CreateLogGroup", "logs:PutLogEvents" ], "Resource": "*" } ] }
  5. 从 Lambda 控制台创建 Lambda 函数。

  6. 使用以下函数执行您的 Lambda 任务。

    import json import boto3 client = boto3.client('storagegateway') def lambda_handler(event, context): print(event) response = client.refresh_cache( FileShareARN='arn:aws:storagegateway:ap-southeast-2:672406474878:share/share-E51FBS9C' ) print(response) return 'Your FileShare cache has been refreshed'
  7. 对于执行角色,请选择您创建的 IAM 角色。

  8. 可选:为 Amazon S3 添加触发器并选择事件ObjectCreatedObjectRemoved

    注意

    RefreshCache需要先完成一个进程,然后再开始另一个进程。当您在存储桶中创建或删除许多对象时,性能可能会降低。因此,我们建议不要使用 S3 触发器。相反,请使用下文所述的 Amazon CloudWatch 规则。

  9. 在 CloudWatch 控制台上创建 CloudWatch 规则并添加时间表。通常,我们建议固定费率为 30 分钟。但是,您可以在大型 S3 存储桶上使用 1-2 个小时。

  10. 为 CloudWatch 事件添加新的触发器,然后选择您刚刚创建的规则。

  11. 保存您的 Lambda 配置。选择测试

  12. 选择 S3 PUT 并根据您的要求自定义测试。

  13. 测试应该会成功。如果不是,请根据您的要求修改 JSON 并重新测试。

  14. 打开 Amazon S3 控制台,验证您创建的事件和 Lambda 函数 ARN 是否存在。

  15. 使用 Amazon S3 控制台或将对象上传到您的 S3 存储桶 AWS CLI。

    CloudWatch 控制台生成类似于以下内容的 CloudWatch 输出。

    { u'Records': [ {u'eventVersion': u'2.0', u'eventTime': u'2018-09-10T01:03:59.217Z', u'requestParameters': {u'sourceIPAddress': u'MY-IP-ADDRESS'}, u's3': {u'configurationId': u'95a51e1c-999f-485a-b994-9f830f84769f', u'object': {u'sequencer': u'00549CC2BF34D47AED', u'key': u'new/filename.jpeg'}, u'bucket': {u'arn': u'arn:aws:s3:::amzn-s3-demo-bucket', u'name': u'MY-GATEWAY-NAME', u'ownerIdentity': {u'principalId': u'A3OKNBZ72HVPP9'}}, u's3SchemaVersion': u'1.0'}, u'responseElements': {u'x-amz-id-2': u'76tiugjhvjfyriugiug87t890nefevbck0iA3rPU9I/s4NY9uXwtRL75tCyxasgsdgfsq+IhvAg5M=', u'x-amz-request-id': u'651C2D4101D31593'}, u'awsRegion': u'MY-REGION', u'eventName': u'ObjectCreated:PUT', u'userIdentity': {u'principalId': u'AWS:AROAI5LQR5JHFHDFHDFHJ:MY-USERNAME'}, u'eventSource': u'aws:s3'} ] }

    Lambda 调用为您提供类似于以下内容的输出。

    { u'FileShareARN': u'arn:aws:storagegateway:REGION:ACCOUNT-ID:share/MY-SHARE-ID', 'ResponseMetadata': {'RetryAttempts': 0, 'HTTPStatusCode': 200, 'RequestId': '6663236a-b495-11e8-946a-bf44f413b71f', 'HTTPHeaders': {'x-amzn-requestid': '6663236a-b495-11e8-946a-bf44f413b71f', 'date': 'Mon, 10 Sep 2018 01:03:59 GMT', 'content-length': '90', 'content-type': 'application/x-amz-json-1.1' } } }

    您在客户端上挂载的 NFS 共享将反映此更新。

    注意

    对于在包含数百万个对象的大型存储桶中更新大型对象的创建或删除的缓存,更新可能需要几个小时。

  16. 使用 Amazon S3 控制台手动删除您的对象,或者 AWS CLI。

  17. 查看您的客户端上挂载的 NFS 共享。确认您的对象已消失(因为您的缓存已刷新)。

  18. 查看您的 CloudWatch 日志,查看事件中删除的日志ObjectRemoved:Delete

    { u'account': u'MY-ACCOUNT-ID', u'region': u'MY-REGION', u'detail': {}, u'detail-type': u'Scheduled Event', u'source': u'aws.events', u'version': u'0', u'time': u'2018-09-10T03:42:06Z', u'id': u'6468ef77-4db8-0200-82f0-04e16a8c2bdb', u'resources': [u'arn:aws:events:REGION:MY-ACCOUNT-ID:rule/FGw-RefreshCache-CW'] }
    注意

    对于 cron 作业或计划任务,您的 CloudWatch 日志事件为u'detail-type': u'Scheduled Event'

使用 Storage Gateway 控制台手动刷新缓存

使用 Storage Gateway 控制台手动刷新缓存
  1. https://console.aws.amazon.com/storagegateway/家中打开 Storage Gateway 控制台。

  2. 选择 “文件共享”,然后选择要对其执行刷新的文件共享。

  3. 对于 Actions,选择 Refresh cache

    刷新过程所需的时间取决于在网关上缓存的对象数以及在 S3 存储桶中添加或删除的对象数。

使用 Storage Gateway API 手动刷新缓存

以下过程使用 Storage Gateway API 执行手动缓存刷新。在执行基于 API 的缓存刷新之前,请考虑以下事项:

  • 您可以指定递归刷新或非递归刷新。

  • 递归刷新的资源密集度更高,成本也更高。

  • 刷新仅对您在请求中作为参数传递的目录以及这些目录的后代(如果您指定递归刷新)产生 Amazon S3 API 费用。

  • 当网关处于使用状态时,刷新与其他操作同时执行。

    • 在刷新期间,NFS 和 SMB 操作通常不会被阻止,除非该操作正在访问的目录处于刷新状态。

    • 网关无法确定当前缓存内容是否过时,并且无论新鲜度如何,都使用其当前内容进行 NFS 和 SMB 操作。

    • 由于缓存刷新会利用网关虚拟硬件资源,因此在刷新过程中,网关性能可能会受到负面影响。

  • 仅当您在网关和 Amazon S3 存储桶之间的工作流程之外直接更新 Amazon S3 存储桶的内容时,才建议您执行基于 API 的缓存刷新。

    注意

    如果您知道在网关工作流程之外更新 Amazon S3 内容的特定目录,我们建议您在基于 API 的刷新请求中指定这些目录,以降低 Amazon S3 API 成本和网关性能影响。

使用 Storage Gateway API 手动刷新缓存
  • 发送 HTTP POST 请求,通过 Storage Gateway API 调用带有所需参数的RefreshCache操作。有关更多信息,请参阅 AWS Storage Gateway API 参考RefreshCache中的。

    注意

    发送RefreshCache请求只会启动缓存刷新操作。在缓存刷新完成时,这并不一定表示文件刷新完成。要确定在检查网关文件共享上的新文件之前已完成文件刷新操作,请使用 refresh-complete 通知。为此,您可以订阅通过Amazon CloudWatch 活动接收通知。有关更多信息,请参阅 收到有关文件操作的通知