# Instagram 架构：1400 万用户，1 TB 的照片，数百个实例，数十种技术

> 原文： [http://highscalability.com/blog/2011/12/6/instagram-architecture-14-million-users-terabytes-of-photos.html](http://highscalability.com/blog/2011/12/6/instagram-architecture-14-million-users-terabytes-of-photos.html)

![](img/e7b70a6c02b1e7425849dd6d1af801f2.png)

[Instagram](http://instagr.am/) 是为您的 iPhone 提供的免费照片共享和社交网络服务，已获得[即时成功](http://techcrunch.com/2011/08/03/instagram-150-million/)。 在短短一年内增长到 [1400 万用户](http://instagram-engineering.tumblr.com/post/13649370142/what-powers-instagram-hundreds-of-instances-dozens-of)的情况下，他们在 8 月达到了 1.5 亿张照片，同时积累了数 TB 的照片，而他们仅用了 3 个 Instaneers 做到了，所有这些都存储在 Amazon 堆栈中。

Instagram 团队已经撰写了可以被视为该时代早期创业公司的典型描述：[推动 Instagram 运转的因素：数百个实例，数十种技术](http://instagram-engineering.tumblr.com/post/13649370142/what-powers-instagram-hundreds-of-instances-dozens-of)。

Instagram 使用不同技术和策略的模仿。 团队虽小，但经历了快速的增长，摆脱了不断上升的社交和移动浪潮的影响，它使用 SQL 和 NoSQL 的混合体，使用了大量的开源项目，他们选择了基于云的云服务，亚马逊的服务得到了充分利用 可靠性不是通过构建它们自己的，而是通过可用性区域，异步工作计划将组件链接在一起，系统由尽可能多的服务公开，这些服务公开了不需要构建的 API 和外部服务，数据存储在内存中， 在云中，大多数代码都是动态语言，对自定义位进行了编码以将所有内容链接在一起，并且它们运行得很快并且体积很小。 非常现代的建筑。

我们只是在这里博士文章，它写得很好并且很切题。 绝对值得一读。 这里是要领：

*   获得的经验教训：1）保持简单 2）不要重新发明轮子 3）尽可能使用成熟可靠的技术。
*   3 名工程师。
*   亚马逊商店。 他们使用许多亚马逊的服务。 仅有 3 位工程师，因此没有时间研究自我托管。
*   出于各种目的，总共有 100 多个 EC2 实例。
*   Ubuntu Linux 11.04（“ Natty Narwhal”）。 稳定，其他 Ubuntu 版本冻结了。
*   亚马逊的 Elastic Load Balancer 路由请求，并且 3 个 nginx 实例位于 ELB 的后面。
*   SSL 在 ELB 处终止，这减轻了 nginx 上的 CPU 负载。
*   亚马逊的 DNS 的 Route53。
*   高 CPU 超大型计算机上的 25 多个 Django 应用程序服务器。
*   流量是受 CPU 限制的，而不是受内存限制的，因此，高 CPU 超大型计算机是内存和 CPU 的良好平衡。
*   [Gunicorn](http://gunicorn.org/) 作为其 WSGI 服务器。 Apache 较难配置且占用更多 CPU。
*   [结构](http://fabric.readthedocs.org/en/1.3.3/index.html)用于在所有计算机上并行执行命令。 部署仅需几秒钟。
*   PostgreSQL（用户，照片元数据，标签等）在 12 个四倍超大内存实例上运行。
*   十二个 PostgreSQL 副本在不同的可用性区域中运行。
*   PostgreSQL 实例使用[流复制](https://github.com/greg2ndQuadrant/repmgr)在主副本设置中运行。 EBS 用于快照，以进行频繁备份。
*   EBS 部署在软件 RAID 配置中。 使用 [mdadm](http://en.wikipedia.org/wiki/Mdadm) 获得不错的 IO。
*   它们的所有工作集都存储在内存中。 EBS 不支持每秒足够的磁盘搜寻。
*   [Vmtouch](http://hoytech.com/vmtouch/vmtouch.c) （便携式文件系统缓存诊断）用于管理内存中的数据，尤其是当[将](https://gist.github.com/1424540)从一台机器故障转移到另一台机器时，尚无活动内存配置文件。
*   XFS 作为文件系统。 用于在快照时通过冻结和解冻 RAID 阵列来获取一致的快照。
*   [Pgbouncer](http://pgfoundry.org/projects/pgbouncer/) 用于[池连接](http://thebuild.com/blog/)到 PostgreSQL。
*   几 TB 的照片存储在 Amazon S3 上。
*   将 Amazon CloudFront 作为 CDN。
*   Redis 支持其主要供稿，活动供稿，会话系统以及[其他服务](http://instagram-engineering.tumblr.com/post/12202313862/storing-hundreds-of-millions-of-simple-key-value-pairs)。
*   Redis 在多个四倍超大内存实例上运行。 有时跨实例进行分片。
*   Redis 在主副本设置中运行。 副本不断地保存到磁盘。 EBS 快照备份数据库转储。 在主数据库上的 DB 上转储太费力了。
*   Apache [Solr]为[地理搜索 API](http://instagram.com/developer/endpoints/media/#get_media_search) 提供了支持。 就像简单的 JSON 接口一样。
*   6 个用于缓存的 memcached 实例。 使用 pylibmc & libmemcached 连接。 Amazon Elastic Cache 服务再便宜不过了。
*   [Gearman](http://gearman.org/) 用于：将照片异步分享到 Twitter，Facebook 等； 通知实时订户新发布的照片​​； 送纸扇出。
*   200 名 Python 工作者从 Gearman 任务队列中消耗任务。
*   [Pyapns](https://github.com/samuraisam/pyapns) （Apple 推送通知服务）处理超过十亿个推送通知。 坚如磐石。
*   [Munin](http://munin-monitoring.org/) 可以绘制整个系统的指标图并警告问题。 使用 [Python-Munin](http://samuelks.com/python-munin/) 编写许多自定义插件，以图形化显示，每分钟注册数，每秒发布的照片​​等。
*   [Pingdom](http://pingdom.com/) 用于服务的外部监视。
*   [PagerDuty](http://pagerduty.com/) 用于处理通知和事件。
*   [Sentry](http://pypi.python.org/pypi/django-sentry) 用于 Python 错误报告。

## 相关文章

*   [在 Redis 中存储数亿个简单键值对](http://instagram-engineering.tumblr.com/post/12651721845/instagram-engineering-challenge-the-unshredder)
*   [简化 EC2 SSH 连接](http://instagram-engineering.tumblr.com/post/11399488246/simplifying-ec2-ssh-connections)
*   [在 Instagram 上拆分& ID](http://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagram)
*   [EC2 或 Amazon ElastiCache 上的 Membase 群集？](http://nosql.mypopescu.com/post/13820225002/membase-cluster-on-ec2-or-amazon-elasticache) 来自 Alex Popescu

嘿托德，

来自 Instagram 的 Mike。 感谢您的撰写。随着我们不断发展的基础架构，高可伸缩性一直是我们的绝佳资源，感谢您编译的所有出色信息！

迈克，我很高兴。 我真的很感谢你们的开放程度。 好东西。 谢谢。

@Mike（instagram）
我读到您使用 solr 进行地理搜索。 您能解释一下您的解决方案吗？ 您将 solr 3.1 与 geofilt 一起使用还是开发了一些特殊的东西？

这个多少钱？ 只是有一个想法。

亲爱的迈克，

您是否掌握有关 Instagram 服务器基本硬件数据的信息？ 我们必须在大学的“信息管理”讲座中找到 CPU，RAM，固定磁盘存储和处理器等数据。

如果您能帮助我们，我们将非常高兴。

非常感谢！

J，J 和 L

CDN 需要内容可以公开阅读。
然后，Instagram 如何处理仅应与少数人共享的图像

您可以在 S3 上拥有一个私有存储桶项目，尽管直到在 S3 中生成签名密钥，该私有桶项目才可以通过 CDN 路由。 每个被授予权限的用户都可以收到一个签名的密钥。 我不知道这是否是他们具体的做法。

相关文章中“在 Redis 中存储数亿个简单键/值对”的链接不正确。 它重定向到其他一些中等职位。 实际链接是 https://instagram-engineering.com/storing-hundreds-of-millions-of-simple-key-value-pairs-in-redis-1091ae80f74c