开启左侧

[转]Instagram 架构分析笔记

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

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

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

x
这是一篇旧文,值得一读, 就转来了:
; O; X; o6 ?* \, u- l: M
8 r5 ?+ p/ t% \1 c$ ^2012 年4月10日凌晨消息,Instagram 被 Facebook 以10亿美金收购。团队规模:13 人。6 P- a5 S6 n9 Y$ O1 Z
1 z2 O+ f! d4 n3 C" l4 ]
Instagram 团队上个月才迎来第 7 名员工,是的,7个人的团队。作为 iPhone 上最火爆的图片类工具,instagram 用户数量已经超过 1400 万,图片数量超过 1.5 亿张。不得不说,这真他妈是个业界奇迹。
  j2 ?+ r( y" o+ ~$ ~* n) x; A# _! d; Z2 [3 v
几天前,只有三个人的 Instagram 工程师团队发布了一篇文章:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,披露了 Instagram 架构的一些信息,足够勾起大多数人的好奇心。读罢做点笔记,各种线索还是有一定参考价值的。能打开原文的建议直接读原文。4 B5 C* R% v3 S; q" |5 `, g- C

# L; L! e' s! A8 eInstragram.png# j) ^$ B+ |6 A- K: S, G/ A" Y$ J
+ U. E; @% f4 @/ S
Instagram 开发团队奉行的三个核心原则:! k0 y: Y9 f9 e$ j- {  C5 T8 d

/ B. |! g; o) f$ I  X6 a8 Y1 j    Keep it very simple (极简主义)8 b1 b% b- ^, w  R
     Don't re-invent the wheel (不重复发明轮子)7 X! V; i1 q  S) D" W; p4 ]. T
     Go with proven and solid technologies when you can(能用就用靠谱的技术)
: _6 F( w1 ?. A, j7 ^8 f2 V6 }( I: E$ I( a' {& P" j% J
OS/主机9 B( k" r9 |( F/ C4 s
, \" b! n0 l' p, \# B: Z
操作系统的选择,在Amazon EC2上跑 Ubuntu Linux 11.04 (Natty Narwhal) ,这个版本经过验证在 EC2 上够稳定。因为只有三名工程师,只有三名工程师,所以自己部署机器到 IDC 是不靠谱的事情。幸好有亚马逊。
+ d& T1 _: b  H0 }+ S" ?# V$ ~/ ~* O+ g. M% p3 Q9 C3 g
负载均衡
3 B: G- `7 `, c# k! X2 P9 g$ g6 A# d( o2 I) c8 j
此前曾用过两台 Nginx 做 DNS 轮询承载前端请求,这样做会有副作用,现在已经迁移到Amazon的ELB(Elastic Load Balancer),起了三个 Nginx 实例,在 ELB 层停掉了 SSL , 以缓解 CPU 压力。DNS 服务使用 Amazon Route53 服务。4 [9 @1 F; ]/ w9 b" U# y$ W
. g' ?/ h+ p2 Q+ z
应用服务器: ^9 a$ @2 j: _9 t$ D
$ \; z* g  k' Y0 v5 ^. X
启用了 25 个 Django 实例,运行在 High-CPU Extra-Large 类型的服务器实例上,之所以用 High-CPU Extra-Large 实例是因为应用请求是 CPU 密集型而非 IO 密集型。
/ ~5 C% t5 B+ o* q9 |  Q( M
+ _) Z" s; a$ V2 `+ K 使用 Gunicorn 作为 WSGI 服务器。过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源。使用 Fabric 加速部署。: ?0 k4 J7 I+ x1 m9 Z! j% |

2 v4 U8 K& v6 m3 v 数据存储
6 v9 T- y* g+ h! x) u- n: L* l8 J# M9 X2 Y9 E! _5 \6 h
用户信息、图片元数据、标签等大部分数据存储在 PostgreSQL 中。主要的 Shard 数据库集群有 12个节点。
9 B" n$ X- w5 T7 G* V1 Q) l  O. J2 r+ F8 _; |# y
实践中发现 Amazon 的网络磁盘系统单位时间内寻道能力不行,所以有必要将数据尽量放到内存中。创建了软 RAID 以提升 IO 能力,使用的 Mdadm 工具进行 RAID 管理。. ~2 Z3 _0 Y8 I5 Q' @; P* `9 f- `* a
0 b) {* ^6 O& j) Y' i% l
管理内存中的数据,vmtouch 这个小工具值得推荐。/ s: F4 A$ n4 a8 n

/ j/ i- U+ }7 {' l. _, o/ PPostgreSQL 设置为 Master-Replica 方式,流复制模式。利用 EBS 的快照进行数据库备份。使用 XFS 文件系统,以便和快照服务充分配合。 使用 repmgr 这个小工具做 PostgreSQL 复制管理器器。
+ `+ R; X4 Z! E6 b1 F+ Q" R( ~+ a! w( v# I$ ^; |5 ~& V
连接池管理,用了 Pgbouncer。Christophe Pettus 的文章包含了不少 PostgreSQL 数据库的信息。
% T# P& l8 ^: e0 Y: T, n- U# J* h6 y+ D
- D5 i& b5 w. V" g3 N; {0 YTB 级别的海量图片存储在 Amazon S3 上,CDN 采用的也是 Amazon 的服务,CloudFront。. y( _8 K0 S. I+ C1 J* L
  w" U: f# ]5 \% U3 H: w3 y7 E
Instagram 也是 Redis 的重度用户,Feed 以及 Session 信息都用 Redis 处理,Redis 也是以 Master-Replica 方式部署。在 Replica 节点上进行数据备份。- u* E9 X9 B) L* f* ]

& g! Q1 E! i+ o 使用了 Apache Solr 承担 Geo-search API 的工作,Solr 简单的 JSON 接口也不错。6 C# @# b0 D3 S% q
+ S' V, i/ c1 H6 b; p
缓存使用了 6 个 Memcached 实例,库使用 pylibmc 和 libmemcached。亚马逊也提供缓存服务-Elastic Cache service ,Instagram 也有尝试,不过不便宜。4 p+ f) |  k% E- Y2 n
, z1 X- w: Z/ f
任务队列/发布通知
, n7 R% _; E( r/ b' I# Z% M1 o$ Y% \: G7 R2 |1 q4 P
队列服务使用 Gearman ,通知系统则使用 pyapns 来实现。
4 [* z4 i  d* B
* r* W! S/ m. Y7 ~! P' V 监控7 ^8 \. }( q, o( o& G
# f. {+ a/ l' G9 ?5 Y
前面提及的服务器实例数量加起来,的确有100多个,有效的监控是相当有必要的。使用 Munin 作为主要监控工具 , 也写了不少定制插件,外部监控用 Pingdom 的服务。通知服务使用PagerDuty。
- G+ C, z) ]7 @0 h3 G( r
7 D2 P8 \7 X0 a/ | 对于 Python 的错误报告,使用 Disqus 团队开源的 Sentry 来处理。
# i! ?1 u4 ]9 x  K6 r+ n
% G* X: r3 G0 Q- J. [/ t 几个感想
$ F/ f( }; |3 r8 U( E+ k% S
5 I! _) O. W$ k0)轻装上阵说起来容易,做起来非常难。这也是 Instagram 团队目前最令人着迷的地方;# D% f0 x5 n; ~4 r6 ^

+ x5 L" n8 ~2 N1 p4 D1)Python 社区已经足够成熟,各个环节上都已经有不错的解决方案了。9 N4 a; c% G$ d! v! Q
9 L8 x5 q1 C' I. a- d+ h  F
2)如果要问我最大的一个感慨,我要说:Amazon 真是一家伟大的公司,甚至比 Google 还伟大8 J* ^; d# G8 D6 _8 G


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

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

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

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

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