马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
这是一篇旧文,值得一读, 就转来了:" F: L- Y% e: }
! @: w! E& X; l3 B% k& M5 y* ?
2012 年4月10日凌晨消息,Instagram 被 Facebook 以10亿美金收购。团队规模:13 人。
2 i( [4 Y. s5 Q; J, Q# }) g: l# |5 f$ W2 q; Y
Instagram 团队上个月才迎来第 7 名员工,是的,7个人的团队。作为 iPhone 上最火爆的图片类工具,instagram 用户数量已经超过 1400 万,图片数量超过 1.5 亿张。不得不说,这真他妈是个业界奇迹。
; a' e% S+ C5 T7 B8 I, b. ?+ T4 l( \7 K6 N' A
几天前,只有三个人的 Instagram 工程师团队发布了一篇文章:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,披露了 Instagram 架构的一些信息,足够勾起大多数人的好奇心。读罢做点笔记,各种线索还是有一定参考价值的。能打开原文的建议直接读原文。6 a7 a( L* L" m4 K5 w& H! |, S
9 N j" ?, p8 e' D4 V( L7 X; k1 c3 L3 v
Instragram.png
5 E( W5 P% t3 t3 E2 H* q
# Y8 T# I: f3 m! v# E Instagram 开发团队奉行的三个核心原则:
% S% ?/ T; H8 r8 B+ ?: F2 c# V5 w9 d4 U; Z2 e# t; K4 l- _; C
Keep it very simple (极简主义)
* T9 h, `4 b+ ^( x# | Don't re-invent the wheel (不重复发明轮子)
% g! s, i2 f9 j8 f0 m5 n, k6 h7 H Go with proven and solid technologies when you can(能用就用靠谱的技术)$ o, f3 J& `% ?% ]# `/ q
) J6 p- q @$ }; M, tOS/主机+ L. z# K' K! q S+ R( Q6 a: L8 t1 O
1 a7 Q% s( g1 e) p$ Z( g. H 操作系统的选择,在Amazon EC2上跑 Ubuntu Linux 11.04 (Natty Narwhal) ,这个版本经过验证在 EC2 上够稳定。因为只有三名工程师,只有三名工程师,所以自己部署机器到 IDC 是不靠谱的事情。幸好有亚马逊。2 j5 {5 Y s3 @! b
, Z( K$ ?" @ _0 \* ?
负载均衡6 `; S" q3 \6 n2 C6 c
) {6 j% j. p* d1 J9 W, f
此前曾用过两台 Nginx 做 DNS 轮询承载前端请求,这样做会有副作用,现在已经迁移到Amazon的ELB(Elastic Load Balancer),起了三个 Nginx 实例,在 ELB 层停掉了 SSL , 以缓解 CPU 压力。DNS 服务使用 Amazon Route53 服务。 [ s v: i) G9 Q& ~6 l m7 U
5 L1 l- @$ z2 q
应用服务器8 a' Z, `0 j/ h" p# m3 r
4 L, \5 C, X0 Y7 l% }/ s 启用了 25 个 Django 实例,运行在 High-CPU Extra-Large 类型的服务器实例上,之所以用 High-CPU Extra-Large 实例是因为应用请求是 CPU 密集型而非 IO 密集型。
4 }" p8 {9 q: B$ ^/ T
2 i+ O U/ r' o! m/ k 使用 Gunicorn 作为 WSGI 服务器。过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源。使用 Fabric 加速部署。! F5 Z4 A- t% \+ b# b- _% v* m
; F% r8 Q" {8 Q# H' z) n3 ?' E 数据存储. ]* B1 E& m5 T4 V
. K) w1 q6 S! y. O" f# Z+ ] 用户信息、图片元数据、标签等大部分数据存储在 PostgreSQL 中。主要的 Shard 数据库集群有 12个节点。
8 W0 k0 [% m3 j4 o1 q& n$ J5 n- L9 T$ G4 ]
实践中发现 Amazon 的网络磁盘系统单位时间内寻道能力不行,所以有必要将数据尽量放到内存中。创建了软 RAID 以提升 IO 能力,使用的 Mdadm 工具进行 RAID 管理。 c" _* s( B w$ |9 {4 \
' L( X4 z# A- q! `2 ]
管理内存中的数据,vmtouch 这个小工具值得推荐。. y9 z1 A/ K2 ?$ u
/ c0 Z& L, M Y' n- J1 k: x/ Q) cPostgreSQL 设置为 Master-Replica 方式,流复制模式。利用 EBS 的快照进行数据库备份。使用 XFS 文件系统,以便和快照服务充分配合。 使用 repmgr 这个小工具做 PostgreSQL 复制管理器器。$ p* s; m. h! j I# d* v" p# W. O
& K X: s5 Z, K4 b$ Q4 A 连接池管理,用了 Pgbouncer。Christophe Pettus 的文章包含了不少 PostgreSQL 数据库的信息。0 V2 g8 U v8 L% Q! e: Z
G, L. w; V6 V( U0 h* P8 g% uTB 级别的海量图片存储在 Amazon S3 上,CDN 采用的也是 Amazon 的服务,CloudFront。
v1 b# E/ c9 N( x; Y8 g. D( h6 F( y7 U7 s. i' l" v) ]- s- d
Instagram 也是 Redis 的重度用户,Feed 以及 Session 信息都用 Redis 处理,Redis 也是以 Master-Replica 方式部署。在 Replica 节点上进行数据备份。
& e H4 s7 C( i' q1 z2 v2 ?# u* I/ p0 X3 Q6 C4 m' a
使用了 Apache Solr 承担 Geo-search API 的工作,Solr 简单的 JSON 接口也不错。4 Z: w% ?3 A3 H$ h t0 }9 C
; x8 X: w, A/ _* _
缓存使用了 6 个 Memcached 实例,库使用 pylibmc 和 libmemcached。亚马逊也提供缓存服务-Elastic Cache service ,Instagram 也有尝试,不过不便宜。/ ~' B% N5 ~- t: X$ d4 u2 e( x' w7 {
) z) ]3 D3 P \; i! Z( Y
任务队列/发布通知
, C3 ^5 G z: C" g# o* s9 j- i9 H& J5 w6 g" s* U ~& x
队列服务使用 Gearman ,通知系统则使用 pyapns 来实现。1 F8 e5 f( q _. O% y
, N9 }, ^0 Y8 C# W& v$ e# y
监控! r% ]8 ^' ]+ N. G
$ U$ R) W: O' ^5 y; `9 f; Q" X 前面提及的服务器实例数量加起来,的确有100多个,有效的监控是相当有必要的。使用 Munin 作为主要监控工具 , 也写了不少定制插件,外部监控用 Pingdom 的服务。通知服务使用PagerDuty。
; S6 G2 {$ A! ~2 M Z
% c. J% b, W& [8 v# \ 对于 Python 的错误报告,使用 Disqus 团队开源的 Sentry 来处理。6 E8 b7 j/ p, M0 A& e5 ^6 \
9 |5 r0 E B, I$ `7 _! Y 几个感想( i" T, k1 G! t3 ~0 E- R
" X! h$ H, ~7 k
0)轻装上阵说起来容易,做起来非常难。这也是 Instagram 团队目前最令人着迷的地方;
P2 b5 \ S- M) ]5 f# `3 s9 u1 p3 y, y% q" k: W
1)Python 社区已经足够成熟,各个环节上都已经有不错的解决方案了。0 ~6 q* f: X% [4 X
( v) E6 a) Q/ g: g2)如果要问我最大的一个感慨,我要说:Amazon 真是一家伟大的公司,甚至比 Google 还伟大" V* E$ W L J: U* N
转载请保留当前帖子的链接:https://www.beimeilife.com/thread-2324-1-1.html 谢谢 |