马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
这是一篇旧文,值得一读, 就转来了:4 m! K" @3 t6 X3 F
7 D f5 q; Z' P1 w2012 年4月10日凌晨消息,Instagram 被 Facebook 以10亿美金收购。团队规模:13 人。2 r) ?0 B8 n" K( c `
" E5 Q# g5 }4 d9 f% a- o
Instagram 团队上个月才迎来第 7 名员工,是的,7个人的团队。作为 iPhone 上最火爆的图片类工具,instagram 用户数量已经超过 1400 万,图片数量超过 1.5 亿张。不得不说,这真他妈是个业界奇迹。
+ D* t4 [" H U' ?3 F# k' K/ c2 u& W' r% o4 H9 r, ?8 v1 @8 ^7 o
几天前,只有三个人的 Instagram 工程师团队发布了一篇文章:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,披露了 Instagram 架构的一些信息,足够勾起大多数人的好奇心。读罢做点笔记,各种线索还是有一定参考价值的。能打开原文的建议直接读原文。
: S9 d) P* x u
. L! {7 j4 u% I2 `& rInstragram.png$ y* Y( Z8 M, l, b+ e& ~ K
/ C, \( i$ A6 {5 [. h( u* K$ _$ P" a Instagram 开发团队奉行的三个核心原则:
! }+ W6 H7 i3 l* y
0 G/ R' {5 ?( E+ E r Keep it very simple (极简主义)
- a- F& p: c* ~2 m, G/ ?4 M Don't re-invent the wheel (不重复发明轮子)) ^0 H# A ` G0 |; k( s$ r9 G. ]
Go with proven and solid technologies when you can(能用就用靠谱的技术)
" D* Y! w5 Y4 M ~: e" |$ F$ p" z! f& H
OS/主机
: O7 n' `3 _5 [% k4 ] L% T$ O& v( N U# @6 B {- l/ C6 t7 Q( U4 m8 f n5 b
操作系统的选择,在Amazon EC2上跑 Ubuntu Linux 11.04 (Natty Narwhal) ,这个版本经过验证在 EC2 上够稳定。因为只有三名工程师,只有三名工程师,所以自己部署机器到 IDC 是不靠谱的事情。幸好有亚马逊。
/ ~/ K; d+ d* Q* g# S0 ], x4 t& O; y6 [
负载均衡
/ M, u$ g2 ?. h7 L; i, m1 z. d, n$ U( L k- w. N: O$ e3 N1 J( G/ L$ P
此前曾用过两台 Nginx 做 DNS 轮询承载前端请求,这样做会有副作用,现在已经迁移到Amazon的ELB(Elastic Load Balancer),起了三个 Nginx 实例,在 ELB 层停掉了 SSL , 以缓解 CPU 压力。DNS 服务使用 Amazon Route53 服务。
, d0 ^' J: |* S3 A* U( ]0 M& P. E3 `
! O+ l4 @+ T& w7 Y \) }. M( g3 Q 应用服务器
a6 r* X3 b/ x: }( l! R
8 l- H' |3 ]- x* F& h7 C/ e 启用了 25 个 Django 实例,运行在 High-CPU Extra-Large 类型的服务器实例上,之所以用 High-CPU Extra-Large 实例是因为应用请求是 CPU 密集型而非 IO 密集型。
& G, R$ b# w3 W
0 L( z8 }" B& Y$ ^7 C' {% q 使用 Gunicorn 作为 WSGI 服务器。过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源。使用 Fabric 加速部署。3 c1 H7 j5 {7 m9 P5 L8 h
5 U: f8 ^3 C! Y
数据存储$ K8 W3 k$ L- N* n5 H
) f# e2 n; o( q6 g. C# g 用户信息、图片元数据、标签等大部分数据存储在 PostgreSQL 中。主要的 Shard 数据库集群有 12个节点。4 ^3 i/ q- x! \7 w5 m7 y. p1 d
: w4 X$ J1 u# z! K
实践中发现 Amazon 的网络磁盘系统单位时间内寻道能力不行,所以有必要将数据尽量放到内存中。创建了软 RAID 以提升 IO 能力,使用的 Mdadm 工具进行 RAID 管理。
& R3 F' {2 [9 [: D, e; u; L _6 T" Z% \+ k! m$ ~: y
管理内存中的数据,vmtouch 这个小工具值得推荐。
: q6 z" O2 w6 }) m9 `. n- E" w+ P! }; Y( W
PostgreSQL 设置为 Master-Replica 方式,流复制模式。利用 EBS 的快照进行数据库备份。使用 XFS 文件系统,以便和快照服务充分配合。 使用 repmgr 这个小工具做 PostgreSQL 复制管理器器。
5 j$ x1 d, p' a5 {8 W$ m4 t ]8 d: O0 F; X$ W
连接池管理,用了 Pgbouncer。Christophe Pettus 的文章包含了不少 PostgreSQL 数据库的信息。
0 W* g2 U3 h9 ^% r' Z8 O7 l; r1 C+ y0 ~
TB 级别的海量图片存储在 Amazon S3 上,CDN 采用的也是 Amazon 的服务,CloudFront。* P% o( X F, ~0 F8 x9 X
! x5 q9 P t9 R! f7 V: q, W
Instagram 也是 Redis 的重度用户,Feed 以及 Session 信息都用 Redis 处理,Redis 也是以 Master-Replica 方式部署。在 Replica 节点上进行数据备份。
4 L( H; B3 M; I9 F% a. G
7 [9 ~6 M8 i* B! W/ ]6 u 使用了 Apache Solr 承担 Geo-search API 的工作,Solr 简单的 JSON 接口也不错。
" E. V* ?6 B' C# R- N. {* }8 j b' T/ l8 b* }
缓存使用了 6 个 Memcached 实例,库使用 pylibmc 和 libmemcached。亚马逊也提供缓存服务-Elastic Cache service ,Instagram 也有尝试,不过不便宜。 O" r! X2 v& A9 q
% z+ S) K- L: C4 V. ~/ s) t 任务队列/发布通知
& M$ l1 y- v \: s6 G5 s& t: b' P( E G
. _9 e3 P4 q+ T8 J0 I6 h6 q 队列服务使用 Gearman ,通知系统则使用 pyapns 来实现。4 {' |$ E. p9 R6 Z7 L1 i9 P7 p
& K& C; z) X/ \5 ]4 G' V 监控, N$ X- K- c2 D% Q8 Z
- u+ ]; G: X+ \# J" M2 K2 d6 c 前面提及的服务器实例数量加起来,的确有100多个,有效的监控是相当有必要的。使用 Munin 作为主要监控工具 , 也写了不少定制插件,外部监控用 Pingdom 的服务。通知服务使用PagerDuty。' ]/ n5 U ]" [
7 `$ H% ^% m8 J) K4 @9 N 对于 Python 的错误报告,使用 Disqus 团队开源的 Sentry 来处理。
4 ?' k! N( N; S; ^2 i2 u# I$ W# i
几个感想: {0 }: _& e! r0 ~; k/ U. G
' }, d/ X3 F' {7 R7 r
0)轻装上阵说起来容易,做起来非常难。这也是 Instagram 团队目前最令人着迷的地方;
, O5 t4 O+ G) d; T; A+ x' X* Y% f3 ]& a9 P
1)Python 社区已经足够成熟,各个环节上都已经有不错的解决方案了。
& \2 R, N! g( X" t9 k. T; n; p# u Q) v6 I4 F5 v- N& s: C
2)如果要问我最大的一个感慨,我要说:Amazon 真是一家伟大的公司,甚至比 Google 还伟大; B3 g8 T9 J: Q( U
转载请保留当前帖子的链接:https://www.beimeilife.com/thread-2324-1-1.html 谢谢 |