开启左侧

[转]Instagram 架构分析笔记

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

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

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

x
这是一篇旧文,值得一读, 就转来了:  {# `8 h# x1 j* I$ F
$ Q' W2 ~& y* Z2 G- p/ T8 b
2012 年4月10日凌晨消息,Instagram 被 Facebook 以10亿美金收购。团队规模:13 人。  Z2 P" _; Z2 J
9 |2 R9 n( o) f
Instagram 团队上个月才迎来第 7 名员工,是的,7个人的团队。作为 iPhone 上最火爆的图片类工具,instagram 用户数量已经超过 1400 万,图片数量超过 1.5 亿张。不得不说,这真他妈是个业界奇迹。6 p! G$ k6 ]+ C% s; `& J

6 o# y1 W/ g7 C5 B 几天前,只有三个人的 Instagram 工程师团队发布了一篇文章:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,披露了 Instagram 架构的一些信息,足够勾起大多数人的好奇心。读罢做点笔记,各种线索还是有一定参考价值的。能打开原文的建议直接读原文。
6 X7 o* l9 a# x7 Q! q5 N3 {- M& n$ l8 a# w$ r
Instragram.png* T- S6 k5 j* N! S, s! D3 `. r' K
6 {) a7 p, o+ c* P
Instagram 开发团队奉行的三个核心原则:% w: j6 i, }* s; S; p

: X; W. V% ^9 M    Keep it very simple (极简主义)+ K5 d" I! Z4 s* t) k* T% l+ a- ?
     Don't re-invent the wheel (不重复发明轮子)! B$ h" S% Z% o$ f$ Q
     Go with proven and solid technologies when you can(能用就用靠谱的技术)+ w4 g0 U: M5 P  ^  |

8 x! h- L# Z. `# v* `# JOS/主机& A6 j2 t9 ]' e) E: u0 l& v! L
# {2 r' {) Z) ?2 C: y3 U
操作系统的选择,在Amazon EC2上跑 Ubuntu Linux 11.04 (Natty Narwhal) ,这个版本经过验证在 EC2 上够稳定。因为只有三名工程师,只有三名工程师,所以自己部署机器到 IDC 是不靠谱的事情。幸好有亚马逊。
$ {: k  O. b0 n
% W: h* y7 h) ~5 h( d 负载均衡
1 N+ F$ P! \9 r, F* N8 {1 c( i3 I2 U9 \0 U' y; |# y
此前曾用过两台 Nginx 做 DNS 轮询承载前端请求,这样做会有副作用,现在已经迁移到Amazon的ELB(Elastic Load Balancer),起了三个 Nginx 实例,在 ELB 层停掉了 SSL , 以缓解 CPU 压力。DNS 服务使用 Amazon Route53 服务。
1 F" o5 F" U' n$ f% N! ~' k8 p1 g/ s& u5 Q$ J5 k/ f( {+ g/ q/ v
应用服务器9 K1 R* g( a. t

' R5 ~3 C+ L, M2 M# o* B 启用了 25 个 Django 实例,运行在 High-CPU Extra-Large 类型的服务器实例上,之所以用 High-CPU Extra-Large 实例是因为应用请求是 CPU 密集型而非 IO 密集型。
0 C3 p$ s0 O. W( g9 |. V( N
! y/ @' S9 X0 l$ O* r( q( Z 使用 Gunicorn 作为 WSGI 服务器。过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源。使用 Fabric 加速部署。
0 q1 a: H0 [/ p# F3 Q5 T: H' r" o$ Y3 g
数据存储
, C( Z2 t5 w' a" @' M& j0 Y7 }3 N8 z! m  N
用户信息、图片元数据、标签等大部分数据存储在 PostgreSQL 中。主要的 Shard 数据库集群有 12个节点。
( @% z( \4 q$ F
$ O; O$ k! x( Y 实践中发现 Amazon 的网络磁盘系统单位时间内寻道能力不行,所以有必要将数据尽量放到内存中。创建了软 RAID 以提升 IO 能力,使用的 Mdadm 工具进行 RAID 管理。1 i) D3 [/ S- S0 E' ]

: G! M- j7 c# X: ^ 管理内存中的数据,vmtouch 这个小工具值得推荐。- l/ x2 l( m- k' a
! A1 q* p. F4 R! S( _* U- J' E
PostgreSQL 设置为 Master-Replica 方式,流复制模式。利用 EBS 的快照进行数据库备份。使用 XFS 文件系统,以便和快照服务充分配合。 使用 repmgr 这个小工具做 PostgreSQL 复制管理器器。
5 o, Y% A# R. F" R: m' C* ^
' ?/ K0 M, H3 z9 g 连接池管理,用了 Pgbouncer。Christophe Pettus 的文章包含了不少 PostgreSQL 数据库的信息。
# u6 I# o3 F, k4 k1 _) e) t/ o2 N2 W- `  R1 U, ^! F- L4 S9 Y
TB 级别的海量图片存储在 Amazon S3 上,CDN 采用的也是 Amazon 的服务,CloudFront。- Z. d5 g1 Y6 `9 V+ D

0 t* S0 U" z+ U/ m& O5 U; h0 C! P6 rInstagram 也是 Redis 的重度用户,Feed 以及 Session 信息都用 Redis 处理,Redis 也是以 Master-Replica 方式部署。在 Replica 节点上进行数据备份。
% M# A+ s1 p1 V5 x
$ D/ v6 X. R2 q7 N3 E1 r 使用了 Apache Solr 承担 Geo-search API 的工作,Solr 简单的 JSON 接口也不错。
  ]  F2 d2 Q. a) M4 m5 F5 s" s: e
5 N1 s, K% T7 I& p* N 缓存使用了 6 个 Memcached 实例,库使用 pylibmc 和 libmemcached。亚马逊也提供缓存服务-Elastic Cache service ,Instagram 也有尝试,不过不便宜。
- ~0 K. O5 u: s4 v- X# B- q. t+ l( u8 [3 K, V8 @3 t5 W& W4 [
任务队列/发布通知" |% ^  z- r4 `0 W4 e+ R9 p- S

: N7 _. u/ }- S 队列服务使用 Gearman ,通知系统则使用 pyapns 来实现。& N2 z6 D* O' ~

# F0 t2 d( K3 U7 M' F% u7 z 监控
+ x7 Q/ j0 B, j. l% C+ P
. R: i3 c3 ?. Q9 M 前面提及的服务器实例数量加起来,的确有100多个,有效的监控是相当有必要的。使用 Munin 作为主要监控工具 , 也写了不少定制插件,外部监控用 Pingdom 的服务。通知服务使用PagerDuty。
+ H5 i6 [! z7 E! _* P& a7 X5 m( u, q9 t/ A; Q) U5 ]
对于 Python 的错误报告,使用 Disqus 团队开源的 Sentry 来处理。9 ^# [4 N/ N- }

- x% I4 ]: f: U, ^/ @" [$ h& Q2 { 几个感想) W4 P9 p8 k* D5 N
, x) d- K4 `; F7 z; E, W4 \
0)轻装上阵说起来容易,做起来非常难。这也是 Instagram 团队目前最令人着迷的地方;
5 w8 o6 v$ H" P& Z$ l/ @
  p" g% h; M* {  U1 f5 x* a0 G$ A1)Python 社区已经足够成熟,各个环节上都已经有不错的解决方案了。
. V. [: Y0 `% c7 A! H1 Q3 p  w6 w0 ?! x
2)如果要问我最大的一个感慨,我要说:Amazon 真是一家伟大的公司,甚至比 Google 还伟大, |' Z# l: w* A3 N, {


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

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

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

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

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