开启左侧

[转]Instagram 架构分析笔记

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

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

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

x
这是一篇旧文,值得一读, 就转来了:" R2 o) l. c+ Q0 T, l) {
  i* @% N1 e1 X6 B% V( E8 D, B
2012 年4月10日凌晨消息,Instagram 被 Facebook 以10亿美金收购。团队规模:13 人。5 Y7 U, y0 n/ P' A/ P7 v
5 m9 b0 m0 A6 O* M% h. B+ g. s
Instagram 团队上个月才迎来第 7 名员工,是的,7个人的团队。作为 iPhone 上最火爆的图片类工具,instagram 用户数量已经超过 1400 万,图片数量超过 1.5 亿张。不得不说,这真他妈是个业界奇迹。- O* }% Y# z2 O7 n

/ t; e) i6 \8 _, j+ m 几天前,只有三个人的 Instagram 工程师团队发布了一篇文章:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,披露了 Instagram 架构的一些信息,足够勾起大多数人的好奇心。读罢做点笔记,各种线索还是有一定参考价值的。能打开原文的建议直接读原文。
6 P. O9 ^, |4 v2 e3 H% h
1 o1 b0 ?+ E- m% }Instragram.png/ v$ g( y7 N# b, M0 R

* c4 L- c7 ~+ r Instagram 开发团队奉行的三个核心原则:! O. r6 j% H9 u9 r6 L8 r

; ^" g4 O& M0 O' ^    Keep it very simple (极简主义)& U0 Q7 C* ~4 w2 G  ~
     Don't re-invent the wheel (不重复发明轮子): x. Q' p4 F8 b! h# B
     Go with proven and solid technologies when you can(能用就用靠谱的技术)
- e6 r1 c* P: s- k  z2 @: N( b. U7 T
OS/主机: c& t: M; ^$ _  z2 V; c% l

4 Y  s# d& |) q 操作系统的选择,在Amazon EC2上跑 Ubuntu Linux 11.04 (Natty Narwhal) ,这个版本经过验证在 EC2 上够稳定。因为只有三名工程师,只有三名工程师,所以自己部署机器到 IDC 是不靠谱的事情。幸好有亚马逊。
8 A$ g, \* f) [3 |4 H# H6 I* |
8 i* h& h: k; F( T7 i 负载均衡! }; H( {, V+ v6 @# }9 e/ W6 e

+ P) e7 H9 s: N4 c' |; p& d$ N 此前曾用过两台 Nginx 做 DNS 轮询承载前端请求,这样做会有副作用,现在已经迁移到Amazon的ELB(Elastic Load Balancer),起了三个 Nginx 实例,在 ELB 层停掉了 SSL , 以缓解 CPU 压力。DNS 服务使用 Amazon Route53 服务。" m3 C- i( H' o- ^1 Z

7 P  ]$ M; H5 s; h% V7 W! a1 a, w 应用服务器% h- @3 K+ X8 w9 D
# ?1 W" A- I& A# I( z0 D7 n/ a5 o
启用了 25 个 Django 实例,运行在 High-CPU Extra-Large 类型的服务器实例上,之所以用 High-CPU Extra-Large 实例是因为应用请求是 CPU 密集型而非 IO 密集型。% i+ D  v2 Y) x
  x# T' [% k& F! R
使用 Gunicorn 作为 WSGI 服务器。过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源。使用 Fabric 加速部署。- L# b( ]" v9 t3 e3 U1 G$ r2 e4 D- x
- v0 p  {+ X& Z( F% D7 i9 I( J. V( D
数据存储8 ~! A; J) F2 }6 k$ e- J1 {% }

5 v' t0 A* C7 N 用户信息、图片元数据、标签等大部分数据存储在 PostgreSQL 中。主要的 Shard 数据库集群有 12个节点。
5 y9 I- X- i+ x: b, z/ f3 P
9 H2 M. |( R: @: B 实践中发现 Amazon 的网络磁盘系统单位时间内寻道能力不行,所以有必要将数据尽量放到内存中。创建了软 RAID 以提升 IO 能力,使用的 Mdadm 工具进行 RAID 管理。
* _2 I1 o4 V; w: o4 z
8 D) Y8 G8 Z8 j& B' T" G/ J# t( k 管理内存中的数据,vmtouch 这个小工具值得推荐。! o3 K# g, Q& F- N
  N2 H/ z& e4 F3 y$ A" P
PostgreSQL 设置为 Master-Replica 方式,流复制模式。利用 EBS 的快照进行数据库备份。使用 XFS 文件系统,以便和快照服务充分配合。 使用 repmgr 这个小工具做 PostgreSQL 复制管理器器。
- F# e' W1 o  N* A0 I7 C! G: v( c2 E; ?  q
连接池管理,用了 Pgbouncer。Christophe Pettus 的文章包含了不少 PostgreSQL 数据库的信息。
0 B' x6 {) P. ^  V/ D5 L" n9 f) N7 Y5 Z& I) u' r9 t
TB 级别的海量图片存储在 Amazon S3 上,CDN 采用的也是 Amazon 的服务,CloudFront。* f: q7 [3 e  V7 L

5 W+ X) n0 e" U' F) Y9 KInstagram 也是 Redis 的重度用户,Feed 以及 Session 信息都用 Redis 处理,Redis 也是以 Master-Replica 方式部署。在 Replica 节点上进行数据备份。
9 ^0 Z# V0 O" r. S, s" i% P% a) D+ B" g) M+ h# z( H, d- b* P
使用了 Apache Solr 承担 Geo-search API 的工作,Solr 简单的 JSON 接口也不错。
' v0 z! b' e! u8 c% e* b- S8 z0 `8 R5 Z6 x1 p; q" z/ y
缓存使用了 6 个 Memcached 实例,库使用 pylibmc 和 libmemcached。亚马逊也提供缓存服务-Elastic Cache service ,Instagram 也有尝试,不过不便宜。3 R5 X! {4 i* ]  ^1 b, P4 ~' @

+ z' Z# K, g7 f7 d9 Z 任务队列/发布通知
3 S. a; u7 {/ _
) Z5 B8 r9 D, a$ e+ H) B 队列服务使用 Gearman ,通知系统则使用 pyapns 来实现。( f  K0 Z, F1 Y7 A6 Z' ~

) h# I1 M6 n: k4 T: X+ ?6 H. q 监控
% @0 V. m( p1 q/ p4 I
3 Z9 g0 f1 k( M! c. _& j9 I 前面提及的服务器实例数量加起来,的确有100多个,有效的监控是相当有必要的。使用 Munin 作为主要监控工具 , 也写了不少定制插件,外部监控用 Pingdom 的服务。通知服务使用PagerDuty。; Q$ i1 u7 E  x$ Z0 s' W

$ s3 G1 \% r5 _5 q# l3 y1 \ 对于 Python 的错误报告,使用 Disqus 团队开源的 Sentry 来处理。
9 R5 e  P6 p! J2 q5 q5 C$ @4 \+ N; g2 H) G) l
几个感想
* ^9 f( B2 _: D8 r% @) V
# u7 @/ b2 e* F  Y0)轻装上阵说起来容易,做起来非常难。这也是 Instagram 团队目前最令人着迷的地方;
8 `: x! K7 k, E8 @1 J/ s8 D" _2 A/ ?  ]+ T
1)Python 社区已经足够成熟,各个环节上都已经有不错的解决方案了。
& {# J, ?: i# f/ P3 Q$ z. m2 b) |$ l" q2 U
2)如果要问我最大的一个感慨,我要说:Amazon 真是一家伟大的公司,甚至比 Google 还伟大
5 t" {5 W3 o9 Z6 q0 y

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

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

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

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

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