开启左侧

[转]Instagram 架构分析笔记

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

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

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

x
这是一篇旧文,值得一读, 就转来了:
4 w) h* r, L3 C3 A) ^! i' K; F& e; a7 p: X
2012 年4月10日凌晨消息,Instagram 被 Facebook 以10亿美金收购。团队规模:13 人。5 v+ d9 X9 o# ^7 J. U

" p4 ]: Z; |5 t+ b# u" vInstagram 团队上个月才迎来第 7 名员工,是的,7个人的团队。作为 iPhone 上最火爆的图片类工具,instagram 用户数量已经超过 1400 万,图片数量超过 1.5 亿张。不得不说,这真他妈是个业界奇迹。5 _9 A; X+ u; I: R( Q6 @

( e* n2 Z5 O0 F6 w 几天前,只有三个人的 Instagram 工程师团队发布了一篇文章:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,披露了 Instagram 架构的一些信息,足够勾起大多数人的好奇心。读罢做点笔记,各种线索还是有一定参考价值的。能打开原文的建议直接读原文。+ h  K* Z  k7 q

* l' ]9 U! d( zInstragram.png. Y$ G1 c7 o& i5 h

  E% _0 d' x* Y  P' `" N1 j7 d Instagram 开发团队奉行的三个核心原则:
' m8 X) g+ `) M1 e" d) a5 U8 K
" d* _5 U3 g- n4 v& A    Keep it very simple (极简主义)
8 L  \  i4 G1 S' i8 j* L     Don't re-invent the wheel (不重复发明轮子)
! L* i3 _/ s$ F! v1 }     Go with proven and solid technologies when you can(能用就用靠谱的技术)
8 y1 i  a4 m1 G  ]& L/ a8 c1 \; C- Z, E: O6 q$ d( v
OS/主机
, [5 T2 B% B! ~7 U# b  Z+ v
. r. V8 l  n+ v7 n. s. G( C6 e# _ 操作系统的选择,在Amazon EC2上跑 Ubuntu Linux 11.04 (Natty Narwhal) ,这个版本经过验证在 EC2 上够稳定。因为只有三名工程师,只有三名工程师,所以自己部署机器到 IDC 是不靠谱的事情。幸好有亚马逊。
- V* `* S5 x4 p# \7 i0 W; ?
2 G, Y& h# i" k2 M 负载均衡/ C; P0 u) m- Y: ?! U8 \
8 s8 D; i" J* v& ^  c
此前曾用过两台 Nginx 做 DNS 轮询承载前端请求,这样做会有副作用,现在已经迁移到Amazon的ELB(Elastic Load Balancer),起了三个 Nginx 实例,在 ELB 层停掉了 SSL , 以缓解 CPU 压力。DNS 服务使用 Amazon Route53 服务。" N$ u" P" O8 G) l  Y
# ?6 N: @% O7 U% m% v
应用服务器0 g8 p, w# Q3 W; \

% Y; X( f  s% P8 t' O+ S 启用了 25 个 Django 实例,运行在 High-CPU Extra-Large 类型的服务器实例上,之所以用 High-CPU Extra-Large 实例是因为应用请求是 CPU 密集型而非 IO 密集型。4 Z2 T! B# `8 K

$ O/ r  |. I( m 使用 Gunicorn 作为 WSGI 服务器。过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源。使用 Fabric 加速部署。
3 h" a6 U8 ]1 I( \2 C/ n7 Q: y6 ^3 r8 f( w. h' g% j) m
数据存储
( B, ^! N- n6 T! A- S. o* y8 t" X* e
9 m! v& K: ~* Z9 p) u 用户信息、图片元数据、标签等大部分数据存储在 PostgreSQL 中。主要的 Shard 数据库集群有 12个节点。
  v4 f3 A/ @# V8 I: r# N- Q9 K) v, S( ~* A6 ^0 F. X
实践中发现 Amazon 的网络磁盘系统单位时间内寻道能力不行,所以有必要将数据尽量放到内存中。创建了软 RAID 以提升 IO 能力,使用的 Mdadm 工具进行 RAID 管理。
: p- r9 @1 Y& q5 X) |
( S% f! t  q$ H4 t6 A, j- @1 I$ F 管理内存中的数据,vmtouch 这个小工具值得推荐。8 y' k$ ?* y% M8 \  s) \+ g

# O" w/ B  Y& ?; V$ [4 U; P& g5 RPostgreSQL 设置为 Master-Replica 方式,流复制模式。利用 EBS 的快照进行数据库备份。使用 XFS 文件系统,以便和快照服务充分配合。 使用 repmgr 这个小工具做 PostgreSQL 复制管理器器。8 i- W9 `- L6 O  W7 @

+ t6 |* D- ^; q9 N" K1 s/ p7 T" n 连接池管理,用了 Pgbouncer。Christophe Pettus 的文章包含了不少 PostgreSQL 数据库的信息。
! K( y' {8 b( I0 P8 E. b. D# h. Z  M; d& Z
TB 级别的海量图片存储在 Amazon S3 上,CDN 采用的也是 Amazon 的服务,CloudFront。* R% {" v3 h: z7 ]* f( p

7 p' C1 k5 a$ D& IInstagram 也是 Redis 的重度用户,Feed 以及 Session 信息都用 Redis 处理,Redis 也是以 Master-Replica 方式部署。在 Replica 节点上进行数据备份。
+ x- U1 ~6 l7 x0 a* Z  W- n# Q& S2 b0 L0 o" i
使用了 Apache Solr 承担 Geo-search API 的工作,Solr 简单的 JSON 接口也不错。  b, g8 O3 i0 v% I; i$ M4 ~* v
( h* Q" ~2 m% h* M
缓存使用了 6 个 Memcached 实例,库使用 pylibmc 和 libmemcached。亚马逊也提供缓存服务-Elastic Cache service ,Instagram 也有尝试,不过不便宜。
* \/ H! A: I' P7 [; z8 Z, X, A, s6 u, p" w: A/ e$ A
任务队列/发布通知0 d  u8 ~) w: q6 ~* z

9 l) s. c3 h+ b% y# P9 _6 [, i" F' ` 队列服务使用 Gearman ,通知系统则使用 pyapns 来实现。
7 A* Z4 g/ }7 K; b: I- f% I( a' {" M2 S
监控
, b- d& V- x4 b8 Y% \8 x# O1 H+ W& W& I3 u
前面提及的服务器实例数量加起来,的确有100多个,有效的监控是相当有必要的。使用 Munin 作为主要监控工具 , 也写了不少定制插件,外部监控用 Pingdom 的服务。通知服务使用PagerDuty。
( m4 i. m% X* p0 r) Y
  G8 w) |3 X1 O* i0 h; l# F 对于 Python 的错误报告,使用 Disqus 团队开源的 Sentry 来处理。1 N1 @) p+ P; G7 _$ F
, j: @  a& K! s* w
几个感想
: ]* U* \& V' R& z1 ?
" ]! a! m( O/ P0 |% k$ Z0)轻装上阵说起来容易,做起来非常难。这也是 Instagram 团队目前最令人着迷的地方;' s+ B  Q: c: j$ d2 U8 e2 f
. J6 R" D2 _  I7 g
1)Python 社区已经足够成熟,各个环节上都已经有不错的解决方案了。
4 h/ j& u2 ^8 j* g: T% N
: K4 x3 V7 K5 F6 f; r2)如果要问我最大的一个感慨,我要说:Amazon 真是一家伟大的公司,甚至比 Google 还伟大
. E  w6 G4 X. N- w5 E+ C0 j

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

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

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

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

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