
之前我们在【敏捷云 · 成本优化系列】中,连接分享了五篇关于成本优化的文章( 底部有前五篇的链接 ),后台收到不少希望我们能推送更多关于成本优化方面内容的留言。好!满足你们。今天我们的【成本优化系列】推送的内容是:S3的最佳优化实践。 在之前的分享中, 提到过一些存储优化的建议, 今天我们通过详细的优化案例来给大家分享在 S3 存储优化过程中的细节操作。虽然 S3 的存储成本本来就不高,但不少客户在使用一段时间 Amazon S3 服务后,都不可避免地考虑到成本优化方面的问题。 在现实状况下,由于多年的数据堆积和后期系统开发等方面因素,不能很准确定义出存储桶中的数据情况(比如某个文件夹下面有多少文件是 30 天以内需要访问的,多少文件是 30 天之外会访问的,多少文件是 0KB 的文件,多少文件是小于 128KB 的文件等)。在些状况下进行 S3 成本优化,过程中可能会遇到很多问题,甚至不恰当的优化方式不但不会降低成本反而会导致费用的进一步增加。所以不能仅靠粗略估计,而是需要通过更细致的分析进行各种优化方式的优劣对比,找到最合适的优化方案。 下面我们一起来看看 S3 成本优化的最佳实践过程吧。
S3存储类型概要
S3存储类型分为
- S3标准
- S3智能分层
- S3-IA (包括one zone)
- S3 Glacier
- S3 Glacier Deep Archive
S3并不是只是简单的按照数据用量来收费,不同的类型有不同的价格,在数据使用费之外,还有其他费用,例如据请求费和检索费等。上边的分类从上到下,数据存储费逐步降低,但是请求和数据检索的费用却反之越来越贵。所以S3的使用总费用是数据存储费+请求检索费+数据传输费用+存储类型转换费。 下图是AWS官方的给出的数据,以1000个文件为例,总大小1GB的使用情况:
我们看一下如此案例怎样优化才是最佳。
S3成本优化过程
注意下面优化的部分提到的内容不涉及到开启了版本控制的桶,对于开启了版本控制的桶虽逻辑相同,但是查询方法会有差异。
1
利用生命周期管理清理掉未完成的分段上传文件
分段上传是针对一些大的文件到S3桶AWS给出的推荐上传方法。但是传输过程中某几个分段失败了,留下了其他的不完整文件分段。由于这部分文件是隐藏文件但却占用空间,在做优化之前,通常建议把这部分从桶上删除掉。如果想了解有多少这类文件可以使用如下命令进行查询(AWS CLI命令)。
aws s3api list-multipart-uploads –bucket my-bucket
很多对存储桶应用较多的用户这类费用甚至占到S3桶总费用的10%。参考以下文档对整桶配置生命周期根据需要清理这些未完成文件分段,使用生命周期删除文件并不产生额外费用。
https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/mpuoverview.html#mpu-abort-incomplete-mpu-lifecycle-config
2
开启S3清单
做优化之前首先要了解成本,需要开启S3清单(inventory)功能,这样可以借助aws athena服务来查询s3 清单中的内容从而更准确地确认各种存储类型的文件列表以及文件数目等详细信息。
S3 清单价格,每百万个所列对象 0.0025 USD,也就是说有十亿个文件书一次清单收费才$2.5美金;Athena 查询成本,每 TB 扫描数据 5.00 USD,依然是十亿文件量级为单位,大概清单文件30-40GB,查询1次价格为$0.2美金。可以看出使用这两个功能的价格在整体成本中几乎可以忽略不计。
下面是开启S3清单过程(图片均来自AWS): S3 控制台=>管理=>清单=>新增
选择大小,上次修改日期,存储类别,默认选仅限当前版本。如果桶开启了多版本,需要选择“包括所有版本“。
3
清单文件建立Athena查询
在开启清单后,最多要近48小时才能收到第一份清单文件,但通常这个时间会少于24小时。参照下列方式在Athena服务中建立一个清单表,以供查询使用。第一次使用Athena点击“入门”之后可能会需要设置在S3中的查询结果的位置。详情参见文档https://docs.aws.amazon.com/zh_cn/athena/latest/ug/getting-started.html 首先创建S3 Athena table,请修改 `inventory_list` 为新表名,并修改’s3://inventory/testinventory/data/hive’为新生成的S3清单地址下的hive前缀
CREATE EXTERNAL TABLE `inventory_list`(
`bucket` string,
`key` string,
`size` bigint,
`last_modified_date` string,
`storage_class` string)
PARTITIONED BY (dt string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION
's3://inventory/testinventory/data/hive'
下边是如何查询Athena清单表的语句:
-- 按照某天生成的清单,查询桶内有多少存储类型:
Select distinct storage_class from inventory_list where dt='YYYY-MM-DD-00-00'
-- 比如按照2020-05-20生成的清单查询:
Select distinct storage_class from inventory_list where dt='2020-05-20-00-00'
-- 查询每个存储类型有多少个文件,文件量多大:(根据上个语句查询出来总共有多少存储类型,按照每个存储类型进行单独查询)
select count(*) as count ,sum(size)/1073741824 as GB from inventory_list where storage_class = 'STANDARD' and dt='YYYY-MM-DD-00-00'
select count(*) as count ,sum(size)/1073741824 as GB from inventory_list where storage_class = 'GLACIER' and dt='YYYY-MM-DD-00-00'
select count(*) as count ,sum(size)/1073741824 as GB from inventory_list where storage_class = 'XXXXX' and dt='YYYY-MM-DD-00-00'
select count(*) as count ,sum(size)/1073741824 as GB from inventory_list where storage_class = 'XXXXX' and dt='YYYY-MM-DD-00-00'
select count(*) as count ,sum(size)/1073741824 as GB from inventory_list where storage_class = 'XXXXX' and dt='YYYY-MM-DD-00-00'
-- 查询每个storage class,0KB的文件有多少
select count(*) as count from inventory_list where storage_class = 'STANDARD' and size=0 and dt='YYYY-MM-DD-00-00'
select count(*) as count from inventory_list where storage_class = 'XXXXXX' and size=0 and dt='YYYY-MM-DD-00-00'
-- 查询标准的storage class, 大于0KB小于128KB的文件有多少。
select count(*) as count ,sum(size)/1073741824 as GB from inventory_list where storage_class = 'STANDARD' and size > 0 and size < 128*1024 and dt='YYYY-MM-DD-00-00'
-- 查询标准的storage class, 小于8KB的文件有多少。
select count(*) as count ,sum(size)/1073741824 as GB from inventory_list where storage_class = 'STANDARD' and size <= 8*1024 and dt='YYYY-MM-DD-00-00'
-- 查询某一些文件夹下的文件大小和文件数量有多大,之后可能会排除某些文件夹不做转换。
select count(*) as count ,sum(size)/1073741824 as GB from inventory_list where key like 'logs%' and dt='YYYY-MM-DD-00-00'
-- 查询30天以内创建的standard存储类型文件具体数量和大小:
select count(*) as count ,sum(size)/1073741824 as GB from inventory_list where storage_class = 'STANDARD' and from_iso8601_timestamp(last_modified_date) > CAST((current_timestamp - interval '30' day) AS DATE) and dt='YYYY-MM-DD-00-00'
-- 如果需要使用S3批处理进行存储类型转换,那么按照特定要求生成我们需要的S3 批处理使用的csv文件,之后使用Athena“save as”功能下载之后,上传到某个存储桶作为 S3批处理的输入文件
Select bucket,key from inventory_list where key not like 'logs%' and size > 128*1024 and storage_class = 'STANDARD' and dt='YYYY-MM-DD-00-00'
4
查询上一个月的CUR,查看单个桶的具体用量信息
如何开启 CUR 请参考下边的链接,建立好 Athena 表。
https://docs.aws.amazon.com/zh_tw/cur/latest/userguide/cur-ate-setup.html
创建后使用CUR select 语句如下,请替掉default.cur_table和bucket_name为资源名。
SELECT
bill_billing_period_start_date,
bill_billing_period_end_date,
line_item_resource_id,
product_product_name,
line_item_operation,
sum(CAST(line_item_unblended_cost AS DOUBLE)) cost,
sum(CAST(line_item_usage_amount AS DOUBLE)) "usageamount(GB/count)"
FROM
default.cur_table
WHERE
product_product_name = 'Amazon Simple Storage Service'
and line_item_resource_id='bucket_name'
and bill_billing_period_start_date >= date_trunc('month',DATE_ADD('day', -1, date_trunc('month', now())))
and bill_billing_period_end_date <= date_trunc('month', now())
GROUP BY
1,2,3,4,5
ORDER BY
sum(CAST(line_item_unblended_cost AS DOUBLE)) desc;
查询表中的具体的收费项目 line_item_operation在下边链接中可以找到对应。
https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/aws-usage-report-understand.html
5
根据查询结果, 采取不同的方式
关于常见的数据转换方案和优劣对比,可以参考如下表格(来源AWS)。
6
根据核算结果,删除不需要的数据
S3删除数据无额外费用,所以如果经过清单分析,发现有一些数据可以删除,建议使用生命周期先对这些数据进行删除。生命周期是通过对特定标签(tag)或者前缀(prefix)进行操作,具体分为两种情况: (1)如果可以确认某些前缀的文件可以完全删除,那么可以直接用生命周期直接对这个前缀下的文件直接删除处理(设置过期时间为1天) (2)如果不是某个前缀下所有的文件都可以删除,那么可以选择对特定的标签(tag)操作,不过需要先使用S3批处理功能对需要的文件打标签。(注意,批处理可以替换所有对象标签,如果已有标签也会被替换掉) 这个例子是1年前的日志列表进行Tag
Select bucket,key from inventory_list where key like 'logs%' and storage_class = 'STANDARD' and from_iso8601_timestamp(last_modified_date) < CAST((current_timestamp - interval '365' day) AS DATE) and dt='YYYY-MM-DD-00-00'
之后对生成的CSV清单进行处理,S3批处理使用方式通过: s3控制台界面–批处理操作–创建作业–清单格式csv–替换所有对象标签 当批处理作业完成之后再对整桶的某个标签(tag)做生命周期删除(设置过期时间为1天)
7
根据之前的核算结果,进行文件存储类型转换
使用S3批处理转换存储类型,通过s3控制台界面批处理操作–创建作业–清单格式csv–复制–选择存储类, 选择以下选项,其他设置保持默认(图片来源AWS)。
关于敏捷云
APN Achievements
全球Reseller排名前十,2012-现在
核心级合作伙伴,2018-现在
中国及全球SPP资质
完全授权培训伙伴
AWS 认证能力
MSP能力认证
云迁移能力认证
Oracle能力认证
安全合规能力认证
DevOps能力认证
云管平台认证
文章资料来源AWS官方,由敏捷云编写
版权归原作者所有
侵删致歉
延伸阅读:
【敏捷云 · 成本优化系列】成本优化与工具(五)
【敏捷云 · 成本优化系列】安全合规与成本优化(四)
【敏捷云 · 成本优化系列】伙伴的力量-敏捷云成本优化建议(三)
【敏捷云 · 成本优化系列】AWS 成本优化(二)
【敏捷云 · 成本优化系列】AWS 预算与帐单(一)
深圳敏捷云计算科技有限公司是一家专注于公有云增值服务的技术创新型公司,为企业客户提供云迁移,培训,开发,安全合规以及运维服务。