马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
这是一篇旧文,值得一读, 就转来了:
& ~. e. x5 h4 G9 t, Z" t/ S, F
& i; o" K* Y9 g+ |2012 年4月10日凌晨消息,Instagram 被 Facebook 以10亿美金收购。团队规模:13 人。
8 D! x0 I0 F; U: ?7 |
0 c( M' p1 }% W0 j" ~/ Y; PInstagram 团队上个月才迎来第 7 名员工,是的,7个人的团队。作为 iPhone 上最火爆的图片类工具,instagram 用户数量已经超过 1400 万,图片数量超过 1.5 亿张。不得不说,这真他妈是个业界奇迹。! Q& W+ i* L! I) U p$ e4 @
( H7 k6 R# z9 _
几天前,只有三个人的 Instagram 工程师团队发布了一篇文章:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,披露了 Instagram 架构的一些信息,足够勾起大多数人的好奇心。读罢做点笔记,各种线索还是有一定参考价值的。能打开原文的建议直接读原文。- V8 b. g& }# J
. d4 g& r% W7 hInstragram.png
# ?) t o( S" v, J
) x4 t, P5 E, V ?$ p$ W Instagram 开发团队奉行的三个核心原则:
: o% E* D+ s+ g1 l1 u9 B' w
; u( q1 G1 S* \" f r Keep it very simple (极简主义)
! R ?/ L& i8 `: h Don't re-invent the wheel (不重复发明轮子)" J% b' O v) Z: Y; m: I/ S
Go with proven and solid technologies when you can(能用就用靠谱的技术)
" Q& r8 [2 j7 x# c2 _2 b) [
' C7 `1 g6 c+ }$ w* |* u, F7 ^OS/主机
1 y9 Y; p2 w" O( Z, }) ^$ V, l: p+ |, Q g+ j* N* G4 y7 j
操作系统的选择,在Amazon EC2上跑 Ubuntu Linux 11.04 (Natty Narwhal) ,这个版本经过验证在 EC2 上够稳定。因为只有三名工程师,只有三名工程师,所以自己部署机器到 IDC 是不靠谱的事情。幸好有亚马逊。5 M6 c3 W1 L; G6 Y# d, P, E
& P1 V2 F, ]4 ]" o" V
负载均衡5 y5 u: ~/ k6 N9 {7 k
( X) y# E3 j% m" c: l! e+ c 此前曾用过两台 Nginx 做 DNS 轮询承载前端请求,这样做会有副作用,现在已经迁移到Amazon的ELB(Elastic Load Balancer),起了三个 Nginx 实例,在 ELB 层停掉了 SSL , 以缓解 CPU 压力。DNS 服务使用 Amazon Route53 服务。
9 U: Y0 F! G6 C5 t
6 B0 j) v' a7 C L; R. [: B0 r" f" n 应用服务器
6 t, z. V) W. \" w1 `5 _
2 j5 ~: ^# k( U: r) D/ u! k 启用了 25 个 Django 实例,运行在 High-CPU Extra-Large 类型的服务器实例上,之所以用 High-CPU Extra-Large 实例是因为应用请求是 CPU 密集型而非 IO 密集型。) m4 Z5 N$ A2 `1 t3 [2 q
. I- v% b# e) y' O6 ^( A 使用 Gunicorn 作为 WSGI 服务器。过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源。使用 Fabric 加速部署。2 \9 |* z+ M% K0 z
$ |9 ~) D1 O* i 数据存储
" U H% Q# o) c# f; V, S
1 C6 E# o$ H. S* g 用户信息、图片元数据、标签等大部分数据存储在 PostgreSQL 中。主要的 Shard 数据库集群有 12个节点。
/ v& A, m( ]+ x9 D
7 c% y: o0 j- n$ | 实践中发现 Amazon 的网络磁盘系统单位时间内寻道能力不行,所以有必要将数据尽量放到内存中。创建了软 RAID 以提升 IO 能力,使用的 Mdadm 工具进行 RAID 管理。
: `. p5 \6 G: I1 i
9 e& Z6 \3 V' x 管理内存中的数据,vmtouch 这个小工具值得推荐。- H+ S3 R! Y( U+ x& L: m& I
. P, u5 g# S/ u7 s* W0 V
PostgreSQL 设置为 Master-Replica 方式,流复制模式。利用 EBS 的快照进行数据库备份。使用 XFS 文件系统,以便和快照服务充分配合。 使用 repmgr 这个小工具做 PostgreSQL 复制管理器器。
7 X9 ` I% \0 [1 C+ k2 p2 K7 Q% o( g% p( u* n, s
连接池管理,用了 Pgbouncer。Christophe Pettus 的文章包含了不少 PostgreSQL 数据库的信息。/ v+ }0 l' [0 l6 k- e5 o
' ^; A9 n4 g* w- ~7 ^- M1 ETB 级别的海量图片存储在 Amazon S3 上,CDN 采用的也是 Amazon 的服务,CloudFront。9 B7 c. I( H3 g# G L
& X9 h9 v1 [+ o0 FInstagram 也是 Redis 的重度用户,Feed 以及 Session 信息都用 Redis 处理,Redis 也是以 Master-Replica 方式部署。在 Replica 节点上进行数据备份。
0 B4 U* Y5 B$ [/ ^. K S' S- [/ Z* e# B) s- \
使用了 Apache Solr 承担 Geo-search API 的工作,Solr 简单的 JSON 接口也不错。; s; c1 J2 Q, e/ V
% ]* q3 N6 R9 P4 M
缓存使用了 6 个 Memcached 实例,库使用 pylibmc 和 libmemcached。亚马逊也提供缓存服务-Elastic Cache service ,Instagram 也有尝试,不过不便宜。
2 x# r- x1 \6 q& V) S& v3 A0 W
' m* P; s3 P+ y1 G1 `3 q+ h# L 任务队列/发布通知
% i; Y/ W# T9 N- |6 d4 U6 l# U1 M# a0 a) @0 [5 ^
队列服务使用 Gearman ,通知系统则使用 pyapns 来实现。
8 z4 A8 r0 \1 z% B4 k8 x! e ^8 ` K
监控% h6 V& i1 I* i0 Y
- y9 W9 N9 y, o5 H: B 前面提及的服务器实例数量加起来,的确有100多个,有效的监控是相当有必要的。使用 Munin 作为主要监控工具 , 也写了不少定制插件,外部监控用 Pingdom 的服务。通知服务使用PagerDuty。- o. M0 E; A9 S1 u! ?1 N5 ^4 }
: G/ @* I3 Q' [ U% O' j5 R2 X/ ~
对于 Python 的错误报告,使用 Disqus 团队开源的 Sentry 来处理。
8 D; V N' K( b% ?% ]1 J& a/ `( k/ x* N- W: O* s/ Q
几个感想' s+ K7 `2 K7 S p# f/ }# ^( f
# U, B* Y2 L J" Z6 G
0)轻装上阵说起来容易,做起来非常难。这也是 Instagram 团队目前最令人着迷的地方;
+ k# e+ `4 q% `/ X
9 T6 u( @/ P6 d/ q9 A2 v$ F2 D1)Python 社区已经足够成熟,各个环节上都已经有不错的解决方案了。
" M5 x8 k$ e/ O% `3 f' I3 x! j, N6 F$ w# U0 M
2)如果要问我最大的一个感慨,我要说:Amazon 真是一家伟大的公司,甚至比 Google 还伟大. z! P! W" J _- h
转载请保留当前帖子的链接:https://www.beimeilife.com/thread-2324-1-1.html 谢谢 |