马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
这是一篇旧文,值得一读, 就转来了:/ k0 W8 k( {4 O3 K% N- C7 n4 P
. J. V4 V0 R( K4 Z6 Z! \
2012 年4月10日凌晨消息,Instagram 被 Facebook 以10亿美金收购。团队规模:13 人。
- z0 a, W9 l" \. W, K% q6 O/ h$ m( Y# b" V' e4 w f
Instagram 团队上个月才迎来第 7 名员工,是的,7个人的团队。作为 iPhone 上最火爆的图片类工具,instagram 用户数量已经超过 1400 万,图片数量超过 1.5 亿张。不得不说,这真他妈是个业界奇迹。# y4 `9 M6 |7 l- Q: p* E& C
. B# C7 {$ P5 z0 J0 u6 [4 C* B, ? 几天前,只有三个人的 Instagram 工程师团队发布了一篇文章:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,披露了 Instagram 架构的一些信息,足够勾起大多数人的好奇心。读罢做点笔记,各种线索还是有一定参考价值的。能打开原文的建议直接读原文。
* w4 a6 | S" U. k" ~
- P# H: O/ ]3 ~Instragram.png
8 Z) d: F& D$ m" G9 t; D) ?& y! H2 Q' [# |1 Q+ l+ g; ]
Instagram 开发团队奉行的三个核心原则:; k! V, d( q; e9 T
/ ^% {9 d) p9 H6 d0 |; H
Keep it very simple (极简主义)
3 W- v) {* ~- p. y# x Don't re-invent the wheel (不重复发明轮子)
8 ^' F! W# p9 O+ `; {7 r0 E; z Go with proven and solid technologies when you can(能用就用靠谱的技术)3 J; m6 X0 l0 G# ?, U" w0 K7 N0 O3 d
/ }3 ]4 Q N: n; u( p* O
OS/主机% v. Z% q; }, s6 G1 t
/ M% v8 H4 F" x4 O" S6 S( m 操作系统的选择,在Amazon EC2上跑 Ubuntu Linux 11.04 (Natty Narwhal) ,这个版本经过验证在 EC2 上够稳定。因为只有三名工程师,只有三名工程师,所以自己部署机器到 IDC 是不靠谱的事情。幸好有亚马逊。) S( l- G, Y# ~% `
) P* q% d, I2 Q6 q, t, } 负载均衡
( N) u9 R5 k! R9 v! }/ N" C+ v& }/ [" L
此前曾用过两台 Nginx 做 DNS 轮询承载前端请求,这样做会有副作用,现在已经迁移到Amazon的ELB(Elastic Load Balancer),起了三个 Nginx 实例,在 ELB 层停掉了 SSL , 以缓解 CPU 压力。DNS 服务使用 Amazon Route53 服务。+ ~. h1 w$ {4 m
/ N' t5 a7 Y1 b" d5 K0 W% g
应用服务器
& j1 \7 m8 z& |/ k+ V7 @ D8 O6 j; h. G( x0 W0 u
启用了 25 个 Django 实例,运行在 High-CPU Extra-Large 类型的服务器实例上,之所以用 High-CPU Extra-Large 实例是因为应用请求是 CPU 密集型而非 IO 密集型。
% m$ D2 V1 O% h. C" @: A9 o
- C: {9 C5 Q1 g7 R# E9 k1 V 使用 Gunicorn 作为 WSGI 服务器。过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源。使用 Fabric 加速部署。
( D5 u! W9 O) P' P
% z" k) W# w0 ?2 x" k9 o4 _' b 数据存储
z. N/ I% ?5 _4 i! Z
. B, F% z5 N {' i/ c0 r& W$ U 用户信息、图片元数据、标签等大部分数据存储在 PostgreSQL 中。主要的 Shard 数据库集群有 12个节点。
1 o- n$ {! P( T# z. f% s& ~1 Q! v" q4 l& R7 Q6 Q
实践中发现 Amazon 的网络磁盘系统单位时间内寻道能力不行,所以有必要将数据尽量放到内存中。创建了软 RAID 以提升 IO 能力,使用的 Mdadm 工具进行 RAID 管理。8 k' W3 i% e! X9 z8 ~
% i4 g8 k" e3 e
管理内存中的数据,vmtouch 这个小工具值得推荐。; E) G! O2 ?( l* p' L
3 ~9 t/ C& E. A0 U z+ tPostgreSQL 设置为 Master-Replica 方式,流复制模式。利用 EBS 的快照进行数据库备份。使用 XFS 文件系统,以便和快照服务充分配合。 使用 repmgr 这个小工具做 PostgreSQL 复制管理器器。
. a* d6 ~+ W9 J2 B) M' N: k: z6 t1 m! x# H% o2 C
连接池管理,用了 Pgbouncer。Christophe Pettus 的文章包含了不少 PostgreSQL 数据库的信息。$ u2 x* k5 j) y. ^
: Z; h% b4 q: t8 Q, R
TB 级别的海量图片存储在 Amazon S3 上,CDN 采用的也是 Amazon 的服务,CloudFront。 [/ E0 D6 U4 _: D4 I3 s5 V
Y; E# s# P# f; E0 U8 v
Instagram 也是 Redis 的重度用户,Feed 以及 Session 信息都用 Redis 处理,Redis 也是以 Master-Replica 方式部署。在 Replica 节点上进行数据备份。
: n6 _; W ~, ]& i J" x# V/ Y$ z8 L1 Y4 g: }7 ^& f! j% I
使用了 Apache Solr 承担 Geo-search API 的工作,Solr 简单的 JSON 接口也不错。
9 j0 M% r# k2 g8 K( x7 e8 C6 B/ {6 t$ p: I$ X
缓存使用了 6 个 Memcached 实例,库使用 pylibmc 和 libmemcached。亚马逊也提供缓存服务-Elastic Cache service ,Instagram 也有尝试,不过不便宜。2 h3 M2 u. W* C5 u& l4 H' R9 u
# ]2 @- V ]) @% n% a
任务队列/发布通知
7 s8 Y$ y+ y2 @! [- e
& G6 m! t _- [ 队列服务使用 Gearman ,通知系统则使用 pyapns 来实现。% n$ G/ n' A U; M1 o( |
. n5 T' K; Z. [5 _2 ~ 监控8 Z5 V+ E, |, m* ?
( r" |8 ~9 W! }& ^, G! M* o
前面提及的服务器实例数量加起来,的确有100多个,有效的监控是相当有必要的。使用 Munin 作为主要监控工具 , 也写了不少定制插件,外部监控用 Pingdom 的服务。通知服务使用PagerDuty。2 J/ i/ T+ `1 y
- p5 l# Q; L5 s- }0 s 对于 Python 的错误报告,使用 Disqus 团队开源的 Sentry 来处理。
! G+ H+ Y8 _! M o n, }7 x" E- N
3 v. x; H+ F! p; A% z7 ?* T 几个感想8 c1 r% [# F L- p! z
- n4 w! g: g+ `! @" q, W
0)轻装上阵说起来容易,做起来非常难。这也是 Instagram 团队目前最令人着迷的地方;
/ c# i3 J7 E' _3 ?9 R0 |) N2 d% z% ?. Z/ N! m
1)Python 社区已经足够成熟,各个环节上都已经有不错的解决方案了。
# K3 }; [: \$ p/ `% v& e8 c0 ^2 R/ M F) l9 |, W
2)如果要问我最大的一个感慨,我要说:Amazon 真是一家伟大的公司,甚至比 Google 还伟大
. k! D" V* k0 X3 g, J! R( y
转载请保留当前帖子的链接:https://www.beimeilife.com/thread-2324-1-1.html 谢谢 |