这篇文章简单谈谈对象存储服务的省钱建议,在创业公司干活,成本控制还是有点重要的,毕竟没有金主爸爸照顾,每个月省点钱,说不定就能“活”久一点。十分感谢Ruby China会员哥有石头的指点。

对象存储服务(OSS)

OSS全称是Object Store Service(对象存储服务)。这么说可能有点抽象。可以简单把它理解成一个托管资源的地方,这些资源也就是名称中的“对象”。运营网站的过程中总是少不了要存储,图片,小视频这些静态资源。如果是在服务器本机存储这些东西,维护成本太高,不利于迁移,并且容灾效果不佳。一般会建议“不要把鸡蛋放在同一个篮子里”,也就是托管到第三方的服务中去,而这个存储资源的服务名为对象存储服务。

如果只有存储功能,那么OSS服务就更硬盘没啥区别了,它还必须要有外网访问的能力,这样你才能把东西上传上去(上行流量),并且把上传的东西供给别人访问/下载(下行流量)。简单来说OSS就是集存储与访问于一身的服务。还能够根据需要对自己的资源进行备份以免数据丢失。

费用分析

科技发展到今天这个地步,磁盘空间几乎已经成了最廉价的资源。故而在OSS中,存储费用其实是很低的。而在流量为王的年代,最贵的还得是流量。而对于任何服务来说基本都会是上行量要远小于下行量。故而下行流量也成了OSS中最为昂贵的一环。笔者公司上个月OSS服务的上行流量也就几十G,而下行流量是3.2TB左右。下行流量换算成人民币大概是1600元,单价是0.5元/GB。当流量只有几百G的时候你可能感觉不到有啥,然而当流量上T之后,多少也会感到不安。按照网站如今的访问量,下个月的流量保守估计能到5T。这笔费用想想就有点害怕。

当时还是阿里云的双11活动,我们这边有两套方案

  1. 购买阿里云的OSS下行流量包,按年购买每个月5TB的流量,大概1.6W左右的费用,费用大概是0.26元/GB。
  2. 不再使用OSS下行流量的方式直接读取资源。而是采用CDN回源的形式,下行流量统一走CDN流量,费用大概是0.24元/GB ~ 0.26元/GB这样。

方案一比较省事,趁着双十一直接掏钱就完了,然而可扩展性极差,万一哪个月流量超5TB,那么多出来的那部分依旧需要按照0.5元/GB来计费,从长远来看并不是一个很好的选择,这么便宜的流量包也不是每个月都能买到。方案二则比较费事,需要配置CDN域名,CDN访问OSS的权限,SSL证书等等,不熟悉的话可能要折腾个大半天,然而长远来看不管每个月流量多少,都是按照0.24元/GB ~ 0.26元来计算,果断选择方案二。

所谓CDN回源,指的是当CDN服务并没能缓存到对应资源的时候需要回源到OSS端去下载。用户端访问CDN服务,CDN服务找不到这个资源则再去OSS那边缓存资源到本地,所产生的费用跟用户端直接访问OSS获取资源是完全不同的。前者产生的叫回源流量,后者产生的是OSS下行流量。OSS下行流量一般比较贵,量也比较大,回源流量一般量不会很大,CDN有缓存之后都是直接从CDN返回,CDN下行流量费用也相对便宜。

虽说方案二除了CDN下行流量费用,还需要支付HTTPS费用(按照次数),以及回源流量费用,不过后面两者相对比较便宜,不管怎么算都比以“公共读”的方式从OSS直接获取资源要便宜许多。虽说方案二比较费事,但是费用降低了接近一半。假设每个月流量能达到5TB左右,粗略估计大概

直接从OSS上读取: 5 x 1024GB x 0.5元/GB = 2560元 CDN回源优化之后: 5 x 1024GB x 0.26元/GB(CDN下行流量是0.24元/GB,再加上回源流量,HTTPS请求次数的费用,粗略按照0.26元/GB计算)= 1331元

虽说不是很精确,但保守估计这个月能省个1000块钱左右吧,流量越大省的越多。

更进一步

上面是从云服务商本身做的优化,从OSS直连下载的模式切换到CDN回源到OSS的模式,原则上能省下一大笔。并且,还可以在此基础上做更多的优化工作

购买流量包

一般来说购买流量包的流量费用要比按量付费要便宜。这里已经从OSS下行流量切换到CDN流量了,所以需要购买CDN下行流量包。OSS的下行量流量包有点像中国移动的模式,购买流量包之后每个月都有定额流量,超额了要另外购买,用不完的就浪费掉了。而CDN的下行流量是,有效期是一年,用多少买多少,假设你买了5T的流量,用不完,下个月继续用,用完了再买就好,个人会更喜欢CDN这种模式。CDN的下行流量包,笔者所购买的是5T的套餐,大概是768元,这样算下来单价是0.15元/GB。比起原来的0.5元/GB的OSS下行费用,一个月下来要轻松不少呢。

套餐.png

节流

后来发现公司自身的资源也有很大的优化空间,这方面不同的公司可能不一样。笔者的公司主要流量都是图片,视频。而其中的流量大头其实是视频。发现最开始用iPhone拍摄的视频大概是20~30M左右。这不仅上传耗时,用户下载视频也费流量。后来我们决定采用720P的配置来拍摄视频,视频大小大概缩小到17M左右,又因为用户是用手机预览的视频,所以几乎不会感觉到区别。

在服务层面,再对原来iPhone拍摄出来的MOV格式的视频做压缩并转换成MP4格式,大小能够进一步减少,而且MP4格式的兼容性会相对好一些。转换后的视频大小大概是2MB ~ 5MB左右。以下是我的视频转换脚本,如果不执着于无损压缩,用这个配置去压缩的视频一般人肉眼也分辨不出来

ffmpeg -i source.mov -vcodec h264 -y -preset veryfast target.mp4

视频成功转换并上传到云服务之后,转换后的视频依旧会保存在服务器,如果放着不管,一段时间之后磁盘必然会塞爆。这个时候做个定时任务处理一下即可

# app/jobs/auto_clean_videos_directory_job.rb
class AutoCleanVideosDirectoryJob < ApplicationJob
  queue_as :default

  def perform(*_args)
    FileUtils.rm Dir.glob(Rails.root.join('tmp/videos/*'))
  end
end
# config/schedule.yml

auto_clean_videos_directory_job:
  cron: "0 0 */10 * *"
  class: "AutoCleanVideosDirectoryJob"
  queue: :daily

倒也不用太频繁,每10天清除一遍遗留下来的视频数据就可以了。如果磁盘剩余空间小,可以考虑把频次提高一些。

尾声

这篇文章简单总结了一下笔者近期在优化OSS费用方面所做的工作。目前看来比较经济的策略是OSS只做存储,下行流量走CDN,再搭配上流量包,流量的费用能够节约不少。虽然说这种做法会产生回源流量,不过总的来说回源流量也要比OSS下行流量要便宜不少。而在自身服务层面,则可以尽可能降低资源的大小。咋一看从15M压缩到5M只少了10M似乎没什么,然而要是这个视频有500个人访问,那其实就相当于节省了5G左右的流量了。长远来看还是有点价值的。