开启左侧

[转]Instagram 架构分析笔记

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

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

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

x
这是一篇旧文,值得一读, 就转来了:5 Q! j' F! [! i

  c6 n. _. Z* R9 I2012 年4月10日凌晨消息,Instagram 被 Facebook 以10亿美金收购。团队规模:13 人。" Z7 B& l+ x: q2 m0 u7 }3 W
8 G7 Z) o. n) ?3 q; ^
Instagram 团队上个月才迎来第 7 名员工,是的,7个人的团队。作为 iPhone 上最火爆的图片类工具,instagram 用户数量已经超过 1400 万,图片数量超过 1.5 亿张。不得不说,这真他妈是个业界奇迹。
$ H$ n' l. T, j: U( [
2 g# v9 t- g$ v4 I7 N  S( H 几天前,只有三个人的 Instagram 工程师团队发布了一篇文章:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,披露了 Instagram 架构的一些信息,足够勾起大多数人的好奇心。读罢做点笔记,各种线索还是有一定参考价值的。能打开原文的建议直接读原文。
% G4 Z% n$ ]/ |; g+ Z, w6 ~/ x6 X( N' k3 R
Instragram.png& K: }" _+ F2 L2 o
7 D5 `! C9 Q# n1 H" |
Instagram 开发团队奉行的三个核心原则:4 l2 k+ B" e( ]8 _' B0 ^, w

* ]* _8 r# y" J+ @7 z! s  f    Keep it very simple (极简主义)
- S3 W5 r3 M& a, M     Don't re-invent the wheel (不重复发明轮子); N; c0 p2 T: a8 t. Z. p: T
     Go with proven and solid technologies when you can(能用就用靠谱的技术)
6 e5 Q$ s; ?5 w/ d
2 f4 k/ w# B& q' POS/主机+ g2 d1 o/ A8 y% E1 q
9 \" E% L7 q1 r$ K2 A
操作系统的选择,在Amazon EC2上跑 Ubuntu Linux 11.04 (Natty Narwhal) ,这个版本经过验证在 EC2 上够稳定。因为只有三名工程师,只有三名工程师,所以自己部署机器到 IDC 是不靠谱的事情。幸好有亚马逊。; e' @) B' g4 p5 l
: l0 ]1 P& @( K' q$ P3 q& f
负载均衡
. ?6 M. p- J: ^4 v3 i! _! z4 _/ O/ |3 R) f' G- i+ K6 x3 }6 X2 z
此前曾用过两台 Nginx 做 DNS 轮询承载前端请求,这样做会有副作用,现在已经迁移到Amazon的ELB(Elastic Load Balancer),起了三个 Nginx 实例,在 ELB 层停掉了 SSL , 以缓解 CPU 压力。DNS 服务使用 Amazon Route53 服务。+ _5 c1 j8 j4 C: @( F8 }
& |6 a2 g0 W1 o7 _
应用服务器, F) f% G! z5 Z" M/ O: o
3 z9 E/ [7 T2 x( F
启用了 25 个 Django 实例,运行在 High-CPU Extra-Large 类型的服务器实例上,之所以用 High-CPU Extra-Large 实例是因为应用请求是 CPU 密集型而非 IO 密集型。
3 t: p7 M! \6 g5 r4 R* z& L; g; L2 t0 A7 h1 c5 }3 n
使用 Gunicorn 作为 WSGI 服务器。过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源。使用 Fabric 加速部署。) ], h4 H$ D9 }3 M

  ?5 Q$ T& f0 r( j 数据存储3 `9 ?) G- U& H6 o; U$ R
9 a% ?! L# J& g, T$ w5 g
用户信息、图片元数据、标签等大部分数据存储在 PostgreSQL 中。主要的 Shard 数据库集群有 12个节点。
  Z( B1 W' ~1 i. w$ v4 v# y# T8 y
实践中发现 Amazon 的网络磁盘系统单位时间内寻道能力不行,所以有必要将数据尽量放到内存中。创建了软 RAID 以提升 IO 能力,使用的 Mdadm 工具进行 RAID 管理。# a* O. _( z9 a2 Q
' |( @- l6 W5 I
管理内存中的数据,vmtouch 这个小工具值得推荐。9 H% ^( _' \  s% _9 Z8 Z& L
+ [; S( C5 n, J) s+ h
PostgreSQL 设置为 Master-Replica 方式,流复制模式。利用 EBS 的快照进行数据库备份。使用 XFS 文件系统,以便和快照服务充分配合。 使用 repmgr 这个小工具做 PostgreSQL 复制管理器器。6 B3 c' V6 H2 k% d+ @2 S5 s7 ]
* K0 N4 V! `' N" c, s1 R3 ?
连接池管理,用了 Pgbouncer。Christophe Pettus 的文章包含了不少 PostgreSQL 数据库的信息。
0 i) o$ g+ @9 r& T' _! j5 R
" T: z% K) `- c9 XTB 级别的海量图片存储在 Amazon S3 上,CDN 采用的也是 Amazon 的服务,CloudFront。6 {/ A7 U( X! Y  S# v1 B
5 u* q1 M/ G$ z" j' B
Instagram 也是 Redis 的重度用户,Feed 以及 Session 信息都用 Redis 处理,Redis 也是以 Master-Replica 方式部署。在 Replica 节点上进行数据备份。
! m- m4 x2 a8 W7 q  d' \' m" S, W7 ?- i( p# b) Q0 A
使用了 Apache Solr 承担 Geo-search API 的工作,Solr 简单的 JSON 接口也不错。
/ {2 t$ z9 ?! K  F4 _) p3 |3 ?/ h; v' B8 M* a
缓存使用了 6 个 Memcached 实例,库使用 pylibmc 和 libmemcached。亚马逊也提供缓存服务-Elastic Cache service ,Instagram 也有尝试,不过不便宜。
! T; Y* F( N& ?8 v$ Q" `0 a# @) j4 d$ l- {' j- Q& T) N
任务队列/发布通知
  F7 y9 o- c6 P0 g$ _9 R4 e% L4 v, b+ S4 F# J, g5 S7 [6 q* D$ J9 g
队列服务使用 Gearman ,通知系统则使用 pyapns 来实现。
1 i( v$ b! c& p( b8 h' L$ |
7 C4 a: d- r5 Y. _ 监控
6 Z# _3 p; K$ `, L. x7 l" d; m6 s, d( [/ F
前面提及的服务器实例数量加起来,的确有100多个,有效的监控是相当有必要的。使用 Munin 作为主要监控工具 , 也写了不少定制插件,外部监控用 Pingdom 的服务。通知服务使用PagerDuty。8 U& M+ Q5 b; B# K. |2 ~
2 U7 U# k2 @( V. f* h" j
对于 Python 的错误报告,使用 Disqus 团队开源的 Sentry 来处理。, e1 U& {$ o$ L" ]

0 l) b% F! n# J2 b 几个感想
, E2 i% j& U: Y; @' y/ I
2 ^) e3 _: b5 M! \0)轻装上阵说起来容易,做起来非常难。这也是 Instagram 团队目前最令人着迷的地方;# `# u( |) @7 F( F6 S: o

* p8 \$ k1 X4 @  p7 ^- t6 I* ~& L# y1)Python 社区已经足够成熟,各个环节上都已经有不错的解决方案了。
" A) Q! R: ?, B3 M5 _3 ?. t' f: A! i, ?7 T
2)如果要问我最大的一个感慨,我要说:Amazon 真是一家伟大的公司,甚至比 Google 还伟大
' M8 A" U# G# p( [# N

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

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

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

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

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