马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
这是一篇旧文,值得一读, 就转来了:
' \5 Q( D' L* I5 m* h( ^: u; W# t) u; @$ b, I( }8 c+ Z$ q8 r3 @: t
2012 年4月10日凌晨消息,Instagram 被 Facebook 以10亿美金收购。团队规模:13 人。
( L: Z5 l9 h* Z3 l% g2 k% I, l- R; r% ^9 y0 O" |
Instagram 团队上个月才迎来第 7 名员工,是的,7个人的团队。作为 iPhone 上最火爆的图片类工具,instagram 用户数量已经超过 1400 万,图片数量超过 1.5 亿张。不得不说,这真他妈是个业界奇迹。$ l( g5 c9 U0 N$ r
1 o9 L- M1 w7 E' X
几天前,只有三个人的 Instagram 工程师团队发布了一篇文章:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,披露了 Instagram 架构的一些信息,足够勾起大多数人的好奇心。读罢做点笔记,各种线索还是有一定参考价值的。能打开原文的建议直接读原文。( m; _) d( `: ]; h G, [2 D
, P: {, g; z# \* M8 |1 E/ a
Instragram.png
( y. u% y9 T1 K, L6 K, Q7 I2 X# [; Z
Instagram 开发团队奉行的三个核心原则:% n7 [* J! }7 b1 F8 c0 l
+ @, o9 n! d9 q6 N
Keep it very simple (极简主义)
4 Q) z3 ]1 x5 }" |3 j) [3 n7 T Don't re-invent the wheel (不重复发明轮子)
2 b$ u% ?* R% @! C Go with proven and solid technologies when you can(能用就用靠谱的技术)
: Q- Q2 t! v; B, L5 f
' f( W: d; r" B$ ]2 R9 X dOS/主机( j/ [8 P6 \7 D: S+ y( Q8 N
: ]6 @1 L' `9 z3 C9 J" \9 \
操作系统的选择,在Amazon EC2上跑 Ubuntu Linux 11.04 (Natty Narwhal) ,这个版本经过验证在 EC2 上够稳定。因为只有三名工程师,只有三名工程师,所以自己部署机器到 IDC 是不靠谱的事情。幸好有亚马逊。
( B/ X! @- t G+ N$ s# q! ]
, o& s J4 O% `; v3 e7 h p" c 负载均衡
5 t/ r6 G; S* D7 l) r3 F/ g2 m# b
此前曾用过两台 Nginx 做 DNS 轮询承载前端请求,这样做会有副作用,现在已经迁移到Amazon的ELB(Elastic Load Balancer),起了三个 Nginx 实例,在 ELB 层停掉了 SSL , 以缓解 CPU 压力。DNS 服务使用 Amazon Route53 服务。3 }8 l' v! Q) B, f0 e7 E: [
5 W4 M: B7 q" n R( Z 应用服务器+ X/ s3 V. W4 B3 q3 r1 }
: L( G4 P8 B( G2 z# p( d* j 启用了 25 个 Django 实例,运行在 High-CPU Extra-Large 类型的服务器实例上,之所以用 High-CPU Extra-Large 实例是因为应用请求是 CPU 密集型而非 IO 密集型。
) ^# ~) `3 q Y# N
, K4 j: g$ C: `% s; }. D1 ` 使用 Gunicorn 作为 WSGI 服务器。过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源。使用 Fabric 加速部署。
6 @, m o1 h& l) b+ P
( j. _. H2 M, }9 `, M 数据存储
( m+ F5 O# G, m
" p" n+ S }( p) H- i 用户信息、图片元数据、标签等大部分数据存储在 PostgreSQL 中。主要的 Shard 数据库集群有 12个节点。- U& Z0 s4 v2 T P: P! S5 o- Y' L
6 O8 l# k5 N5 d2 W* c& w" B8 m 实践中发现 Amazon 的网络磁盘系统单位时间内寻道能力不行,所以有必要将数据尽量放到内存中。创建了软 RAID 以提升 IO 能力,使用的 Mdadm 工具进行 RAID 管理。9 |/ _: } ]: v; ?
- f0 ?8 w# L' f/ _0 x; }- h 管理内存中的数据,vmtouch 这个小工具值得推荐。2 V u& h. a! {# p& |
! i& D& v0 _3 J' p) @1 W; L# a& }PostgreSQL 设置为 Master-Replica 方式,流复制模式。利用 EBS 的快照进行数据库备份。使用 XFS 文件系统,以便和快照服务充分配合。 使用 repmgr 这个小工具做 PostgreSQL 复制管理器器。
& {) {* |( y1 a ^8 B; Z0 G7 N% O: L+ D. |- Z1 Q
连接池管理,用了 Pgbouncer。Christophe Pettus 的文章包含了不少 PostgreSQL 数据库的信息。
/ G/ b% W! P& k- F3 M @
3 E( S/ l! Y2 }TB 级别的海量图片存储在 Amazon S3 上,CDN 采用的也是 Amazon 的服务,CloudFront。
. y8 a' c2 K( k9 ~
- b) [1 y+ B2 k k1 w- Q2 YInstagram 也是 Redis 的重度用户,Feed 以及 Session 信息都用 Redis 处理,Redis 也是以 Master-Replica 方式部署。在 Replica 节点上进行数据备份。/ s L: F: O+ M( y, M \
7 p& J8 @1 z. g9 |; V 使用了 Apache Solr 承担 Geo-search API 的工作,Solr 简单的 JSON 接口也不错。
: Q: L9 o' ~6 |$ W6 g4 J5 G2 y$ R( A( D( l r
缓存使用了 6 个 Memcached 实例,库使用 pylibmc 和 libmemcached。亚马逊也提供缓存服务-Elastic Cache service ,Instagram 也有尝试,不过不便宜。. |- s* x6 i7 q9 x
, }1 Z! m5 L3 \& m |2 V
任务队列/发布通知
j8 E# a! S; p2 Z+ h$ }% Y2 k5 w% O+ E
队列服务使用 Gearman ,通知系统则使用 pyapns 来实现。 D- I7 X8 l. d1 @" @
; b0 x s, M; Z$ v2 B6 A. Z3 b
监控6 B3 y: v$ B( m1 G7 t, ~
( D; Y! R/ M0 O# Q
前面提及的服务器实例数量加起来,的确有100多个,有效的监控是相当有必要的。使用 Munin 作为主要监控工具 , 也写了不少定制插件,外部监控用 Pingdom 的服务。通知服务使用PagerDuty。+ n* J9 N4 ~4 Z# h
5 k5 G/ B: \7 B; p! l
对于 Python 的错误报告,使用 Disqus 团队开源的 Sentry 来处理。0 E( E! R3 M4 w0 J7 E: q
# k# O' n* U/ g x, }! E$ A
几个感想 I1 _0 [: c+ d3 \7 I% a9 i! n
1 U8 Q, p( B) c/ o' g
0)轻装上阵说起来容易,做起来非常难。这也是 Instagram 团队目前最令人着迷的地方;
+ }6 l" J, ]9 a4 P* w. N5 L2 G" F, O
1)Python 社区已经足够成熟,各个环节上都已经有不错的解决方案了。' A3 W' q2 ?% z
a- T' I; Z& u. b4 `
2)如果要问我最大的一个感慨,我要说:Amazon 真是一家伟大的公司,甚至比 Google 还伟大9 b! P( b5 b, T: _! F
转载请保留当前帖子的链接:https://www.beimeilife.com/thread-2324-1-1.html 谢谢 |