开启左侧

[转]Instagram 架构分析笔记

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

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

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

x
这是一篇旧文,值得一读, 就转来了:6 t) ^1 A; @5 Y) i" T5 l6 f% |# m7 A
# i. t: i5 \* H1 q) P& ^; ~# x" [
2012 年4月10日凌晨消息,Instagram 被 Facebook 以10亿美金收购。团队规模:13 人。2 v8 Q2 S8 p# N* }
( X/ z$ A( S$ M/ Z6 Q" \! }
Instagram 团队上个月才迎来第 7 名员工,是的,7个人的团队。作为 iPhone 上最火爆的图片类工具,instagram 用户数量已经超过 1400 万,图片数量超过 1.5 亿张。不得不说,这真他妈是个业界奇迹。% w& t/ c# t6 d- U' Z$ b

' V9 F  y% e) O) b 几天前,只有三个人的 Instagram 工程师团队发布了一篇文章:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,披露了 Instagram 架构的一些信息,足够勾起大多数人的好奇心。读罢做点笔记,各种线索还是有一定参考价值的。能打开原文的建议直接读原文。
( ~- F7 x$ @$ `
8 K# q" q( P0 _Instragram.png
  \$ Q& h$ T1 v; Y8 @
" \- D# h$ Q: z2 l9 B/ r: m0 s' Q Instagram 开发团队奉行的三个核心原则:
1 I- M. L" i; _2 ^. T, f( H. o9 X' Z
9 L& j7 t* s( D, ^    Keep it very simple (极简主义)
3 ^6 z7 S' y3 x# l1 v$ u5 E     Don't re-invent the wheel (不重复发明轮子)( b* @8 W/ V( x
     Go with proven and solid technologies when you can(能用就用靠谱的技术)
  B7 J3 b. R) n5 _6 [0 }: `- J; d# t+ l+ R4 M
OS/主机& f  S, p" H9 H
. E! r8 g0 A' s) w( s. d1 Y
操作系统的选择,在Amazon EC2上跑 Ubuntu Linux 11.04 (Natty Narwhal) ,这个版本经过验证在 EC2 上够稳定。因为只有三名工程师,只有三名工程师,所以自己部署机器到 IDC 是不靠谱的事情。幸好有亚马逊。( t) W* z+ n/ }- S0 y) ~0 p
: p9 \! Y# a! F" p  l
负载均衡
# X# F" c- x; c- I8 F" T& e
! Z9 J# ~% L; K1 e: |' \ 此前曾用过两台 Nginx 做 DNS 轮询承载前端请求,这样做会有副作用,现在已经迁移到Amazon的ELB(Elastic Load Balancer),起了三个 Nginx 实例,在 ELB 层停掉了 SSL , 以缓解 CPU 压力。DNS 服务使用 Amazon Route53 服务。8 N* l$ z8 K# K* n; ~

$ U8 t$ R  D3 h 应用服务器
9 s1 M! Q% o; Q* Y2 Q6 W# P6 @3 ?1 _* |! O7 Z" N0 x& w5 n2 ~8 z
启用了 25 个 Django 实例,运行在 High-CPU Extra-Large 类型的服务器实例上,之所以用 High-CPU Extra-Large 实例是因为应用请求是 CPU 密集型而非 IO 密集型。
2 @' \% d: C8 [$ @
: R+ P* _7 b7 Q) i( ^ 使用 Gunicorn 作为 WSGI 服务器。过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源。使用 Fabric 加速部署。) @, T% k* n. A

* R9 [; e& {# y 数据存储/ t/ h; _( \5 o( g: I
7 w9 a& r; _: a
用户信息、图片元数据、标签等大部分数据存储在 PostgreSQL 中。主要的 Shard 数据库集群有 12个节点。! s& z& D8 P4 J- d1 K

, r3 ~( d0 C: i7 k- o* p( @ 实践中发现 Amazon 的网络磁盘系统单位时间内寻道能力不行,所以有必要将数据尽量放到内存中。创建了软 RAID 以提升 IO 能力,使用的 Mdadm 工具进行 RAID 管理。4 F( d3 U/ X- N0 k7 n( z4 \
  o" y4 r1 w$ ~# ^( {! ?+ L) v
管理内存中的数据,vmtouch 这个小工具值得推荐。0 F2 ^, t1 `+ U3 q' _) B# v% }
. X& r1 a: x$ j! O* m" Y8 e
PostgreSQL 设置为 Master-Replica 方式,流复制模式。利用 EBS 的快照进行数据库备份。使用 XFS 文件系统,以便和快照服务充分配合。 使用 repmgr 这个小工具做 PostgreSQL 复制管理器器。
$ r/ C9 j& q+ m1 v2 d% N6 B2 k6 V2 i' N
连接池管理,用了 Pgbouncer。Christophe Pettus 的文章包含了不少 PostgreSQL 数据库的信息。- Z$ W. |" {3 S( S. E1 M$ J9 x

0 G. {# P" n' F/ E3 U/ _) \TB 级别的海量图片存储在 Amazon S3 上,CDN 采用的也是 Amazon 的服务,CloudFront。- o' H4 T. C# F, L7 y/ [

' B+ f3 i7 ~8 V; v( OInstagram 也是 Redis 的重度用户,Feed 以及 Session 信息都用 Redis 处理,Redis 也是以 Master-Replica 方式部署。在 Replica 节点上进行数据备份。0 q6 w: W5 f% h. ~8 H" ^( q
! V' s1 s0 Y1 K/ T
使用了 Apache Solr 承担 Geo-search API 的工作,Solr 简单的 JSON 接口也不错。8 X- y  d* g8 F! N- q

  f( c2 u/ F# J$ o9 q3 c 缓存使用了 6 个 Memcached 实例,库使用 pylibmc 和 libmemcached。亚马逊也提供缓存服务-Elastic Cache service ,Instagram 也有尝试,不过不便宜。
6 V3 s) w9 a' U5 ]9 V
0 {2 Z. o- f6 t# @9 Z' ~% X 任务队列/发布通知4 }6 U! M  p5 Y: _1 e

! U1 R: G: b, E; d0 c7 f, H: D' R 队列服务使用 Gearman ,通知系统则使用 pyapns 来实现。
& Y( m$ o$ y6 U& K8 I* n6 L) U) n
监控
! T9 ]) X; }  l+ {6 U  C3 |$ E) ]; d. `, @- b' A
前面提及的服务器实例数量加起来,的确有100多个,有效的监控是相当有必要的。使用 Munin 作为主要监控工具 , 也写了不少定制插件,外部监控用 Pingdom 的服务。通知服务使用PagerDuty。
1 K  K7 R% @, H' k+ H9 n) q% l& Q( l* `/ c' t
对于 Python 的错误报告,使用 Disqus 团队开源的 Sentry 来处理。5 S( Y+ j/ W* x* K% I" F+ h+ k+ s
. A3 U2 @$ o6 [! f% y9 k) w3 e
几个感想
* B* j5 z0 T, |3 y4 P2 c4 b
, U6 `  W. Q0 `$ f7 @$ z0)轻装上阵说起来容易,做起来非常难。这也是 Instagram 团队目前最令人着迷的地方;
3 |5 A2 `7 e4 h4 e) [1 ~
4 b3 L4 a+ }* D! T% w1)Python 社区已经足够成熟,各个环节上都已经有不错的解决方案了。
* f7 G5 Y. F+ O( D% l& n( I0 K% j: R
% k# `) J7 u7 I" Z) e+ w; v/ P; W2)如果要问我最大的一个感慨,我要说:Amazon 真是一家伟大的公司,甚至比 Google 还伟大
! P+ Q. t1 e( U0 T% f. ^

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

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

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

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

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