(本文首发于InfoQ中文站:http://www.infoq.com/cn/news/2012/05/instagram
)
刚被Facebook以10亿美金收购的著名手机照片分享应用Instagram
最近吸引了无数人的眼球,Android版本
登陆Google Play不到一个月下载量就突破1000万,总用户数即将超过5000万。Instagram联合创始人Mike Krieger说他们用了8周时间打造了最初的Instagram
,但现在的系统肯定已经今非昔比。Instagram技术团队曾发表过一篇文章
,介绍了Instagram背后的技术,日前Mike Krieger在名为Scaling Instagram
的演讲里,又介绍了更多细节,让人们能了解到5名技术人员是如何支撑起整个系统的。
一张照片上传的过程是这样的:
- 采用同步的方式写入媒体数据库
- 如果照片上有地理位置标签,则以异步的方式将照片提交给Solr
进行索引
- 将照片的ID加入每个关注者的列表里,该列表保存在Redis之中
- 在显示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个位于不同可用区里的副本,通过repmgr
以Streaming 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个实例,应用服务器通过pylibmc
和libmemcached
进行连接。虽然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背后的技术细节,可以访问其技术团队的博客
。
分享到:
相关推荐
instagram软件 apk
Instagram客户端 高仿~ 初学者入门的好教程!
2019年Instagram调查报告(英文)-Instagram,2019年Instagram调查报告(英文)-Instagram
作者 Instagram 大小 10.29MB 描述 Instagram,iPhone上最著名的照片抓拍、编辑工具之一。它与众不同,为用户创建了一个完整的社交网络。现在它终于抵达了安卓平台,让所有安卓手机用户也能体验这款软件带来的...
549654407452296Instagram.apk
instagram克隆
Scaling-Instagram.pdf
Instagram 2020.07.03 登录协议,10版本,有任何问题请私聊
instagram APP ANDROID
instagram-ios-sdk, 面向iOS的Instagram SDK Instagram SDK这个开源iOS库允许你将 Instagram 集成到你的iOS应用中包括 iPhone 。iPad和 iPod touch 。它是由的Facebook iOS 激发的。正在启动register 在
使用Instagram图片下载的并非图片本身,而是图片链接,用户可以用浏览器或其他工具批量下载。
instagram_private_api, 用于访问 Instagram API private的python 库 Instagram private APIInstagram private API的python 包装,没有 3rd 方依赖项。 同时支持应用程序和网络 api 。 概述当他们在开发人员访问中夹...
Laravel开发-laravel-instagram-api 为Laravel 5.4实现Instagram私有API
PHP-Instagram-API, 用于 Instagram API的PHP 5.3 + 包装器 #PHP Instagram API这是一个用于 Instagram API的PHP + API包装器。API带有一个cURL客户机( InstagramNetCurlClient ) 来访问 Instagran API 。
InstaIndex 可以直观地索引你在 Instagram 的图片。InstaIndex 是一个简单的管道,结合了 Clarifai 的图像 识别/深度学习 API ,以及 Algolia 的搜索作为服务 API ,可以让你直观地索引你的 Instagram 的图片,随时...
前端项目-jquery-instagram,Instagram jQuery plugin
instagraph, 用于 Instagram & PHP Instagraph使用 ImageMagick & PHP的Instagram在这个库中,我将向你展示如何使用PHP和ImageMagick创建老式( 就像 Instagram 一样) 照片效果。 什么你可以用PHP和Imag
这是一个图书馆项目,使instagram的登录更加容易。适用于Android API 10(姜饼)及以上版本。
用于下载Instagram故事的漂亮Flutter应用程序
android-instagram-filter, 像 Instagram 这样的android图像过滤器 用于Android的 Instagram 过滤器面向Android的 GPUImage概念来自: iOS GPUImage框架。目标是尽可能地拥有类似于GPUImage的东西。 顶点和 fragment...