`
san_yun
  • 浏览: 2653464 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Instagram背后的技术

 
阅读更多

刚被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背后的技术细节,可以访问其技术团队的博客

分享到:
评论

相关推荐

    类似instagram图片分享社区数据库设计

    综上所述,设计一个类似Instagram的图片分享社区数据库是一项涉及多方面技术和策略的任务,从基础架构到性能优化,再到用户体验,每个环节都需要精心设计和实施。通过“camera-jiegou.sql”和“camera-all.sql”这两...

    instagram:instagram克隆

    总的来说,Instagram克隆项目是一个全面的实践机会,涵盖了JavaScript及其生态系统中的许多核心概念和技术。通过这个项目,开发者不仅可以提高编程技能,还能了解社交应用背后的架构和工作原理。无论是对于初学者...

    WEB SERVICE EFFICIENCY AT INSTAGRAM.zip

    Instagram作为一个全球知名的社交媒体平台,其背后的技术架构与Web服务效率是至关重要的。Web服务效率涉及到网站的性能、可扩展性、可靠性和用户体验等多个方面。在这个主题中,我们主要探讨Instagram如何通过优化...

    来自Instagram创始人价值十亿的分享:飞速上传的秘密

    Instagram的成功并非偶然,其背后蕴含了深刻的移动设计与开发智慧。通过采取上述策略,不仅可以提升应用的响应速度,还能增强用户体验,最终转化为用户忠诚度和市场份额的增长。对于任何希望在移动领域取得成功的...

    Instagram Live backend architecture.zip

    Instagram Live 是一款非常流行的社交媒体功能,...综上所述,Instagram Live的后端架构是一个复杂的系统,涉及多种技术和组件,旨在为用户提供无缝的实时交流体验。具体实现细节可能在提供的PDF文档中有更深入的阐述。

    Instagram:演示 Instagram 源代码

    Instagram是一款深受全球用户喜爱的照片和视频分享应用,其背后的技术栈和源代码是许多开发者学习和研究的对象。在这个“Instagram:演示 Instagram 源代码”的主题中,我们将深入探讨Instagram的开发技术,尤其是与...

    Instagram

    而提到"Instagram"与"CSS"的结合,我们可以深入探讨Instagram界面设计背后的CSS技术及其应用。 CSS(层叠样式表)是网页设计中的关键组成部分,用于控制网页的布局、颜色、字体、间距等视觉效果。在Instagram的Web...

    Atom-instatom_node,instagram的简单nodejs atom提要提供程序。通过在github上创建一个帐户,为gasp/instatom_节点开发做出贡献。.zip

    《Atom与instatom_node:构建Instagram的Node.js Atom提要》 在当今的软件开发领域,集成开发环境(IDE)扮演着至关...通过深入理解其背后的Node.js编程和Atom插件机制,你不仅可以享受便利,还能提升自己的技术能力。

    Instagram轻

    Instagram轻,作为一个轻量级的应用,其背后的核心技术离不开JavaScript的强力支撑。JavaScript,作为互联网上最广泛使用的编程语言之一,对于构建动态、交互性强的Web应用起着至关重要的作用。在Instagram Lite的...

    Pr-tica1-Instagram

    【标题】"Pr-tica1-Instagram"是一个与Instagram相关的项目实践,可能是一个仿制版的Instagram应用或者是一个与其功能相关的编程练习...通过实践这样的项目,开发者可以提升综合技能,理解社交应用背后的复杂技术架构。

    Instagram-Brave-Bot:这是一个Instagram Unfollowfollow机器人,它使用Selenium通过Brave Browser自动执行其功能

    接下来,我们将深入探讨这个项目背后的几个关键知识点。 1. **Selenium**: Selenium是一个广泛使用的开源自动化测试工具,可以模拟用户在浏览器上的各种交互行为。在这个项目中,Selenium被用来控制Brave浏览器,...

    InstaPhotoDataParser:通过链接从 Instagram 获取照片数据

    而作为一个技术爱好者,有时我们希望更深入地挖掘这些平台背后的数据,例如收集特定用户的照片或者分析热门话题。这就需要用到工具,比如"InstaPhotoDataParser",一个专为解析Instagram照片数据而设计的JavaScript...

    post-writer:用于在Instagram上编辑美食家帖子的PWA

    **标题解析:** “post-writer:用于在...综上所述,post-writer是一个基于JavaScript开发的PWA,专注于帮助美食爱好者在Instagram上创建和编辑吸引人的帖子,其背后涉及的技术和知识点涵盖了Web应用开发的多个层面。

    Redis 实践

    Instagram,这一全球知名的社交媒体平台,以其海量的图片分享功能著称,其背后的技术架构,特别是对于内存管理的实践,值得深入探讨。 #### Instagram的Redis实践概览 Instagram在处理数以亿计的图片及其对应的...

    初中语文文摘社会麻烦背后的商机

    【标题】与【描述】提及的是“初中语文文摘”中的一个社会现象——“社会麻烦背后的商机”,然而这部分内容并没有直接关联IT知识。因此,我们可以从【部分内容】中找到与IT相关的知识点进行详细阐述。 【部分内容】...

    InstaFilters

    本文将深入探讨InstaFilters这一话题,揭示其背后的技术、设计原理以及如何利用这些滤镜提升社交媒体的互动体验。 首先,让我们了解什么是InstaFilters。InstaFilters,即Instagram滤镜,是Instagram应用程序内的一...

    SelfieMirror:这是适用于 Android 的 Instagram 客户端,向我们展示标记为自拍的照片

    本文将深入探讨SelfieMirror的核心功能、技术实现以及其背后的编程语言——Java。 首先,让我们了解SelfieMirror的基本功能。这款应用的核心是它的自拍筛选机制。在Instagram上,用户可以标记自己的照片为自拍,...

    依偎在阿尔卑斯山脚下的欧洲小镇.ppt

    【知识点】 虽然这个文件主要描述的是欧洲阿尔卑斯山...以上就是从描述欧洲小镇的文件中关联到的技术知识点,尽管文件的主要内容是关于旅游,但背后的技术支持不容忽视,它们共同构成了现代旅游体验的重要组成部分。

    奢侈品牌介绍英文.pptx

    Instagram、微博等平台上的精心策划内容使品牌能够直接与消费者建立联系,分享新品发布、时尚秀和背后的故事。同时,大数据和人工智能的运用帮助品牌更精准地了解客户需求,进行个性化推广。 此外,区块链技术也...

Global site tag (gtag.js) - Google Analytics