会根据其运行状况进行切换。
每条请求都会首先到达负载均衡器,然后被定向至真正的应用服务器。
2.后端
会话:经过负载均衡器处理后,请求被传送至应用服务器,该服务器包含了处理请求的核心逻辑。
instagram 的应用服务器是基于 django 并使用 python 语言编写,而 gunicorn 则作为其 wsgi 服务器。补充说明,wsgi(web server gateway interface,web 服务器网关接口)是一个协议,负责将请求从 web 服务器转发到 web 应用程序。
instagram 采用 fabric 工具,在多个实例上并行地执行命令,从而能够在几秒内迅速部署代码。
这些服务器共同运行在 25 台以上的 amazon high-cpu extra-large 机型上。因为这些服务器是无状态的,所以面对更多请求时,可以灵活地增加更多机器来扩展处理能力。
1)常规数据存储
会话:应用服务器发现请求需要主要的动态数据。它可能需要以下信息:
- 最近相关的照片 id
- 对应这些照片 id 的实际照片
- 这些照片的用户数据
2)数据库:postgres
会话:应用服务器从 postgres 中提取最新相关的照片 id。
应用服务器从 postgresql 数据库中提取数据,其中包括大部分 instagram 的数据,例如用户和照片的元数据。
instagram 使用 pgbouncer 对 postgres 和 django 之间的连接进行池化。
鉴于每秒收取的数据量超过 25 张照片和 90 个赞,instagram 采用了数据分片技术,利用代码将数千个 “逻辑” 分片映射到数个物理分片。
instagram 成功解决了一个有趣的挑战:如何生成可以按时间排序的 id。最终的 id 格式如下:
- 41 位用于毫秒级时间(这为我们提供了 41 年的 id 空间)
- 13 位代表逻辑分片 id
- 10 位代表自增序列,模为 1024,意味着我们每毫秒可以为每个分片生成 1024 个 id
借助postgres 中可按时间排序的 id,应用服务器能够成功获取最新相关的照片 id。
3)照片存储:s3 和 cloudfront
会话:随后,应用服务器使用快速的 cdn 链接,获取与那些照片 id 匹配的实际照片,确保用户快速加载。
数以 tb 计的照片被存储在 amazon s3 中,并通过 amazon cloudfront 快速地提供给用户。
4)缓存:redis 和 memcached
会话:为了从 postgres 中获取用户数据,应用服务器(django)使用 redis 将照片 id 与用户 id 相匹配。
instagram 用 redis 存储了大约 3 亿张照片到用户 id 的映射,以确定在获取主要动态或其他动态时应查询哪个数据分片。为减少延迟,整个 redis 都存储在内存中,并在多个机器上进行了分片。
利用精妙的哈希技术,instagram 只需不到 5gb 的空间就可以存储 3 亿个键映射。
这个照片 id 到用户 id 的键值映射,用于确定应查询哪个 postgres 分片。
会话:得益于 memcached 的高效缓存,从 postgres 获取的用户数据非常迅速,因为最近相应已被缓存。
对于常规缓存需求,instagram 使用了 memcached,并拥有 6 个 memcached 实例,能够在 django 上较为简单地进行分层。
有趣的是,在两年后的 2013 年,facebook 发布了一篇论文,描述了他们如何扩展 memcached 以应对每秒数十亿的请求。
会话:现在,用户可以看到其凯发k8国际首页登录首页动态,其中填充了他关注的人的最新图片。
5)主 - 从架构
postgres 和 redis 都采用了主 - 从架构,并使用 amazon ebs(弹性块存储)进行频繁的系统备份。
二、推送通知与异步任务
会话:现在,假设用户关闭了应用,但随后收到了一个推送通知,告知他的朋友上传了一张新照片。
这个推送通知是通过 pyapns 发送的。至今,instagram 已经通过它发送了超过十亿的推送通知。pyapns 是一个开源的,用于 apple push notification service(apns)的通用提供器。
会话:用户非常喜欢这张照片!因此,他决定将其分享至 twitter。
在后端,这项任务被推送至 gearman,这是一个任务队列系统,可以将任务分派给更加合适的机器来处理。instagram 拥有约 200 个 python 工作进程来处理 gearman 的任务队列。
gearman 被用于处理多种异步任务,例如将活动(例如新发布的图片)推送给用户的所有粉丝(这个功能叫做“扇出fanout”)。
三、监控
情景:糟糕!instagram 应用程序因服务器出错而崩溃,这导致了一个错误的响应被发送出去。三位 instagram 的工程师立刻收到了报警。
instagram 采用了开源的django 应用 sentry,实时追踪 python 的错误。
munin 用于对整个系统的指标进行绘图并发出异常警告。instagram 还定制了许多 munin 的插件,以便追踪应用级的指标,如每秒上传的照片数。
pingdom 用于监控外部服务,pagerduty用于应对意外情况和通知发布。
四、架构总览
编译丨分布式实验室(id:distributedlab)
来源丨engineercodex.substack.com/p/how-instagram-scaled-to-14-million
dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn
直播预告丨b站大数据体系建设的技术选型与落地实践
dbaplus社群携手哔哩哔哩四位大数据专家,围绕“b站大数据体系建设的技术选型与落地实践”这一主题开展线上直播分享,针对离线平台、流式数据集成、olap、数据治理等议题进行深入探讨,给大家提供企业级大数据体系建设管理经验参考。
- 观看方式:线上直播间/dbaplus社群视频号
- 直播日期:2023年10月13日(周五)
- 直播时间:14:30-17:30
- 直播地址:z-mz.cn/7jklc
最新活动丨xcops智能运维管理人年会
报名地址:bagevent.com/event/8385364?bag_track=sh返回搜狐,查看更多
责任编辑: