有奖捉虫:云通信与企业服务文档专题,速来> HOT
注意 当前 COS 已经通过底层索引打散机制实现高 QPS,如果有需要更高性能的 QPS 需求,可以 联系我们。在日常组织文件过程中,我们仍然推荐您遵循本文档的要求,避免过于集中的索引存储方式。

简介

本文探讨请求速率性能优化在腾讯云对象存储(Cloud Object Storage,COS)上的最佳实践。
腾讯云对象存储提供的典型工作负载能力为每秒30000个 PUT 请求,或者每秒30000个 GET 请求。如果您的工作负载超过了上述能力,建议您遵循本指南实现请求速率的性能扩展和优化。
说明
请求负载指的是每秒发起的请求数量,非并发连接数。即您在保持数千连接数的同时,仍可以在1s时间内发送数百个新连接请求。
腾讯云 COS 支持性能扩展,以支持更高的请求速率。如果您的请求是高 GET 请求负载,建议您搭配腾讯云 CDN 产品进行使用,详情请参见 域名管理。如果预计存储桶的综合请求速率会超过每秒30000个 PUT/LIST/DELETE 请求,建议您 联系我们,以便于为工作负载做好准备,避免遇到请求的限制。
说明
如果您的混合请求负载只是偶尔达到每秒30000个,并在突发时不超过每秒30000个,您可无需遵循本指南。

实践步骤

混合请求负载

当需要上传大量对象的时候,您选择的对象键可能会引发性能问题,以下将简述腾讯云 COS 对 Object 键值的存储方法。
腾讯云在 COS 的每一个服务地域都维护了存储桶(Bucket)和对象(Object)的键值作为索引,对象键以 UTF-8 二进制顺序保存在索引的多个分区中。对于大量的键值,例如,使用时间戳或者字母顺序可能会耗尽键值所在分区的读写性能,以存储桶路径examplebucket-1250000000.cos.ap-beijing.myqcloud.com为例,以下列出了可能会耗尽索引性能的一些案例:
20170701/log120000.tar.gz
20170701/log120500.tar.gz
20170701/log121000.tar.gz
20170701/log121500.tar.gz
...
image001/indexpage1.jpg
image002/indexpage2.jpg
image003/indexpage3.jpg
...
如果您的业务典型负载超过每秒30000个请求,则应避免使用上述案例中的顺序键值。当您的业务必须使用顺序编号或日期时间等字符作为对象键时,您可以使用一些方法向对象键名称添加随机前缀,即可实现在多个索引分区实现键值管理,提升集中负载的性能。以下提供了一些在键值中增加随机性的方法。
注意
以下提供的所有方法,均是有可能提升单个存储桶访问性能的方法,如果您的业务典型负载超过每秒30000个请求,在执行以下方法的同时,您仍需 联系我们 以便于为您的业务负载提前做好准备。

添加十六进制哈希前缀

最直接的增加对象键随机性的方式,就是在对象键名称的最前面添加哈希字符串作为前缀,例如可以在上传对象时,对路径键值进行 SHA1 或 MD5 哈希计算,并选取几位字符作为前缀添加到键值名称,通常2 - 4位的字符哈希前缀可以满足需要。

faf1-20170701/log120000.tar.gz
e073-20170701/log120500.tar.gz
333c-20170701/log121000.tar.gz
2c32-20170701/log121500.tar.gz

注意
由于腾讯云 COS 的键值索引是以 UTF-8 二进制顺序作为索引的,因此在执行列出对象(GET Bucket)操作时,您可能需要发起65536次列出对象操作,才能得到原来完整的20170701前缀结构。

添加枚举值前缀

如果您仍想要保留对象键的检索易用性,您可以针对您的文件类型枚举出一些前缀,实现对象分组,相同枚举值的前缀将共享所在索引分区的性能。
logs/20170701/log120000.tar.gz
logs/20170701/log120500.tar.gz
logs/20170701/log121000.tar.gz
...
images/image001/indexpage1.jpg
images/image002/indexpage2.jpg
images/image003/indexpage3.jpg
...
如果您在相同枚举前缀下,仍然有较高的访问负载,持续超过每秒30000个请求,您可以参照上述添加十六进制哈希前缀的方式,在枚举值后继续添加哈希前缀执行多个索引分区,以实现更高性能的读写。

logs/faf1-20170701/log120000.tar.gzlogs/
e073-20170701/log120500.tar.gz
logs/333c-20170701/log121000.tar.gz
...
images/0165-image001/indexpage1.jpg
images/a349-image002/indexpage2.jpg
images/ac00-image003/indexpage3.jpg
...


反转键值名称字符串

当您的业务不得不使用连续递增的 ID 或日期,或需要一次性上传大量的连续前缀对象时,如下述典型用法:
20170701/log0701A.tar.gz
20170701/log0701B.tar.gz
20170702/log0702A.tar.gz
20170702/log0702B.tar.gz
...
id16777216/album/hongkong/img20170701121314.jpg
id16777216/music/artist/tony/anythinggoes.mp3
id16777217/video/record20170701121314.mov
id16777218/live/show/date/20170701121314.mp4
...
如上的键值命名方式极易耗尽2017与 ID 为前缀的键值所在的索引分区,此时将键值前缀的一部分反转后,则实现了一定的随机性。
10707102/log0701A.tar.gz
10707102/log0701B.tar.gz
20707102/log0702A.tar.gz
20707102/log0702B.tar.gz
...
61277761di/album/hongkong/img20170701121314.jpg
61277761di/music/artist/tony/anythinggoes.mp3
71277761di/video/record20170701121314.mov
81277761di/live/show/date/20170701121314.mp4
...

高 GET 请求负载

如果主要的业务负载是 GET 请求(即下载请求)为主,除了建议遵守上述准则外,还建议您搭配腾讯云 CDN 服务使用。
腾讯云 CDN 利用遍布全国和全球的边缘加速节点,向用户分发内容时可降低延时并提高速度,对于热点文件可以支持预拉热的方式进行缓存,从而减少回源到 COS 的 GET 请求数,详情请参见 域名管理 文档。