`
zyslovely
  • 浏览: 231456 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[zz]了解Instagram背后的技术

 
阅读更多
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背后的技术细节,可以访问其技术团队的博客。
分享到:
评论

相关推荐

    ios_Instagram客户端

    在iOS开发领域,Instagram客户端的高仿项目是一个热门的学习主题,尤其对于初学者而言,它提供了深入了解移动应用设计和实现的宝贵机会。本教程将围绕iOS平台上的Instagram客户端仿制展开,通过学习,开发者可以提升...

    instagram克隆-源码

    这个项目可以帮助开发者深入了解社交媒体应用的构建过程,以及如何利用JavaScript和相关技术来实现这一目标。下面将详细介绍该项目中涉及的一些关键知识点。 1. **前端框架**:Instagram克隆可能使用了React.js或...

    Instagram-Helper,.zip

    开发者应当首先阅读这个文件,以了解如何将`Instagram-Helper`集成到自己的项目中。 此外,项目可能还包含了测试代码,这对于理解和验证库的功能至关重要。通过测试用例,开发者可以学习到预期的使用方式以及库在...

    instagram.apk

    instagram软件 apk

    Laravel开发-instagram

    首先,我们需要了解Instagram API的基本概念。Instagram API允许开发者访问Instagram的数据,包括用户的信息、照片、视频以及用户活动等。然而,为了安全性和合规性,Instagram API通常需要申请权限并遵循严格的使用...

    Instagram图片下载 V1.0 绿色版

    Instagram图片下载V1.0绿色版是一款专为Instagram平台设计的工具,旨在帮助用户方便地获取Instagram上的图片资源。在互联网日益发达的今天,社交媒体平台如Instagram成为了分享和浏览图片的重要场所,但平台通常对...

    instagram mac版

    1. **浏览动态**:在状态栏图标上点击,即可快速打开窗口,查看关注的人发布的最新照片和视频动态,随时了解朋友的分享。 2. **发布内容**:虽然功能可能受到一些限制,但用户依然可以上传本地计算机中的照片到...

    Python爬虫爬取 Instagram 博主照片视频-Instagram_crawler.zip

    在本项目中,我们将探讨如何使用Python爬虫技术来抓取Instagram博主的照片和视频。Instagram_crawler是一个Python脚本集合,旨在帮助用户自动化地从Instagram上下载特定用户的媒体内容,包括图片和视频。这个项目...

    2019年Instagram调查报告(英文)-Instagram

    2019年Instagram调查报告(英文)-Instagram,2019年Instagram调查报告(英文)-Instagram

    549654407452296Instagram.apk

    549654407452296Instagram.apk

    Instagram 6.12.2

    作者 Instagram 大小 10.29MB 描述 Instagram,iPhone上最著名的照片抓拍、编辑工具之一。它与众不同,为用户创建了一个完整的社交网络。现在它终于抵达了安卓平台,让所有安卓手机用户也能体验这款软件带来的...

    Scaling-Instagram.pdf

    在《Scaling Instagram》这份由Mike Krieger(Instagram联合创始人)于2012年AirBnB技术讲座上分享的演讲中,他详细介绍了Instagram是如何从一个初创项目成长为拥有3000多万用户的应用程序,并在此过程中解决了哪些...

    Instagram登陆协议.rar

    Instagram 2020.07.03 登录协议,10版本,有任何问题请私聊

    instagram APP ANDROID

    instagram APP ANDROID

    Laravel开发-laravel-instagram-api

    **Laravel开发与Instagram API整合** 在Web开发中,Laravel是一个非常受欢迎的PHP框架,以其优雅的语法和强大的功能而备受赞誉。本教程将深入探讨如何在Laravel项目中集成Instagram私有API,以便与Instagram平台...

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

    在构建一个类似Instagram的图片分享社区数据库时,我们需要考虑多个关键方面来确保系统高效、稳定且...通过“camera-jiegou.sql”和“camera-all.sql”这两个文件,我们可以深入了解这种复杂系统背后的数据库设计思路。

    Instagram-Java-master.zip_INSTAGRAM

    通过对这个项目的研究,开发者可以提升对Java编程、Android应用开发、OAuth认证、RESTful API调用等方面的知识,并了解如何将这些技术应用于实际项目中。同时,也可以了解到如何处理社交平台API的限制和最佳实践。

    用于下载Instagram故事的漂亮Flutter应用程序

    【标题】:“用于下载Instagram故事的漂亮Flutter应用程序” 在当今社交媒体盛行的时代,Instagram已经成为人们分享...通过深入学习和实践这些知识点,开发者不仅可以创建类似的应用,还能进一步提升自己的技术能力。

    instagram_private_api, 用于访问 Instagram API private的python 库.zip

    instagram_private_api, 用于访问 Instagram API private的python 库 Instagram private APIInstagram private API的python 包装,没有 3rd 方依赖项。 同时支持应用程序和网络 api 。 概述当他们在开发人员访问中夹...

    PHP-Instagram-API, 用于 Instagram API的PHP 5.3 + 包装器.zip

    PHP-Instagram-API, 用于 Instagram API的PHP 5.3 + 包装器 #PHP Instagram API这是一个用于 Instagram API的PHP + API包装器。API带有一个cURL客户机( InstagramNetCurlClient ) 来访问 Instagran API 。

Global site tag (gtag.js) - Google Analytics