开启左侧

[转]Instagram 架构分析笔记

[复制链接]
发表于 2015-10-13 14:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
这是一篇旧文,值得一读, 就转来了:
* R, ?7 v$ ]$ B- i9 V
1 |9 c6 O: z9 O2 o$ d; I" v2012 年4月10日凌晨消息,Instagram 被 Facebook 以10亿美金收购。团队规模:13 人。
/ j* N) _$ M* S+ _# ?! Q
" g; P; I2 w5 |% uInstagram 团队上个月才迎来第 7 名员工,是的,7个人的团队。作为 iPhone 上最火爆的图片类工具,instagram 用户数量已经超过 1400 万,图片数量超过 1.5 亿张。不得不说,这真他妈是个业界奇迹。, R: ?( h1 X8 O
# U5 ]6 z, z6 P, v( J- t
几天前,只有三个人的 Instagram 工程师团队发布了一篇文章:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,披露了 Instagram 架构的一些信息,足够勾起大多数人的好奇心。读罢做点笔记,各种线索还是有一定参考价值的。能打开原文的建议直接读原文。
( E- p4 B  R+ ~, z2 }
" x" X$ q& X3 AInstragram.png1 e6 w2 v" t( K! n
0 |3 P1 `) m& ?7 ^! A1 c- d6 I. [
Instagram 开发团队奉行的三个核心原则:) J7 [* J: w% U* p

4 M5 D/ Z0 E. I, X) R+ o& F* D    Keep it very simple (极简主义)! z9 c3 b3 L" Y( I: k% [
     Don't re-invent the wheel (不重复发明轮子)
! l1 d4 d  q9 a- G$ g     Go with proven and solid technologies when you can(能用就用靠谱的技术)
* c6 n4 c! a' Q! z* n: W+ J9 f
0 H# j$ M! a3 j9 m9 J7 x. `OS/主机
4 D/ S" r3 L+ D# i0 s( G
; W+ G# h* O0 C$ D$ ^) F+ f 操作系统的选择,在Amazon EC2上跑 Ubuntu Linux 11.04 (Natty Narwhal) ,这个版本经过验证在 EC2 上够稳定。因为只有三名工程师,只有三名工程师,所以自己部署机器到 IDC 是不靠谱的事情。幸好有亚马逊。
8 p& t+ m9 T% i, {# R$ C% o2 L5 A' W- _" E; Y3 S4 N, ]! }
负载均衡: O; [/ O$ @- O0 v2 J- [2 w

+ p& Q! k: i3 g# f 此前曾用过两台 Nginx 做 DNS 轮询承载前端请求,这样做会有副作用,现在已经迁移到Amazon的ELB(Elastic Load Balancer),起了三个 Nginx 实例,在 ELB 层停掉了 SSL , 以缓解 CPU 压力。DNS 服务使用 Amazon Route53 服务。; n2 D" ~& V4 \* s6 C2 d6 I' ?

6 C: F1 z6 X# @; O" f9 R: z 应用服务器) e/ q, Y. O1 U

+ O8 B  a9 B* U/ l# J. k8 H 启用了 25 个 Django 实例,运行在 High-CPU Extra-Large 类型的服务器实例上,之所以用 High-CPU Extra-Large 实例是因为应用请求是 CPU 密集型而非 IO 密集型。
  w) X( O. H% W7 D. f( I( {2 \0 q
! k( p0 K. R1 `# G/ T- Y 使用 Gunicorn 作为 WSGI 服务器。过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源。使用 Fabric 加速部署。1 r1 L! P" z4 Y8 G. O- n6 ~

3 k' k! P3 ^! q# T7 O1 m 数据存储! h% m" P; b  C% N! P1 n
% o: G0 n( o. J9 D
用户信息、图片元数据、标签等大部分数据存储在 PostgreSQL 中。主要的 Shard 数据库集群有 12个节点。
/ F8 d% f1 y% b: P" @% z2 G- p$ `. C0 k% I- a4 V. [5 ?8 ^
实践中发现 Amazon 的网络磁盘系统单位时间内寻道能力不行,所以有必要将数据尽量放到内存中。创建了软 RAID 以提升 IO 能力,使用的 Mdadm 工具进行 RAID 管理。5 r. A( \5 _- P7 G& [' ?# _0 A# s; T7 t

1 A" B1 G0 E" G7 a& H 管理内存中的数据,vmtouch 这个小工具值得推荐。
1 ^( m' M8 U8 c7 l2 {8 e4 o6 L' L. h" D
PostgreSQL 设置为 Master-Replica 方式,流复制模式。利用 EBS 的快照进行数据库备份。使用 XFS 文件系统,以便和快照服务充分配合。 使用 repmgr 这个小工具做 PostgreSQL 复制管理器器。* d2 K5 i+ k1 m
4 R8 S& M8 L! o  b+ c2 w
连接池管理,用了 Pgbouncer。Christophe Pettus 的文章包含了不少 PostgreSQL 数据库的信息。  N- f  C& o$ N6 m& _

3 H5 |: I% j7 i* c5 tTB 级别的海量图片存储在 Amazon S3 上,CDN 采用的也是 Amazon 的服务,CloudFront。, A, z3 L% _% k; y( L5 u

0 h! o, b0 h- B& A+ VInstagram 也是 Redis 的重度用户,Feed 以及 Session 信息都用 Redis 处理,Redis 也是以 Master-Replica 方式部署。在 Replica 节点上进行数据备份。4 C, P0 F$ b1 N9 [% o

, T5 H+ K4 H0 X1 p' M1 s5 x2 d- h+ q 使用了 Apache Solr 承担 Geo-search API 的工作,Solr 简单的 JSON 接口也不错。
2 ~/ m4 |2 O  m( X8 G
' |7 s' I1 G; g3 Y# h* k' A9 c 缓存使用了 6 个 Memcached 实例,库使用 pylibmc 和 libmemcached。亚马逊也提供缓存服务-Elastic Cache service ,Instagram 也有尝试,不过不便宜。4 O! O8 U- q  r: T1 l1 c
" y, a$ I# ~* g/ S# J& r
任务队列/发布通知9 s# z/ S( H+ \* }. }. }

- y( L7 X7 [5 m( G6 G, ^ 队列服务使用 Gearman ,通知系统则使用 pyapns 来实现。
6 Y) ]7 ^- i* Y  B5 g8 G
( M# {, E- \+ n5 F 监控
$ w3 N' e. c2 L5 {% ]8 E
& `3 V# \/ p$ A. i8 q% f8 X5 X 前面提及的服务器实例数量加起来,的确有100多个,有效的监控是相当有必要的。使用 Munin 作为主要监控工具 , 也写了不少定制插件,外部监控用 Pingdom 的服务。通知服务使用PagerDuty。: U% o* L/ H2 E" K
8 `) v7 j: |0 c+ z
对于 Python 的错误报告,使用 Disqus 团队开源的 Sentry 来处理。9 n% ?, y- J2 v# T
4 S! g  H  G, u6 l3 ?+ v2 t6 G
几个感想/ t! g2 `7 G  t, x5 f6 a. ?

7 E' B: `' W) o/ \4 R1 G3 C5 e3 J0)轻装上阵说起来容易,做起来非常难。这也是 Instagram 团队目前最令人着迷的地方;
% c: ^& f' h1 S. Q% S
3 T! i3 \: E8 Z( I4 r. q1)Python 社区已经足够成熟,各个环节上都已经有不错的解决方案了。
) H. c& w6 p% ~7 J. ^1 T- W, B; G' M) h, L
2)如果要问我最大的一个感慨,我要说:Amazon 真是一家伟大的公司,甚至比 Google 还伟大3 x/ K: B" Z5 i7 F) Q


转载请保留当前帖子的链接:https://www.beimeilife.com/thread-2324-1-1.html 谢谢

使用高级回帖 (可批量传图、插入视频等)快速回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则   Ctrl + Enter 快速发布  

发帖时请遵守我国法律,网站会将有关你发帖内容、时间以及发帖IP地址等记录保留,只要接到合法请求,即会将信息提供给有关政府机构。
快速回复 返回顶部 返回列表