企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 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) ![](https://img.kancloud.cn/d8/c5/d8c54b434528a1efcfacb4dc79703933_200x204.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