开启左侧

[转]Instagram 架构分析笔记

[复制链接] 0
回复
1697
查看
打印 上一主题 下一主题
楼主
跳转到指定楼层
发表于 2015-10-13 14:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
这是一篇旧文,值得一读, 就转来了:
, A2 D; ]  y* Y7 m! p, m. `3 t5 M4 T. E0 I* x$ F, r: M1 ~
2012 年4月10日凌晨消息,Instagram 被 Facebook 以10亿美金收购。团队规模:13 人。
& E+ h6 L* E) I! j$ ?- k! m# X8 u7 ~6 V7 Z/ j  `% O' u
Instagram 团队上个月才迎来第 7 名员工,是的,7个人的团队。作为 iPhone 上最火爆的图片类工具,instagram 用户数量已经超过 1400 万,图片数量超过 1.5 亿张。不得不说,这真他妈是个业界奇迹。
3 Q2 g9 L* `5 f* U- k
* L: W* E" t. A; f* d; K 几天前,只有三个人的 Instagram 工程师团队发布了一篇文章:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,披露了 Instagram 架构的一些信息,足够勾起大多数人的好奇心。读罢做点笔记,各种线索还是有一定参考价值的。能打开原文的建议直接读原文。; r4 K' e( d9 r& l+ c
; a, l7 [% J- x* A
Instragram.png8 H5 o4 W5 ^( O! l
! U/ g/ U8 L7 q' j$ K' o4 f6 J7 I
Instagram 开发团队奉行的三个核心原则:' [1 ~: r9 ~! J
7 C/ s" [9 i8 I8 ^: w- R
    Keep it very simple (极简主义)& ?8 D2 Y9 s$ \; _# F+ }
     Don't re-invent the wheel (不重复发明轮子)
+ E0 t' z1 {8 ^" Y; ?6 f1 y     Go with proven and solid technologies when you can(能用就用靠谱的技术)6 l. c/ f, `2 f$ `

6 ?8 n; E9 T, h6 j/ D' u7 [% o# _OS/主机& \1 Z- ^8 m6 T; n8 E

3 o9 a: w" s9 S: p& P: n6 V 操作系统的选择,在Amazon EC2上跑 Ubuntu Linux 11.04 (Natty Narwhal) ,这个版本经过验证在 EC2 上够稳定。因为只有三名工程师,只有三名工程师,所以自己部署机器到 IDC 是不靠谱的事情。幸好有亚马逊。9 x/ O, W2 f1 P+ I
2 O2 x4 k1 l, J8 d% ^  W
负载均衡
8 [/ C* ~* F3 R" l( s7 d
5 _6 g/ L8 t- o& k+ S 此前曾用过两台 Nginx 做 DNS 轮询承载前端请求,这样做会有副作用,现在已经迁移到Amazon的ELB(Elastic Load Balancer),起了三个 Nginx 实例,在 ELB 层停掉了 SSL , 以缓解 CPU 压力。DNS 服务使用 Amazon Route53 服务。" i+ p1 l" F: R; R" L, B1 w9 Z7 B

2 J/ U% e. K' e- a, N/ r4 w4 c- C& L% N 应用服务器
  A; ?' a2 Z: \, m$ h- ?) N: u3 [3 m
启用了 25 个 Django 实例,运行在 High-CPU Extra-Large 类型的服务器实例上,之所以用 High-CPU Extra-Large 实例是因为应用请求是 CPU 密集型而非 IO 密集型。- T; K" A5 ?- F

" Z# [+ I$ {; N/ P' ~0 ^+ V 使用 Gunicorn 作为 WSGI 服务器。过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源。使用 Fabric 加速部署。" F% [( K( M* R- T+ `6 ~- y

1 N' \' F. m3 T  X7 X& T 数据存储, U9 ^- E1 f- o3 N& B+ @/ ~$ h
: ~% W1 U1 J3 m/ t% ]( w
用户信息、图片元数据、标签等大部分数据存储在 PostgreSQL 中。主要的 Shard 数据库集群有 12个节点。
5 {( r4 [, {2 f# E9 L# r
3 n9 M3 m  E2 T 实践中发现 Amazon 的网络磁盘系统单位时间内寻道能力不行,所以有必要将数据尽量放到内存中。创建了软 RAID 以提升 IO 能力,使用的 Mdadm 工具进行 RAID 管理。
: d, Y* W" n8 M2 {8 B1 \' l2 B4 ^5 k) [0 h1 j( L
管理内存中的数据,vmtouch 这个小工具值得推荐。/ d" E# s7 B! s/ A; c
! y* S6 V% b, c1 \$ |
PostgreSQL 设置为 Master-Replica 方式,流复制模式。利用 EBS 的快照进行数据库备份。使用 XFS 文件系统,以便和快照服务充分配合。 使用 repmgr 这个小工具做 PostgreSQL 复制管理器器。, N* q& G" c$ @! j

' q0 t( S6 P$ m( r. ^5 Q 连接池管理,用了 Pgbouncer。Christophe Pettus 的文章包含了不少 PostgreSQL 数据库的信息。
: l( P( [. x$ x# v( w5 j4 s" O2 {8 L: f8 E5 D4 C
TB 级别的海量图片存储在 Amazon S3 上,CDN 采用的也是 Amazon 的服务,CloudFront。4 t9 c8 ^5 k1 q& {. s
. O, v' n8 R% L9 l, s# e9 P( E
Instagram 也是 Redis 的重度用户,Feed 以及 Session 信息都用 Redis 处理,Redis 也是以 Master-Replica 方式部署。在 Replica 节点上进行数据备份。
9 }/ z5 H) \0 O" z7 M% ~0 \# W( y1 t3 y' D
使用了 Apache Solr 承担 Geo-search API 的工作,Solr 简单的 JSON 接口也不错。4 @, T$ d0 H8 u5 w5 v" R  A. z
; a6 a9 G: h! s# z: Y/ t
缓存使用了 6 个 Memcached 实例,库使用 pylibmc 和 libmemcached。亚马逊也提供缓存服务-Elastic Cache service ,Instagram 也有尝试,不过不便宜。
7 r+ r3 I2 P1 @1 T4 T+ C9 e
, M+ w' w, G0 ~ 任务队列/发布通知- p' a: m- G/ N) ]5 k2 ?: ]
" Z( i% y9 R" e1 n
队列服务使用 Gearman ,通知系统则使用 pyapns 来实现。7 I5 l' o* s* {) A
/ d8 p) h& Z" X; w7 s
监控$ Y% g% e1 h, ]" O) _5 x3 n

: P/ j0 N9 p2 z8 Y7 @! b0 o 前面提及的服务器实例数量加起来,的确有100多个,有效的监控是相当有必要的。使用 Munin 作为主要监控工具 , 也写了不少定制插件,外部监控用 Pingdom 的服务。通知服务使用PagerDuty。
! }7 H0 V2 _0 T3 @6 N4 S9 ]" f* x9 k/ I
对于 Python 的错误报告,使用 Disqus 团队开源的 Sentry 来处理。
! j# g, i6 t+ R; I$ v2 M2 b, U6 d! E, m  a8 h2 S; |
几个感想
$ g, B+ D2 _" P  N, ~
2 q# W* i( H1 Z4 l/ o0)轻装上阵说起来容易,做起来非常难。这也是 Instagram 团队目前最令人着迷的地方;
$ r' m2 S5 y4 I* O& v
- J5 h- y8 a1 _1)Python 社区已经足够成熟,各个环节上都已经有不错的解决方案了。
2 D+ N1 g$ C3 V
+ C8 x( T4 U3 l; h2)如果要问我最大的一个感慨,我要说:Amazon 真是一家伟大的公司,甚至比 Google 还伟大9 q" Q) j% z: T. E. }


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

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

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

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

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