开启左侧

[转]Instagram 架构分析笔记

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

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

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

x
这是一篇旧文,值得一读, 就转来了:3 K- K' I2 G$ H9 o

$ W; p( m5 q( w8 i% E, F' z4 A2012 年4月10日凌晨消息,Instagram 被 Facebook 以10亿美金收购。团队规模:13 人。
( F/ J/ p6 a( k' u' Q# s, e* k- P5 k5 u+ }
Instagram 团队上个月才迎来第 7 名员工,是的,7个人的团队。作为 iPhone 上最火爆的图片类工具,instagram 用户数量已经超过 1400 万,图片数量超过 1.5 亿张。不得不说,这真他妈是个业界奇迹。
4 o# t$ E# v$ O# S. [6 J# C9 a4 t* F
* ]6 j) T5 ]' l7 |* C8 O( U1 u7 v# X 几天前,只有三个人的 Instagram 工程师团队发布了一篇文章:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,披露了 Instagram 架构的一些信息,足够勾起大多数人的好奇心。读罢做点笔记,各种线索还是有一定参考价值的。能打开原文的建议直接读原文。' @& B' S: @# D0 E
( c1 l. b& d3 U7 c  p: a
Instragram.png+ {& y4 j: T* b

5 ~/ K/ i* n3 L' } Instagram 开发团队奉行的三个核心原则:- _5 B  ?# r$ x2 q

6 G, u+ d6 n, w7 V5 u; C% g    Keep it very simple (极简主义)( U, w  U( Q4 W1 y- d/ i
     Don't re-invent the wheel (不重复发明轮子)2 n( w3 r3 f( D# x7 S
     Go with proven and solid technologies when you can(能用就用靠谱的技术)4 g6 b  n2 ]4 i& p. X, q4 {

9 y; u! U% a6 i8 i4 \% y( _1 sOS/主机! F1 K' n: a' s* g7 V" N9 }

( O0 T, o' v8 d0 T/ p 操作系统的选择,在Amazon EC2上跑 Ubuntu Linux 11.04 (Natty Narwhal) ,这个版本经过验证在 EC2 上够稳定。因为只有三名工程师,只有三名工程师,所以自己部署机器到 IDC 是不靠谱的事情。幸好有亚马逊。
# k: @& E- ~, D9 W  d8 M
1 k7 Y) h) f7 K, M+ P5 c; ]* N 负载均衡# j, x: l0 G) X! K
0 f. W* r! U/ r
此前曾用过两台 Nginx 做 DNS 轮询承载前端请求,这样做会有副作用,现在已经迁移到Amazon的ELB(Elastic Load Balancer),起了三个 Nginx 实例,在 ELB 层停掉了 SSL , 以缓解 CPU 压力。DNS 服务使用 Amazon Route53 服务。
+ `. K5 j. u3 C- ?/ f% H
9 r  }: s, a' e+ o3 X 应用服务器3 ^* f. {" `+ d( r: C6 k. o3 a
3 r9 Q: g4 ]" u( f! y
启用了 25 个 Django 实例,运行在 High-CPU Extra-Large 类型的服务器实例上,之所以用 High-CPU Extra-Large 实例是因为应用请求是 CPU 密集型而非 IO 密集型。
( N& V/ J! U- f* p, ~3 \& {4 [  z% `: Y5 o2 Z
使用 Gunicorn 作为 WSGI 服务器。过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源。使用 Fabric 加速部署。- s$ U* }0 j2 V  q- H

6 ?5 u) i& ?3 P% y) E. t4 f0 | 数据存储  S$ D; `! c* J0 w! |
+ F; b4 l5 t4 g) y$ T
用户信息、图片元数据、标签等大部分数据存储在 PostgreSQL 中。主要的 Shard 数据库集群有 12个节点。
9 m- Q- g1 T6 Z5 [5 B+ S9 g$ C  _# g5 Y- U$ B
实践中发现 Amazon 的网络磁盘系统单位时间内寻道能力不行,所以有必要将数据尽量放到内存中。创建了软 RAID 以提升 IO 能力,使用的 Mdadm 工具进行 RAID 管理。
6 @5 [6 m7 n1 v" V7 O3 d1 Q
. }7 J+ x" O; j$ r 管理内存中的数据,vmtouch 这个小工具值得推荐。7 }2 H- Q. m6 X! K
5 N- p+ y) H, W
PostgreSQL 设置为 Master-Replica 方式,流复制模式。利用 EBS 的快照进行数据库备份。使用 XFS 文件系统,以便和快照服务充分配合。 使用 repmgr 这个小工具做 PostgreSQL 复制管理器器。+ J) I' O- `/ C: I4 K
2 r8 X6 d0 n5 e* A* e) O: f6 Q
连接池管理,用了 Pgbouncer。Christophe Pettus 的文章包含了不少 PostgreSQL 数据库的信息。
, Y" A8 y2 I4 S9 w4 f2 [6 N; T2 K) u" @) H5 J5 B+ U6 h% _. c
TB 级别的海量图片存储在 Amazon S3 上,CDN 采用的也是 Amazon 的服务,CloudFront。
& n; `. B8 }% M  S9 O+ d0 i/ Y8 N  P: ~( Z/ M& c" w6 b
Instagram 也是 Redis 的重度用户,Feed 以及 Session 信息都用 Redis 处理,Redis 也是以 Master-Replica 方式部署。在 Replica 节点上进行数据备份。
' p" s( @, @* _0 q8 H6 J3 l5 A( r$ e% l+ o: [
使用了 Apache Solr 承担 Geo-search API 的工作,Solr 简单的 JSON 接口也不错。! W* G; e9 P/ U. N. W& G
+ P( D/ H7 ]! w4 x
缓存使用了 6 个 Memcached 实例,库使用 pylibmc 和 libmemcached。亚马逊也提供缓存服务-Elastic Cache service ,Instagram 也有尝试,不过不便宜。4 s( G6 A9 C8 O# E

- a5 R8 J4 i/ D) f. x 任务队列/发布通知
3 P  Q6 p5 i7 ?2 N
; r: P( f) N+ K; H* Y# l% s 队列服务使用 Gearman ,通知系统则使用 pyapns 来实现。
) ~: L! ?; p% Z4 m$ n; V0 I, _3 s1 G1 O7 j2 O! y% F- z+ R! ]5 M) t
监控% a8 i# X: v1 l5 i& g* w8 q: |" V
7 Q* H4 I" q4 p$ Z  a- S& l
前面提及的服务器实例数量加起来,的确有100多个,有效的监控是相当有必要的。使用 Munin 作为主要监控工具 , 也写了不少定制插件,外部监控用 Pingdom 的服务。通知服务使用PagerDuty。. Y0 W  e/ e4 K) u9 `8 x4 g
5 |, I7 V) _! s+ Y
对于 Python 的错误报告,使用 Disqus 团队开源的 Sentry 来处理。
$ ^! r+ Z5 v  F8 p. Y' v+ Q% C% p- h
几个感想
! n6 h6 ~5 V9 m* e1 y
9 y! m6 e' X+ u: Q: e. P- A! f6 t' Q0)轻装上阵说起来容易,做起来非常难。这也是 Instagram 团队目前最令人着迷的地方;; D3 i. C& S4 a' I5 l

$ E6 E  S3 }& p! ]8 w+ |' b1)Python 社区已经足够成熟,各个环节上都已经有不错的解决方案了。6 f, l0 J/ T) h) ?6 e
4 t$ A$ E& B  r3 _, A
2)如果要问我最大的一个感慨,我要说:Amazon 真是一家伟大的公司,甚至比 Google 还伟大# J: F7 I- l) @9 f% M& ?+ p9 y: O


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

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

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

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

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