马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
这是一篇旧文,值得一读, 就转来了:7 B% X7 z9 i# _$ U# X; X+ D9 ~! [
( G) z) }/ P0 O, i+ m8 ?0 |) z2012 年4月10日凌晨消息,Instagram 被 Facebook 以10亿美金收购。团队规模:13 人。( h/ Y4 Y* F" e4 t+ v
1 w2 _& U" [/ R/ }( c1 ?Instagram 团队上个月才迎来第 7 名员工,是的,7个人的团队。作为 iPhone 上最火爆的图片类工具,instagram 用户数量已经超过 1400 万,图片数量超过 1.5 亿张。不得不说,这真他妈是个业界奇迹。1 }$ Y" {$ \' K7 y8 @: G+ Z( v
2 f4 p* u4 M, L2 i 几天前,只有三个人的 Instagram 工程师团队发布了一篇文章:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,披露了 Instagram 架构的一些信息,足够勾起大多数人的好奇心。读罢做点笔记,各种线索还是有一定参考价值的。能打开原文的建议直接读原文。
2 ]- {- S: \# P% d$ c1 ], s
$ d& O5 ]8 ~& k9 jInstragram.png3 S7 c! S" x4 M: B- {2 W
) X# }$ p8 Y. ~% y- a8 u Instagram 开发团队奉行的三个核心原则:
5 D- h3 L2 ?/ q7 \7 f
% u [$ m& S9 l' L9 ` Keep it very simple (极简主义)
! ^7 M# i6 r1 y, b8 c9 |; y Don't re-invent the wheel (不重复发明轮子)
9 m: a7 ~2 u N" P9 d& @2 B Go with proven and solid technologies when you can(能用就用靠谱的技术)
, S! u8 U) R/ V! l% B! Q l4 H. X4 q+ F! c) L9 |% [. Z( U
OS/主机
0 D+ Y0 |7 B5 `( a! K; C/ H
# \: {# I: A& d( a3 r: y. ^ 操作系统的选择,在Amazon EC2上跑 Ubuntu Linux 11.04 (Natty Narwhal) ,这个版本经过验证在 EC2 上够稳定。因为只有三名工程师,只有三名工程师,所以自己部署机器到 IDC 是不靠谱的事情。幸好有亚马逊。
; K' U( U1 |# r/ l, p' Z0 {2 h/ u. K& _$ P# M
负载均衡
3 s8 ?# g: A& |- }3 _6 m) z# [' |
此前曾用过两台 Nginx 做 DNS 轮询承载前端请求,这样做会有副作用,现在已经迁移到Amazon的ELB(Elastic Load Balancer),起了三个 Nginx 实例,在 ELB 层停掉了 SSL , 以缓解 CPU 压力。DNS 服务使用 Amazon Route53 服务。3 u1 [ m( J* W9 h! N, ]
1 n" K4 d1 j* \# c6 F! D( R& _* G
应用服务器0 K# d( A+ J% i6 l: n, O( C
6 J( w! Y3 N. E$ P0 T& ]
启用了 25 个 Django 实例,运行在 High-CPU Extra-Large 类型的服务器实例上,之所以用 High-CPU Extra-Large 实例是因为应用请求是 CPU 密集型而非 IO 密集型。 u- H0 Y1 S& o/ R
$ `+ ?8 R4 d* z' G$ U% U
使用 Gunicorn 作为 WSGI 服务器。过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源。使用 Fabric 加速部署。$ m' i) F8 s6 }5 b
5 ?: P+ u; @/ E* E `4 [& h/ \
数据存储
' U. Y+ O3 m, L7 j$ |3 f8 @( D
3 h5 \" s# {( C+ ` 用户信息、图片元数据、标签等大部分数据存储在 PostgreSQL 中。主要的 Shard 数据库集群有 12个节点。( X6 v% {3 N9 a% ~9 n
9 E$ `" i& {2 ?& @- F; k0 u 实践中发现 Amazon 的网络磁盘系统单位时间内寻道能力不行,所以有必要将数据尽量放到内存中。创建了软 RAID 以提升 IO 能力,使用的 Mdadm 工具进行 RAID 管理。 ?" J) k( Q- D8 L1 q# U
8 L3 v! Y- [! F1 e$ I 管理内存中的数据,vmtouch 这个小工具值得推荐。
9 P8 Z9 x$ H4 _4 b- V; {# y U3 a: V( u8 U2 T T5 A! V
PostgreSQL 设置为 Master-Replica 方式,流复制模式。利用 EBS 的快照进行数据库备份。使用 XFS 文件系统,以便和快照服务充分配合。 使用 repmgr 这个小工具做 PostgreSQL 复制管理器器。. S& p2 R& q$ j8 _, ^+ U5 U
: S7 p, g! G6 j/ ^ 连接池管理,用了 Pgbouncer。Christophe Pettus 的文章包含了不少 PostgreSQL 数据库的信息。7 z4 x$ `, g8 O3 d& \
6 \! R4 S1 l- a2 [6 _! QTB 级别的海量图片存储在 Amazon S3 上,CDN 采用的也是 Amazon 的服务,CloudFront。
+ G, u; x4 Y. j- I6 O# ^7 W7 u+ [. z1 y& f$ [8 G5 d* T4 i0 r6 T
Instagram 也是 Redis 的重度用户,Feed 以及 Session 信息都用 Redis 处理,Redis 也是以 Master-Replica 方式部署。在 Replica 节点上进行数据备份。5 w+ V) p2 F+ d" T, j
. B( Y9 M* s" j2 n% o 使用了 Apache Solr 承担 Geo-search API 的工作,Solr 简单的 JSON 接口也不错。- S1 A, W, ^* o/ `6 o7 U: ~
5 J L5 `* k: ^5 Z# e9 y% N' j6 @
缓存使用了 6 个 Memcached 实例,库使用 pylibmc 和 libmemcached。亚马逊也提供缓存服务-Elastic Cache service ,Instagram 也有尝试,不过不便宜。
" U$ c) Y* J% S: i# L) O: `$ m+ i% k, o) _/ f( d6 m
任务队列/发布通知
( P" U9 R1 L& W" h0 f+ P* K, ?& w; @
队列服务使用 Gearman ,通知系统则使用 pyapns 来实现。
2 D, E+ D& ?* Z! ~4 z9 s) P" o
& U2 O! T* n* i. i2 r" ] 监控
' w6 c# y" m1 w4 n: W+ e; f: S/ J3 j; b2 |9 a
前面提及的服务器实例数量加起来,的确有100多个,有效的监控是相当有必要的。使用 Munin 作为主要监控工具 , 也写了不少定制插件,外部监控用 Pingdom 的服务。通知服务使用PagerDuty。% Z* t7 X8 n( I" U
% C% `' T1 k, |2 l% h
对于 Python 的错误报告,使用 Disqus 团队开源的 Sentry 来处理。
* U, Y1 V; H+ s; q
& g- @ H( l& H 几个感想
, P+ ~6 q2 R. R, {% I+ T5 I# ^; p
+ Q! y. D, X9 r% L5 w4 F2 y8 e- `. O0)轻装上阵说起来容易,做起来非常难。这也是 Instagram 团队目前最令人着迷的地方;1 g( J% P9 _' u: v' q
, k- w- ^% C3 W6 Q8 m1)Python 社区已经足够成熟,各个环节上都已经有不错的解决方案了。
! s) d6 m/ a8 A7 q6 C' t! ]5 Q! j, z( P5 F
2)如果要问我最大的一个感慨,我要说:Amazon 真是一家伟大的公司,甚至比 Google 还伟大
" W/ v% k' D, V- {# F4 O% P
转载请保留当前帖子的链接:https://www.beimeilife.com/thread-2324-1-1.html 谢谢 |