开启左侧

[转]Instagram 架构分析笔记

[复制链接]
发表于 2015-10-13 14:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
这是一篇旧文,值得一读, 就转来了:' ~" {0 l5 l+ F) v! A

' k; k/ L/ t1 j9 p+ ]4 |! ?* _2012 年4月10日凌晨消息,Instagram 被 Facebook 以10亿美金收购。团队规模:13 人。, O; U' I8 A: `+ Z* T

/ `" @9 ^' O+ T' a% j4 v2 DInstagram 团队上个月才迎来第 7 名员工,是的,7个人的团队。作为 iPhone 上最火爆的图片类工具,instagram 用户数量已经超过 1400 万,图片数量超过 1.5 亿张。不得不说,这真他妈是个业界奇迹。8 D9 B: {; H1 v' U, A8 b
( {+ ^; ]' \" y
几天前,只有三个人的 Instagram 工程师团队发布了一篇文章:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,披露了 Instagram 架构的一些信息,足够勾起大多数人的好奇心。读罢做点笔记,各种线索还是有一定参考价值的。能打开原文的建议直接读原文。
6 f2 P. n( `7 ^
7 x! E4 d. y4 {$ Z& bInstragram.png! U$ \' `7 e4 N' `3 [- o7 G

+ b# S% ]9 U- b4 m/ m Instagram 开发团队奉行的三个核心原则:
6 i+ D# y. B/ {3 k  L
( ?: t1 w( q% T- Z5 M    Keep it very simple (极简主义)
  d- ~% y1 x* q* f9 W  @1 b, B     Don't re-invent the wheel (不重复发明轮子)
$ r% d: ^* K1 V% i$ |     Go with proven and solid technologies when you can(能用就用靠谱的技术)
/ A# \$ n) t3 r1 B2 z* }+ o; A; G( `, U5 y0 \! n8 ^
OS/主机4 H( e! v% x; O  u5 `( T& t0 S

( W7 X, t; u+ Z* y7 L! s9 l. _ 操作系统的选择,在Amazon EC2上跑 Ubuntu Linux 11.04 (Natty Narwhal) ,这个版本经过验证在 EC2 上够稳定。因为只有三名工程师,只有三名工程师,所以自己部署机器到 IDC 是不靠谱的事情。幸好有亚马逊。: D6 u% v0 L. o# ^5 c! ?

0 y) Z$ F2 r# F# V' R 负载均衡
; l; i6 K9 N- H" [5 G( c- C3 O; B. B+ @. r9 z! Z$ N
此前曾用过两台 Nginx 做 DNS 轮询承载前端请求,这样做会有副作用,现在已经迁移到Amazon的ELB(Elastic Load Balancer),起了三个 Nginx 实例,在 ELB 层停掉了 SSL , 以缓解 CPU 压力。DNS 服务使用 Amazon Route53 服务。/ M) _5 E1 I: t# p# i+ Y
7 R. @8 U/ Q* w" o) c! W
应用服务器. z; {" \: S% A0 U! _$ m

  h- V! ?+ h0 a. d8 L: D) W 启用了 25 个 Django 实例,运行在 High-CPU Extra-Large 类型的服务器实例上,之所以用 High-CPU Extra-Large 实例是因为应用请求是 CPU 密集型而非 IO 密集型。
9 V2 w, B; D" @  \1 c; d( b
0 x/ }" K6 \* {5 d) g0 p4 G' @ 使用 Gunicorn 作为 WSGI 服务器。过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源。使用 Fabric 加速部署。
( D* H. s$ J2 Z! ~6 k& _
6 K& e% A9 E& o1 I* r" E% H 数据存储
+ g6 F& l3 Y) K: ?" l* ^5 `2 C6 r4 H  _3 [0 G) i' W
用户信息、图片元数据、标签等大部分数据存储在 PostgreSQL 中。主要的 Shard 数据库集群有 12个节点。& P1 ]9 H7 y+ C) q4 W# m9 r
" k5 }: Y) p1 E) g/ a
实践中发现 Amazon 的网络磁盘系统单位时间内寻道能力不行,所以有必要将数据尽量放到内存中。创建了软 RAID 以提升 IO 能力,使用的 Mdadm 工具进行 RAID 管理。
6 B! |, W0 |$ Q2 g1 Z$ |8 }( a  v  x  C$ K5 P: {% w
管理内存中的数据,vmtouch 这个小工具值得推荐。, x3 q; G3 A. k3 E- S: A. T

7 c( c' a3 ?& }PostgreSQL 设置为 Master-Replica 方式,流复制模式。利用 EBS 的快照进行数据库备份。使用 XFS 文件系统,以便和快照服务充分配合。 使用 repmgr 这个小工具做 PostgreSQL 复制管理器器。
/ T2 D4 `' ^. H8 `- P4 N
) @% u) h: s( u5 r5 q3 P" a5 | 连接池管理,用了 Pgbouncer。Christophe Pettus 的文章包含了不少 PostgreSQL 数据库的信息。
0 I3 T# w: Z+ _
  J; R& @, {* U  H; ~TB 级别的海量图片存储在 Amazon S3 上,CDN 采用的也是 Amazon 的服务,CloudFront。/ h; x9 Y$ T' H5 f7 G9 H; p; D

' _* e: N' P+ B( f2 k2 [1 w2 u4 ]Instagram 也是 Redis 的重度用户,Feed 以及 Session 信息都用 Redis 处理,Redis 也是以 Master-Replica 方式部署。在 Replica 节点上进行数据备份。
, i7 V& ?8 d7 p4 g8 t% ?+ A+ i+ E) K" P* ^  m: P  Z
使用了 Apache Solr 承担 Geo-search API 的工作,Solr 简单的 JSON 接口也不错。3 |: R: }+ I; O4 N. k; t

( z0 @) f8 |/ f, d 缓存使用了 6 个 Memcached 实例,库使用 pylibmc 和 libmemcached。亚马逊也提供缓存服务-Elastic Cache service ,Instagram 也有尝试,不过不便宜。% C  X. z0 T: d0 z2 U2 z/ o
3 u$ }' j1 `6 n2 E( \2 N( z9 \
任务队列/发布通知7 Q: G) t8 j5 l2 c5 U
4 w7 |: e! m0 R! q9 Y. g6 H
队列服务使用 Gearman ,通知系统则使用 pyapns 来实现。9 D9 ~( ~$ K; v4 D

9 X' \$ I- ]2 |7 Y0 J, C) I 监控6 ?$ U0 _' r3 \2 b! R, m" Y
2 b" k* A! C$ v1 L
前面提及的服务器实例数量加起来,的确有100多个,有效的监控是相当有必要的。使用 Munin 作为主要监控工具 , 也写了不少定制插件,外部监控用 Pingdom 的服务。通知服务使用PagerDuty。
; K/ U) n4 x# D" _2 G% M3 V& O
3 f: [  R$ I2 A 对于 Python 的错误报告,使用 Disqus 团队开源的 Sentry 来处理。3 [' x6 M. `7 Q) a* t
9 G: r$ M! U) Z* f
几个感想9 B0 }" Z; @& p1 w1 ~5 q! [

% v* |2 w) @& v! f6 P" Y  h5 u5 Z0)轻装上阵说起来容易,做起来非常难。这也是 Instagram 团队目前最令人着迷的地方;
5 M' Y  ~: T0 r8 E; {
* ]; J& H& o6 G& h! {" L1)Python 社区已经足够成熟,各个环节上都已经有不错的解决方案了。
1 v2 i2 Q, n) v; L( Y! x' |5 V' h2 P
2)如果要问我最大的一个感慨,我要说:Amazon 真是一家伟大的公司,甚至比 Google 还伟大  ^1 A5 B3 D" Q5 q3 w' V3 a$ Q


转载请保留当前帖子的链接:https://www.beimeilife.com/thread-2324-1-1.html 谢谢

使用高级回帖 (可批量传图、插入视频等)快速回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则   Ctrl + Enter 快速发布  

发帖时请遵守我国法律,网站会将有关你发帖内容、时间以及发帖IP地址等记录保留,只要接到合法请求,即会将信息提供给有关政府机构。
快速回复 返回顶部 返回列表