马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
这是一篇旧文,值得一读, 就转来了:
- X6 D/ ]- E& U% z* }% N+ n) s$ q' x' L
2012 年4月10日凌晨消息,Instagram 被 Facebook 以10亿美金收购。团队规模:13 人。! R! Z' U- i" f( W
9 [. b$ V) z% O; ?0 h- e: ~Instagram 团队上个月才迎来第 7 名员工,是的,7个人的团队。作为 iPhone 上最火爆的图片类工具,instagram 用户数量已经超过 1400 万,图片数量超过 1.5 亿张。不得不说,这真他妈是个业界奇迹。5 ?9 _, a Z: T
7 j" i, c# v+ ^ Y
几天前,只有三个人的 Instagram 工程师团队发布了一篇文章:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,披露了 Instagram 架构的一些信息,足够勾起大多数人的好奇心。读罢做点笔记,各种线索还是有一定参考价值的。能打开原文的建议直接读原文。
& w/ x( C2 J: |7 l5 d4 b/ @" k3 L U) n2 I
Instragram.png
. M" Y) c7 S. M1 H- z# P
* Z2 }; k1 w S. E Instagram 开发团队奉行的三个核心原则:
8 a0 p ]9 R/ a2 G5 d9 v+ s+ i) k, C. S% X; Y O
Keep it very simple (极简主义)
( j* w9 g* {7 m0 _: _0 [ Don't re-invent the wheel (不重复发明轮子)
: a8 L: v0 [% x4 m Go with proven and solid technologies when you can(能用就用靠谱的技术)
5 B7 W" o' q% Z4 _3 O* C4 A! C6 l# p
OS/主机
& \/ b' Q# X: y6 O% f
% N. c7 x" ~+ P# z5 o) B$ W* n3 W+ U# l 操作系统的选择,在Amazon EC2上跑 Ubuntu Linux 11.04 (Natty Narwhal) ,这个版本经过验证在 EC2 上够稳定。因为只有三名工程师,只有三名工程师,所以自己部署机器到 IDC 是不靠谱的事情。幸好有亚马逊。
- t8 h% z4 J5 Z- ? a$ e9 y4 g8 X1 {: C( j5 N8 W/ [) M8 H
负载均衡; S+ h3 ]0 d& U* C
! [/ R- }! y b- r
此前曾用过两台 Nginx 做 DNS 轮询承载前端请求,这样做会有副作用,现在已经迁移到Amazon的ELB(Elastic Load Balancer),起了三个 Nginx 实例,在 ELB 层停掉了 SSL , 以缓解 CPU 压力。DNS 服务使用 Amazon Route53 服务。- e5 M( t a. |3 P
* Q. s# U$ ]# U2 k" o' A& |
应用服务器
# `8 B5 f+ I- m r& ~
2 F/ j5 @. `+ X2 V& S8 u" o 启用了 25 个 Django 实例,运行在 High-CPU Extra-Large 类型的服务器实例上,之所以用 High-CPU Extra-Large 实例是因为应用请求是 CPU 密集型而非 IO 密集型。* a" r# \2 Q- ^& L+ P* n1 _. [
2 e+ ]% d: R$ u7 d
使用 Gunicorn 作为 WSGI 服务器。过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源。使用 Fabric 加速部署。" z- ?4 I% J+ x1 W1 L
7 H6 x8 N6 D Y9 R: v2 y% X6 m 数据存储7 I) h4 \4 N. a' i
# A8 g: g, E# i6 w/ m8 W: `
用户信息、图片元数据、标签等大部分数据存储在 PostgreSQL 中。主要的 Shard 数据库集群有 12个节点。
, l9 b1 m& B7 T# \6 T7 C% h
& N2 u1 S7 {7 u. h 实践中发现 Amazon 的网络磁盘系统单位时间内寻道能力不行,所以有必要将数据尽量放到内存中。创建了软 RAID 以提升 IO 能力,使用的 Mdadm 工具进行 RAID 管理。3 [/ L/ L. d# ? s3 x& O6 T
4 X6 w t2 i: L- O0 `/ y, l
管理内存中的数据,vmtouch 这个小工具值得推荐。( w1 y9 v- ?* u, J6 o' R+ O
$ \' U9 T/ j9 y r$ ?+ U$ p. S
PostgreSQL 设置为 Master-Replica 方式,流复制模式。利用 EBS 的快照进行数据库备份。使用 XFS 文件系统,以便和快照服务充分配合。 使用 repmgr 这个小工具做 PostgreSQL 复制管理器器。7 U9 H3 Z M. c. a! B
5 G7 U4 w+ t7 n1 v
连接池管理,用了 Pgbouncer。Christophe Pettus 的文章包含了不少 PostgreSQL 数据库的信息。6 M: Y( u0 `; t* v6 @8 J
1 f% O$ V6 i( u* FTB 级别的海量图片存储在 Amazon S3 上,CDN 采用的也是 Amazon 的服务,CloudFront。
: @7 I3 l6 v: g, b: ~2 R B9 f. ^1 [1 D' r% i" R
Instagram 也是 Redis 的重度用户,Feed 以及 Session 信息都用 Redis 处理,Redis 也是以 Master-Replica 方式部署。在 Replica 节点上进行数据备份。
# l4 l2 ^7 b; j. ~8 \5 U; k4 i" @0 X' t2 M) N( e; O0 o, b
使用了 Apache Solr 承担 Geo-search API 的工作,Solr 简单的 JSON 接口也不错。
; g" c) V3 t+ J/ X: h* i. k
" V2 p( U) j) A! q 缓存使用了 6 个 Memcached 实例,库使用 pylibmc 和 libmemcached。亚马逊也提供缓存服务-Elastic Cache service ,Instagram 也有尝试,不过不便宜。% _; c. c& L" ?+ U: @0 I
; [" S0 F1 Q+ m
任务队列/发布通知 [" c9 ?, X7 ~) t& ~
: @$ h$ l4 b+ V2 S* T
队列服务使用 Gearman ,通知系统则使用 pyapns 来实现。' @. P4 L+ P9 h; o9 ]" k W" g! ^
, |" s; }; {* G: W
监控9 v4 r# V4 a+ f) Y
7 B- ~8 U# n, f. ~
前面提及的服务器实例数量加起来,的确有100多个,有效的监控是相当有必要的。使用 Munin 作为主要监控工具 , 也写了不少定制插件,外部监控用 Pingdom 的服务。通知服务使用PagerDuty。
5 P; d1 o( n" X
% V3 J. ^8 d1 P1 w: A; w 对于 Python 的错误报告,使用 Disqus 团队开源的 Sentry 来处理。
8 M6 r* L6 s( d( \5 e4 E8 D
/ j" \6 Q) s4 [% M0 | 几个感想
% m! w7 J+ m7 [
% P7 {4 E0 ]9 a }: a0)轻装上阵说起来容易,做起来非常难。这也是 Instagram 团队目前最令人着迷的地方;
4 u8 d% a+ C: S7 `* n9 g( F& r5 b
1)Python 社区已经足够成熟,各个环节上都已经有不错的解决方案了。7 v W+ R9 S3 K3 l/ m
5 z8 \/ G' O& o6 W1 m# _2)如果要问我最大的一个感慨,我要说:Amazon 真是一家伟大的公司,甚至比 Google 还伟大6 K) p' c8 C( P
转载请保留当前帖子的链接:https://www.beimeilife.com/thread-2324-1-1.html 谢谢 |