Skip to content

使用 s3 api 高效的访问文件存储

当前访问请求文件存储 (对象存储) 的方式有网页上传、传输通道、实例内读写 等等。但这几个方式由于实现原因都存在一些缺点和问题。

在容器实例内读写文件存储通常性能不高,这是因为丹摩为了用户的易用性,把对象存储通过 FUSE 映射成支持 POSIX 的挂载点。

这样用户可以方便按照读写文件的方式去操作对象存储,但性能低效。

s3fs 每次上传大文件都需要先落盘到 /tmp 临时文件,完成写入后才进行分片上传。 在挂载点某个目录执行 ls -l 命令,那么 s3fs 会发送一个 List 获取文件列表,然后针对每个文件发送 HEAD 请求。 等等。

那么如何高效使用对象存储? 直接使用类似 s3 cli 工具,避开像 s3fs 这类的 FUSE 用户态文件系统设计带来的影响问题。

什么情况使用 s3 api ?

  • 为了更快更稳定的数据传输
  • 你的应用依赖对象存储

如何申请 ?

当前对象存储的 API 未对所有用户开放,如果有性能需求可以 @客服 后台开通。

🚗 客服在后台创建用户独有的存储桶的 aksk 🔐。

如何使用 ?

可以直接使用各语言的 s3 sdk,也可以使用 awscli、s3cmd、s5cmd 等工具。

bash
apt install awscli

export AWS_ACCESS_KEY_ID=${ak}
export AWS_SECRET_ACCESS_KEY=${sk}
export AWS_DEFAULT_REGION=us-east-1
export AWS_ENDPOINT_URL=https://s3.damodel.com

aws s3 ls s3://pvc-ed9491f7-4cd5-428e-a9ae-damodel8kc71/

性能调优

bash
aws configure set default.s3.max_concurrent_requests 100

aws configure set default.s3.max_queue_size 1000

aws configure set default.s3.multipart_chunksize 64MB

#关闭逐块签名
aws configure set default.s3.payload_signing_enabled false

外网 endpont

当前客户端不在丹摩集群内,可使用外网接入对象存储。

bash
export AWS_ENDPOINT_URL=https://s3.damodel.com

内网 endpoint

当前客户端在丹摩集群内,可使用下面的 LB 地址。相比公网环境来说,链路更短。

bash
export AWS_ENDPOINT_URL=http://100.64.23.251:8000

主流 s3 客户端性能表现

awscli

  • 内网环境上传下载可以到 500MB/s 以上。
  • 公网暂时没做限速,预计 20MB/s 不是问题。

s3cmd

s3cmd 内网只能到 250MB 左右。这是因为 s3cmd 没有提供并发参数。当上传下载大文件时,s3cmd 是串行的分片传输。

s5cmd

s5cmd 表现很是亮眼,内网可以到 800MB 以上。