了解Instagram背后的技术

标签: instagram 技术 | 发表时间:2012-05-06 22:00 | 作者:
出处:http://pipes.yahoo.com/pipes/pipe.info?_id=10560380f804c7341f042a2b8a03e117

刚被Facebook以10亿美金收购的著名手机照片分享应用 Instagram最近吸引了无数人的眼球, Android版本登陆Google Play不到一个月下载量就突破1000万,总用户数即将超过5000万。Instagram联合创始人Mike Krieger说 他们用了8周时间打造了最初的Instagram,但现在的系统肯定已经今非昔比。Instagram技术团队曾发表过一篇 文章,介绍了Instagram背后的技术,日前Mike Krieger在名为 Scaling Instagram的演讲里,又介绍了更多细节,让人们能了解到5名技术人员是如何支撑起整个系统的。

一张照片上传的过程是这样的:

  1. 采用同步的方式写入媒体数据库
  2. 如果照片上有地理位置标签,则以异步的方式将照片提交给 Solr进行索引
  3. 将照片的ID加入每个关注者的列表里,该列表保存在Redis之中
  4. 在显示Feed时,选取一小部分照片ID,在Memcached里进行查询

在设计系统时,Instagram的设计哲学是简单、为最小化运维负担进行优化并监控一切内容;其核心原则是保持简单,不要重复发明轮子,尽可能使用经过验证、稳定可靠的技术。

由于只有5名技术人员(其中仅2.5名后端工程师),精力有限,选择 Amazon的云服务是个不错的选择。目前他们使用了超过100个 EC2实例用于提供各种服务,运行的操作系统是Ubuntu 11.04,之前的一些版本在高流量时表现不够稳定。在负载均衡方面,他们使用Amazon的 Elastic Load Balancer实现负载均衡,后端运行了3个Nginx实例,SSL只到ELB上为止,降低了Nginx上的CPU负载。DNS和CDN分别由Amazon的 Route 53 CloudFront提供,所有的照片都存放在 S3上,目前已经有几TB的规模了。

用于处理请求的应用服务器运行于 Amazon High-CPU Extra-Large Instance之上,由于他们的请求更多是CPU密集型的,因此这能更好地平衡CPU与内存。采用的开发框架是 Django,WSGI服务器是 Gunicorn,通过 Fabric在所有机器上进行并行部署,一次部署仅需几秒钟。

大多数数据都存放在PostgreSQL里,主分片集群运行于12个 High-Memory Quadruple Extra-Large Instance(68.4GB内存)上,另有12个位于不同可用区里的副本,通过 repmgrStreaming Replication的方式进行同步。由于 Elastic Block Store的磁盘IOPS不高,因此需要将正在使用的数据都加载到内存里, vmtouch能帮助管理内存中的数据。他们在EBS上使用 mdadm实现了软件Raid,以此提升写吞吐量;数据库的文件系统用的是XFS,在从库获取快照时,会先冻结RAID阵列,保证快照的一致性。

应用程序在连接数据库时,由 Pgbouncer建立连接池。目前,Instagram的数据按照用户ID进行分片,某些分片可能会超出物理节点的容量上限,为此他们将数据分成了很多个逻辑分片,映射到少数几个物理节点之上;当一个节点被填满之后,可以将某些逻辑分片移到别的节点上,以缓解该节点的压力。随着数据量的增长,以后他们也会进行垂直分区,Django DB Router能让一切轻松不少。

Instagram也大量使用 Redis来存放复杂的对象(对象的大小做了一定的限制),用于主Feed、活动Feed、 会话系统及其他 相关系统。因为要将Redis的所有数据都放在内存里,此处同样也用了 High-Memory Quadruple Extra-Large Instance,并对数据做了分片。当Redis实例的请求达到4万/秒后,它渐渐成为了瓶颈,于是Redis也做了主从复制,副本的数据会经常导出到磁盘上,通过EBS快照进行备份。

除了Redis,他们还使用Memcached来做缓存,目前运行了6个实例,应用服务器通过 pylibmclibmemcached进行连接。虽然Amazon提供了Elastic Cache服务,但该服务的价格并不便宜,相比之下,还是运行自己的Memcached实例比较划算。异步任务队列使用的是 Gearman,目前有大约200个工作进程来处理各种任务,比如把照片分享到Twitter和Facebook,通知用户有新照片等等。 Pyapns已经处理了十亿的推送通知,非常稳定,他们还自己开发了基于Node.js的 node2dm,用于向Android设备发送推送通知。

监控方面,Instagram使用 Munin以图形化的方式呈现整个系统的运行状况,还通过 Python-Munin定制了一些插件,用来显示业务数据;网络守护进程 Stated可以实时收集数据并做汇总; Dogslow会监控进程,一旦发现运行时间过长的进程,便会保存该进程的快照,以便后续分析,比如响应时间超过1.5秒的请求,通常都是卡在Memcached的set()和get_many()方法上。对于Python的错误,只要登上 Sentry就能实时获取错误信息。

HighScalability上还根据整理Mike Krieger的演讲整理了一些值得借鉴的经验,比如:

  • 找那些你熟悉的技术和工具,在简单的使用场景里先做一些尝试
  • 不要使用两个工具来处理同样的任务
  • 事先准备降级方案,以便在需要时降低负载
  • 不要过度优化,或者希望能事先知道站点要扩展,对于一个初创的社交站点而言,没什么扩展性问题是解决不了的
  • 如果一个办法不行,赶快换下一个

如果您想进一步了解Instagram背后的技术细节,可以访问其技术团队的 博客

丁雪丰 是InfoQ中文站编辑,满江红翻译组核心成员,出版过《Spring攻略》、《JRuby实战》等多部译著。主要关注领域:企业级应用、海量数据计算、动态语言应用等。

相关 [instagram 技术] 推荐:

Instagram的技术架构

- - 标点符
Instagram 被 Facebook 以10亿美金收购. 而在被Facebook收购前的一个月,整个团队才7名员工. 2011年: 3 位工程师. 2012年: 5 位工程师. 坚持 DRY(Don’t Repeat Yourself)原则. 使用通知/信号机制实现解耦. 我们大部分工作使用Python来完成,只有逼不得已的时候,才会用C.

了解Instagram背后的技术

- - InfoQ cn
刚被Facebook以10亿美金收购的著名手机照片分享应用 Instagram最近吸引了无数人的眼球, Android版本登陆Google Play不到一个月下载量就突破1000万,总用户数即将超过5000万. Instagram联合创始人Mike Krieger说 他们用了8周时间打造了最初的Instagram,但现在的系统肯定已经今非昔比.

Instagram: 2年10亿美元背后的技术架构

- - 开放博客
参考: Instagram的技术探索. Instagram是一款免费照片分享移动应用,目前支持IOS和Android. 在1年多的时间里,Instagram发展到140万个用户,1.5亿张图片(几个TB),仅有3个工程师,以10亿美元的天价被Facebook收购. 不得不说,Instagram是业界的一个神话.

Instagram的变异

- 小白 - 互联网的那点事...
周末打算写手机拍照社交,为查资料,仔细看了看Instagram(最近两个月我的活跃度明显降低),大吃一惊,和年初我还活跃那阵子相比变化极大,之前的论点几乎全被推翻. 我之前的论点是这样的:手机拍照社交产品存在两个天然瓶颈. 第一个瓶颈是“信息”,即通过手机拍照传递出去的信息. 在传统渠道里,常见情形是摸出手机给朋友看,边看边讲,这是我家猫猫狗狗的相片,这是我去xxx玩的时候拍的相片——信息通过面对面的交流来传递.

Instagram的迷思

- Shell Wang - 坏脾气的小肥
这辈子遇到的,令我特别着迷的产品只有两款,2008年5月遇到开心,2010年11月遇到Instagram. 我在Instagram上面已经有200多个follower,哇哈哈哈哈,可惜每天两点一线,又没什么生活情趣,总是发以前去动物园拍的相片. 我猜是“与真实好友分享生活中的这一刻”. 作为背景介绍,Instagram是iPhone上(目前只支持iPhone)新出的APP,据说10天增长了20万个用户.

Instagram启示录

- Wenhuan - 所有文章 - UCD大社区
不管认为Instagram是lomo-twitter还是poladroid+iphoneography. 照片分享服务Instagram于 6个月之前上线,上个月24日公开发布了支持实时功能的API,第三方开发人员可以根据标签、地点和地区抓取照片. 数据显示,Instagram目前每周新增13万用户.

Trover 超越 Instagram ?

- PH囧ENIX - 爱范儿 · Beats of Bits
5月4日,Trover 上线,第二周成为 App Store 的 “本周推荐”,现在已经有来自140个国家的用户上传了照片. Trover 是一家小公司,由3名程序员和一名设计. Trover 的起步和 Instagram 很像,尽管它还有一些不完善的地方,但由于其拥有一些 Instagram 不具备的元素,我认为它将超越 Instagram.

用 Instagram 拍摄 Instagram 办公室

- 笑炊 - 爱范儿 · Beats of Bits
Kevin 分享过 Instagram  的创业故事:四个人,八周时间,推倒重建的项目,吸引了超过 500 万用户,成为 iPhone 平台上最受欢迎的图片分享社区之一. 这家位于旧金山的公司有何过人之处. 记者 Nicholas Jackson 拿着 iPhone 走进了  South Park St.

instagram 和不联网

- sylvia - 爱范儿 · Beats of Bits
by 李楠 (newkhonsou@twitter). instagram 是近期窜红的 iPhone App 和图片分享社区. 仅一周时间就积累了 10 万注册用户. 但 InstaCamera 可不是新玩意,那东西以前叫“拍立得”. 谁拿个 Polaroid 在手,立马文艺的牛比闪闪. 数码时代, Polaroid 没落了.

Instagram装B指南

- - 雷锋网
无论是在Facebook还是微博上,炫富和装B都有着很大的需求,在Tumblr上,有一个炫富和装B的小组 Rich Kids of Instagram在数天前刚刚成立,立即以星火燎原之势蔓延开来. 但装B最好的地方还是Instagram,只需拍下一张照片,然后用自带的滤镜处理一下,马上就会神奇地添加各种效果,并可以方便地分享给好友或分享到到Facebook、Twitter,如果你不玩Instagram,你都不好意思说自己装B.