北美网备份站
标题:
[转]Instagram 架构分析笔记
[打印本页]
作者:
小灵通
时间:
2015-10-13 14:40
标题:
[转]Instagram 架构分析笔记
这是一篇旧文,值得一读, 就转来了:
; C+ c- F4 k6 A( [7 Y2 c
7 |* Y+ O! H% I
2012 年4月10日凌晨消息,Instagram 被 Facebook 以10亿美金收购。团队规模:13 人。
- a% ]. e S+ F8 T, A$ c
' Q! U9 R( |! _% E, G
Instagram 团队上个月才迎来第 7 名员工,是的,7个人的团队。作为 iPhone 上最火爆的图片类工具,instagram 用户数量已经超过 1400 万,图片数量超过 1.5 亿张。不得不说,这真他妈是个业界奇迹。
7 m+ Y; [) l, H% g/ H# Y) Z* r5 c
0 h6 y1 S% S: h! e. J0 I: I
几天前,只有三个人的 Instagram 工程师团队发布了一篇文章:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,披露了 Instagram 架构的一些信息,足够勾起大多数人的好奇心。读罢做点笔记,各种线索还是有一定参考价值的。能打开原文的建议直接读原文。
/ _5 s2 w w/ T: r" l
7 M) [; n7 L# Z! `6 g
Instragram.png
, k) E( C, i6 D8 d
; b' l. z1 O( X8 j3 E2 Q! t6 p
Instagram 开发团队奉行的三个核心原则:
/ H2 G" b0 I" ]4 U9 Z- V5 P1 Z
$ Z, J- W* b1 M. l8 x( B9 G
Keep it very simple (极简主义)
# i) I) Q) \ C5 \6 T" i$ S
Don't re-invent the wheel (不重复发明轮子)
; r: B" S8 @; t0 B7 q
Go with proven and solid technologies when you can(能用就用靠谱的技术)
5 P9 X# Q; l3 M7 ]5 |
, F8 c2 O* ]5 y. s7 J6 ~
OS/主机
; T4 K# s- M% }5 Y
( D! g9 t& g9 q7 C8 R, N4 B
操作系统的选择,在Amazon EC2上跑 Ubuntu Linux 11.04 (Natty Narwhal) ,这个版本经过验证在 EC2 上够稳定。因为只有三名工程师,只有三名工程师,所以自己部署机器到 IDC 是不靠谱的事情。幸好有亚马逊。
, f8 _2 t8 {* C* p! O3 J6 D
$ t: y' \) C. T4 w& ?
负载均衡
- i2 |, a5 O" z
# X& u$ G# f; p+ Y, Q, {
此前曾用过两台 Nginx 做 DNS 轮询承载前端请求,这样做会有副作用,现在已经迁移到Amazon的ELB(Elastic Load Balancer),起了三个 Nginx 实例,在 ELB 层停掉了 SSL , 以缓解 CPU 压力。DNS 服务使用 Amazon Route53 服务。
7 v: D! @. H7 k) }, G8 O6 h; j& C
7 B/ G$ {. Y% ^ M+ c
应用服务器
- O( z" A/ _9 R
q, q' D- E5 z) \5 A
启用了 25 个 Django 实例,运行在 High-CPU Extra-Large 类型的服务器实例上,之所以用 High-CPU Extra-Large 实例是因为应用请求是 CPU 密集型而非 IO 密集型。
7 n7 K2 n& z; r" A6 C( z o7 Y* ?
% }9 t+ T( s" l
使用 Gunicorn 作为 WSGI 服务器。过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源。使用 Fabric 加速部署。
% D; g# q$ g$ ?$ w7 n7 [. _2 b+ X
; U, I/ i# z7 R |; `* i
数据存储
- q q9 V/ Y5 @' }7 Z$ f
/ n, m) _9 y& {4 I# n+ z, i
用户信息、图片元数据、标签等大部分数据存储在 PostgreSQL 中。主要的 Shard 数据库集群有 12个节点。
7 Z5 h4 S1 d9 d' Q
! P4 m1 H5 d& k- J/ K) R
实践中发现 Amazon 的网络磁盘系统单位时间内寻道能力不行,所以有必要将数据尽量放到内存中。创建了软 RAID 以提升 IO 能力,使用的 Mdadm 工具进行 RAID 管理。
7 V" I9 M' Q) G1 H
) v& ?: l3 D& S+ h, I* b( Q
管理内存中的数据,vmtouch 这个小工具值得推荐。
! m) @7 C4 h6 r+ H
1 {% E1 b( {6 ]5 R: i. w7 ~! b! f9 L
PostgreSQL 设置为 Master-Replica 方式,流复制模式。利用 EBS 的快照进行数据库备份。使用 XFS 文件系统,以便和快照服务充分配合。 使用 repmgr 这个小工具做 PostgreSQL 复制管理器器。
+ x$ K9 N" T# @" e8 _; W# T, V
* ?+ {0 M: v8 k9 }, b
连接池管理,用了 Pgbouncer。Christophe Pettus 的文章包含了不少 PostgreSQL 数据库的信息。
4 M/ j' N: u0 o) ~4 F6 h; ~
. T6 v2 b4 Q- J9 F6 q7 |
TB 级别的海量图片存储在 Amazon S3 上,CDN 采用的也是 Amazon 的服务,CloudFront。
3 a- o( E+ u5 t* T( Y0 [* G
9 g, W+ @( S% h4 E, K
Instagram 也是 Redis 的重度用户,Feed 以及 Session 信息都用 Redis 处理,Redis 也是以 Master-Replica 方式部署。在 Replica 节点上进行数据备份。
: o% Z1 n2 A! i
* |' I0 _1 ?! }' v8 B
使用了 Apache Solr 承担 Geo-search API 的工作,Solr 简单的 JSON 接口也不错。
, J2 l& o" q# D m4 {& |' N
: t4 ~& l- `% @! O, F/ S
缓存使用了 6 个 Memcached 实例,库使用 pylibmc 和 libmemcached。亚马逊也提供缓存服务-Elastic Cache service ,Instagram 也有尝试,不过不便宜。
4 g& T( e4 D: U$ ]2 {: f
6 c* t k- ^0 i- V6 ^
任务队列/发布通知
8 b1 ~/ y8 n) A9 R0 h7 T' ^" f
1 A( d$ y; Y( |# u! U# U
队列服务使用 Gearman ,通知系统则使用 pyapns 来实现。
' h5 q. S; A( {% o2 D4 _% r
0 F+ {' ]0 R: Y9 L9 Z4 a1 e
监控
# x( D1 k9 l# g; _0 e
8 m5 V1 p' V4 ^/ L9 O' u8 i3 |
前面提及的服务器实例数量加起来,的确有100多个,有效的监控是相当有必要的。使用 Munin 作为主要监控工具 , 也写了不少定制插件,外部监控用 Pingdom 的服务。通知服务使用PagerDuty。
" S9 u% T. ?; O3 u6 o: o
. O2 f& [4 v/ m1 a3 t- y* g1 j
对于 Python 的错误报告,使用 Disqus 团队开源的 Sentry 来处理。
) I. o. w) p- h
% P0 x3 n. b9 Y3 A! m- \
几个感想
; P: b; ?' j, l. K
6 t3 X. {% m+ I7 k7 F0 H
0)轻装上阵说起来容易,做起来非常难。这也是 Instagram 团队目前最令人着迷的地方;
, k. d( {1 g0 x, D z( Y
8 o& p$ H+ R! z3 @: Y
1)Python 社区已经足够成熟,各个环节上都已经有不错的解决方案了。
8 l$ m; [6 `) F; W8 p- G8 k6 @. K
5 s' w) J3 X4 ^% B; r$ O
2)如果要问我最大的一个感慨,我要说:Amazon 真是一家伟大的公司,甚至比 Google 还伟大
: f, m+ @5 m" @" ^" Q% s) y
欢迎光临 北美网备份站 (http://beimeilife.duckdns.org/)
Powered by Discuz! X3.2