韩拓做客全球架构师峰会 谈七牛的产品演进之路

  编者按:

在刚刚结束的由InfoQ举办的ArchSummit全球架构师峰会(北京站)上,七牛云存储CTO韩拓带来了《七牛云存储产品的三年演进之路》。结合七牛的实战经验,分析七牛的客户使用云计算的架构方式,以及为了适应不同的客户类型和使用场景,七牛的产品变化过程,并在此基础上与大家共同探讨云计算的产业构成,给出企业如何更好使用云计算基础设施的建议。

\

以下为演讲实录:

实录内容:

韩拓:今天分享的话题是七牛的产品演进之路,看这个题目像是来做广告的,来了这么多人我挺高兴的,并不是在做广告。

七牛是2011年成立的,我们作为在国内云计算产业的一个参与者,见证了云计算这个产业从刚开始的一个起步到今天大家看到这么蓬勃的发展,这三年是经历了这样一个过程。

咱们今天会场大的话题是真实的云计算,我这个题目的本意是想看看七牛这个公司和产品变化的经历引发大家对国内云计算的环境都有谁?怎么样做云计算?谁在用云计算。

先讲一下七牛以及产品关键的节点,主持人说谁在用七牛,我不相信人这么少,应该是有的人没有举手。2011年下半年成立的,10月份写了第一行代码,当时的办公室也没有,我们几个人是在上海的浦东图书馆办公的。那个地方有免费的空间、网络和水。大家在上海创业也可以考虑这么做,那个地方是很好的。

2011接近年底的时候,第一版系统上线,有了第一个机会和第一个使用云存储的客户。

2012年初我们有了第二个机房,后续的有很多的机房,去构建我们上传和下载加速的能力。

2012年这一年我们是打造存储1.0和数据处理的1.0版本。

2013年开始我们做存储的2.0,进一步降低存储的成本冗余度和提高数据的可靠性。

数据处理的2.0,异步的上传回调处理,包括用户可以定义自己处理的模块等等功能。

现在做的是我们前两天上线的分区域处理的中心,整个的配置和原数据、里面存储的文件和另外一个区域是独立的。我们在北京做了一个很大的数据中心,作为我们第二个存储的区域。

这三年七牛在怎么样的环境产业中生存呢?正好契合了我们今天的话题,真实的云计算。

我在七牛做这份工作,我们现在很冷静、客观的看我们国内云计算到底是什么情况。我观察到在IaaS层面就是两个:云主机和云存储。国内还有一个很有意思的现象,没有一家能够把这两个都做的很好。至少到今天,七牛还是专注在云存储上面。云主机有三四家是做的比较好的,好像还没有形成AWS那样一整套很好用的方案。

在PaaS一层在我看来是有很多垂直化的云,涉及了很多方面,我这里罗列了。就是一个图片的云,或者是一个视频的云。还有更垂直的,比如说我是给电商的客户做云,或者是给游戏的客户做云,这是PaaS在国内非常生机勃勃的现象,非常好。

甚至这里面有很多的产品自己都没有叫云,本身它已经是云了。

从托管的形态上看,现在在国内有公有云,这个是最多的。跟国外不太一样的地方是我们见到了很多私有云和混合云这样的方案。私有云是在你的数据中心内把我的软件卖给你,混合云是某种程度上的代运维,边界是每个厂商找的都会略有区别。但是核心的思路是硬件的设备是在你的数据中心内的,但是运维的事情是提供这个服务的厂商去管的。尤其是一些传统的行业,一下子还接触不了把我的数据放在公有云上,他们更倾向私有云和混合云方面。

产业形势是三个:布局基本完成。任何一个业务你设想自己在做的事情,如果你想用云计算构建自己的业务的时候,想不到还缺什么,基本是全的。应用也开始落地,2014年非常多的企业开始选择云计算,从七牛业务的曲线也能看出来,2014年初开始有一个很大的爆发。包括大量的传统行业也开始进入云计算的这个行业。生态还未形成,有这么多做云计算的,大家之间的关联还没有建立起来,还是在各自为政,自己玩自己的。这个其实是和国外的云计算相比是差的比较远的一块,比如说在国外我做一个处理图片的PaaS,我必然是基于AWS做,我从S3读取完以后再存储到里面。其实不同的云计算供应商之间,有千丝万缕的关系。但是这个现象在国内到今天我们暂时还没有看到。

咱们看一看在国内有什么人使用云计算呢?从七牛角度来说,当然是不全面的,我们没有做统计或者国内云存储的使用情况。有一类是初创型做APP的非常多,这也是国内使用云计算最先的一波人。他们关注的是什么呢?他们关注的是方便,你的API是不是够简单,你的SDK是不是拿过来就能用。初创型的APP唯一的诉求是快,假如说我拷贝一个国外的模式,我肯定希望一个月或者三个月内就能够上线,他们关注的是产品的应用性是怎么样的。

还有一类很奇怪,他们也是使用云计算最早的一波人。是什么样的人呢?是传统媒体属性的互联网服务,比如说做新闻、论坛的。为什么他们这么早使用云计算呢?他们的业务是以静态的数据为主,他们对云的需求并不强,说白了他们是把云存储当成一个旁柜加CDN做的,算起来比较便宜,就迁过来了。这类客户关注的是成本,一定要比其他方案更便宜。

下面一类是UGC或者是web2.0类的业务,做社交的,比如说摇的。现在做图片分享的,短视频分享的这样一类人。他们为什么用云计算呢?因为他们对用户体验的要求是最高的,我不能摇一摇什么都出不来。也不能说拍一个短视频,传半天也传不出去。他们在世界上对用户体验最苛刻的一群人,使用云计算可以帮助他们用比较低的代价去获得一个更好的用户体验,这是一类用云计算的人。

还有一类是做PaaS的供应商也会用七牛的产品,比如说我是一个做视频的解决方案,帮你把客户端的播放器做好,内容的管理、后台怎么审核我都帮你做好了,他们还缺少存储和网络加速的方案。这个时候,基于一个云去构建PaaS的业务,使他们更专注于他们想做的点,而不用去操心我要去买一个数据中心等等的问题。

这一类客户其实更关注的是你的这个产品平台是不是够开放,你分享的精神是不是够强,在这个行业里的职业道德是不是够好,他们可能是关注的这个。

还有一类是已经比较成熟的业务,带宽几十个G,存储是几百T,或者是几个PB这样的规模了。往往是从一个小的规模发展起来的,这个过程中可能是忙于和业务相关的那一块,忽略了基础设施上的积累。这时候他们就发现我的规模突然变大了之后,我在技术上有瓶颈了。我以前用的到了量大的时候就出现问题了,或者说带宽有上百个G,我不知道怎么管理CDN的供应商了。这样一波人会很迫切的使用云计算,帮助他们解决技术上尤其是基础设施这一层遇到的瓶颈。

最后一个是传统的行业,已经开始互联网化的传统行业。我关注到2014年开始,大规模的有传统行业进入到互联网这一块。比如说做家电、安防视频、教育等等。他们的特点是什么呢?第一个是他们的量很大,因为它不是白手起家的一个业务。比如说做安防的,我以前是卖政府、学校、超市等等2B的,但是这个量一旦乘以一百、一千的量,比如说我卖给家庭,你上班的时候我帮你看着家里有没有进小偷,家里的狗是否去咬沙发了。

还有一点是互联网说白了是很屌丝的,真正见到钱,挣过钱的并不多,但是传统行业是见到钱的,并不会很吝啬的花钱。上面的业务都对钱很关心,但是传统行业对效果是最关心的,你一定要够好用,够快速,够稳定。钱都好谈,这是对传统行业来说。

这个可能是把一个东西卖给互联网用户和卖给传统行业的用户是有区别的。

下面讲一讲七牛该怎么样做产品呢?有一个大的前提是我们叫七牛云存储,至少到今天还是叫七牛云存储,肯定是围绕存储这个话题来讨论我们该怎么做产品。下面几个问题都要回答了,存储是什么?存储的客户是谁?他们的需求是什么?最后一个是七牛应该怎么满足这些客户存储上的需求?

2011年我们刚成立的时候一群人聚在一起想大干一场,那个时候想做云存储,面对的第一个问题是存储是什么?取决于你该怎么做事情,要做什么产品的第一个问题。我们在当时其实是很茫然的,讨论出来的一个结果也是很沮丧。这个是存储,很简单,就是一个存储的池子,有两个API,一个是往上传的,一个是下的。这是一个很沮丧的结果,这么一群人聚在一起雄心壮志,想干一番事业。就发现你的事业就是这样的,怎么办呢?因为当时我们是菜鸟,我们并不能回答这个问题,云存储这个平台应该是什么样的?今天你看七牛的文档,它的功能很复杂。到底是怎么去变化的呢?我们七牛这帮人是怎么从这样一个菜鸟能够去深刻的理解怎么做云存储的呢?

最核心的思路就是说我们对产品的设计是很克制的,从来不会去想象什么东西,完全是以客户的需求为导向的,客户需要什么我们就加什么?可能就随着你客户的种类越来越丰富,你的产品适用性越来越强。这个是我们的第一个客户,那个时候还很流行刷图片,很多的图片在刷。他用了七牛,我们在上海附近做了第一个数据中心,这个客户在北京。他说你们功能挺不错,API也很简单,当然确实是很简单。但是就是速度太慢了,因为它追求的是流畅的感觉,经常是断了,要加载一下下面一屏才出来。后来我们就反思这个问题,要加CDN的点,我帮你对下载做缓存,对上传也要加速。对上传加速比较难,因为它没有什么可缓存,我只能从网络上帮你做加速,这是我们第一次的迭代,加了一层CDN。是我们自己去做了一些机房,和我们的CDN合作的伙伴要了一些点,形成这样一个变化。

这个加上之后,我们每天晚上都睡不好觉。这个机房做存储的,数据肯定不能丢,你把所有东西都放在那个机房了,机房还是在海边,很担心。电断了服务就不可用了,这个还好,电来了我还可以做。万一来海啸或者突然一天被雷劈了怎么办?我们又做了一个迭代,唯一好处是让我们在晚上睡的好一点。大概在一百多公里之外,在杭州又做了一个机房,又花了一些钱,找关系拉了一根裸光纤把两个机房连在一起。其实连在一起就是一个局域网了,带宽是一百多G级别的。在主机房上传的数据我们异步实时的同步到备用数据中心,对下载来说还是从主机房去下载。但是我们会做一件事情,把主机房所有下载的访问日志同时在备用机房播放一遍,保证这个机房所有的缓存是热的。

所以你看到两个机房带宽图是完全一样的,假如说这个机房的电停了,或者说这个区域的网断了,我们立刻通过DNS上传下来的口切到这个机房,立刻就可以用。这个机房被类劈了和海水淹了,我们也有一份带副本的数据在这个机房,数据的可靠性也能保证。

这个东西做好之后,我们就觉得挺完善的了,我们现有的客户都满足了,他们用的很开心,我们晚上睡的也安稳,挺不错的。后来我们发现一些问题,你一直找那些创业型的APP,好像做风投一样,一百家有两三家做起来就不错了。世界上真正有保有存储数据的还是更成熟的APP或者是网站,怎么样把他们的数据弄过来呢?我们发现挺难的,起码它是几个T。你也可以想象一下公司里的非结构化规模是怎么样的,随便一个APP跑一个月就是几个T,大一点是PB的,传的话要用四五年,肯定是不行的。

我们就推出了一款产品或者服务,大概是一个盒子,里面可以塞五六块磁盘。我们就从我们的机房把盒子寄到我们客户的数据中心去,借口是USB3.0的,插到服务器上导入这个硬盘上,叫快递再寄回到我们数据中心。我们运维再把这个盒子插到我们的服务器上,再往我们存储系统里面导,导完之后就可以跟客户说你的业务可以切过来了,你的数据已经七牛了。

这个方式的工作非常好,你可以算带宽,是很高的,而且成本很低。这么一个东西,寄快递就像上淘宝似的,一二十块钱就搞定了。但是它有一个问题,你数据量再大怎么办?这个是五块盘,按三个T是15T,如果是300T不能寄这样一堆盒子,插也插不过来。怎么办?我们就应该有更大的方案,寄机柜。不光是寄的东西变大了,方案也不一样了。这个数据要导两次,进了客户的机房之后,从它的存储系统里面往这个上面拷,放的是这个磁盘上格式化一个系统,按照一个文件一个文件的去摆放,回到我们这里再导一次。这个方案是导一次就可以了,因为它规模大,这个图里面寄六个机柜,就是60台服务器插满3个T的盘,一台机器插12块。

我们认为这个东西发出去的时候,已经是我们存储系统的一部分了。这个时候在客户这里就导一次,导入的程序是我们来编写的。当然这个时候不是用USB插,是连到局域网里面的。我们获得了网络可访问之后就可以读了,读完了我们直接烧制成存储系统里面,该怎么放就怎么放。这个东西再寄回去,往我们存储局域网里面一放就立刻可以用了,速度变的非常快。磁盘也很多,整个六个机柜的吞吐比如每个用四根一万兆的线跟现有的网络对接,总存储是很大的。

还有一个问题,它的数据是不断有上传的?通过这个东西把既有的东西搬过来了,快递寄回来的时候又有新东西上传,但是并不能切过来,访问的数据是看不到的。我们又推出了镜像存储的功能,一个标准的存储系统里面有三个文件,我突然去getkey1版必定是404。现在我把原来的数据中心建立关联,我配置到上面以后,再getkey1的时候发现没有了,在原来旧的数据有有。比如说寄快递的这三天新上传的文件就拖回去了,拖到七牛的数据中心,跟你新上传的请求是一样的,上传到存储系统,返回到外面,对客户来说是透明的。

区别在于是它会把数据给你存下来,它把六个机柜寄过来之后,再配上镜像存储,下载这一块的东西可以马上切过来。随着它切的时间越长,机房的访问量越少,这个相当于是做缓存了,持久化的存在你的系统里面。

假如说客户端是直接上传到七牛的话,原来数据中心变成只读的数据中心,镜像存储跑一段时间可以预期的是基本上就没有访问了,很平滑的把数据切过来了。后面比对一下原数据还缺哪些,这个数据量就很少了。

配合这三个东西,让七牛把一些大的客户,好几百T的客户给拉过来了。现在聊的是你新上传的东西早晚要切到云,不能一直往你的数据中心传。七牛的上传方案是什么呢?所以UGC一类的业务不能容忍的一点是这个数据从我的客户端到我的服务器,再从我的服务器到七牛,太慢了。它的数据中心是单个的,没有做加速的,速度也会很慢。其实它期望的是客户端直接跟七牛的服务器建立关联,不能随便一个人就传,所以我们做授权的模型是客户端跟客户业务的服务器申请一个授权,这个可以是单次的也可以是批量的,比如说想上传一百个文件,就把一百个文件的批量授权申请过来。在七牛的accesskey和secretkey传,七牛用客户的两个kea去验证是不是合法的。这样就能够做到客户端和业务的服务器仅仅是有一些原数据的沟通,费流量的,慢的东西是客户端直接切到七牛服务器的。

如果说客户端直接往七牛传就没有它什么事了,作为业务最中心的服务器肯定是需要控制的,我们又加了一个功能是做回调。客户端直接往七牛这里传,返回到客户端之前我们有一个回调客户服务器的,如果可以我们再返回到客户端。这样业务的服务器就可以做很多的事情,比如我去做一个分享的链接、推送等等,就看它的业务逻辑是什么样的。

下面这一块是说七牛是怎么对数据做处理的架构图,比如说刷图片的APP,上传的是原始的图片,可能用手机拍摄的,大概是1兆到几兆。但是都是几KB的图片,把几兆用到客户端缩小是非常不经济的,面对这样的需求有这样一个集群,是专门做和运算相关的。比如说把一个图片缩小、放大、打水印或者对视频做转码等等,这是一个专门的集群。普通下载是跟最早的一样,跟存储集群下载。带有数据处理的是根据计算集群的,从内部拖过来之后做完处理再返回到客户端。

具体使用是这样的,比如说这张图片很大,就有一个参数,比如说是一百乘一百的分辨率。七牛的服务器最入口的时候看到带问号的,并且是处理的。下载路径就变成这样了,把好几兆的图片加载到集群里面去,缩成一百乘一百的分辨率,再返回到客户端。

下面是一个让你的URL更好看一些,直接定义-small,这个语义和上面是一样的。

还有一些很极客的东西,这是在我们数据处理里面也是能支持的。这是一个视频,是对视频第10秒做截图,然后我可能想去缩小它或者打一个水印,这是另外计算的操作,我们就用一个广告图接起来,加上打水印或者做成一百乘一百,很实用。有的客户URL拼的非常长,做了很多的操作。所有自定义操作都可以用管道的方式拼接起来。

刚才我们说计算2.0,是什么意思呢?刚才讲的是1.0。因为最近做音频和视频的多了,比如说上传的文件是AVI的,但是想在浏览器里面看,不能说几百兆的视频当场给你转出来,肯定是很慢的。这一套主要是针对副媒体类的特别大的图片,用单反拍出来音视频之类的。这个工作是上传一个三百兆的视频,我在API配置对这个视频做处理的异步任务。这个任务就会被扔到任务管理的集群里面去,或者你不是上传出发也可以。比如说我已经存了这么一堆的视频了,可以通过它的API直接添加这样的任务,这两个是一样的。这里面其实是一个队列,这个队列的优先级和费用、CPO都可以配置,特别急就贵一些,不急就等半夜,很便宜。

调度之后会到数据处理集群,读取到原始文件会返回来。我们做了一个持久化操作,你用什么文件名放到哪个目录里面都可以配置,处理完之后会有一个业务回调。比如说你这个时候你就可以给用户发回调了,比如说我转码已经完成,你可以发给你的朋友看了。

如果说没有做完的,这个时候你添加的时候有一个任务的UID,比如说你还在排队,前面还有多少人,估计多长时间做完,也是有这样一个查询的API。

时间关系,我后面就不讲了。在中国到底是什么样的人在用云存储呢?到底是怎么在用?七牛做产品的风格又是怎么样的呢?怎么样一步一步从让人很沮丧的图,变成了我们自认为还是挺完整的存储系统,希望这个话题对大家去了解和认识到国内云存储和云计算的产业形态有帮助。

谢谢!

随意打赏

提交建议
微信扫一扫,分享给好友吧。