
之前我們在【靈活雲 · 成本優化系列】中,連接配接分享了五篇關于成本優化的文章( 底部有前五篇的連結 ),背景收到不少希望我們能推送更多關于成本優化方面内容的留言。好!滿足你們。今天我們的【成本優化系列】推送的内容是: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 預算與帳單(一)
深圳靈活雲計算科技有限公司是一家專注于公有雲增值服務的技術創新型公司,為企業客戶提供雲遷移,教育訓練,開發,安全合規以及運維服務。