LinkedIn 互联网架构扩展简史

LinkedIn成立于 2003 年,其目标是连接到您的网络以获得更好的工作机会。第一周只有 2,700 名会员。时间快进了很多年,LinkedIn 的产品组合、会员基础和服务器负载都取得了巨大的增长。

如今,LinkedIn 在全球运营,拥有超过 3.5 亿会员。我们每天每秒都会提供数以万计的网页。我们已经进入了移动时代,移动流量占全球流量的 50% 以上。所有这些请求都从我们的后端系统获取数据,而后端系统每秒处理数百万个查询。

那么,我们是如何到达那里的呢?

多年以前

就像今天许多网站一样,LinkedIn 最初是作为一个单一的整体应用程序完成这一切的。这个应用程序被称为 Leo。它托管所有不同页面的 Web servlet、处理业务逻辑并连接到一些 LinkedIn 数据库。

90e54f75584e23ccbdb876af79169eee.png
啊,网站开发的美好时光 - 美好而简单

成员图

作为社交网络要做的第一件事就是管理成员之间的连接。我们需要一个使用图形遍历查询连接数据并驻留在内存中的系统,以实现最高的效率和性能。由于这种不同的使用情况,很明显它需要独立于 Leo 进行扩展,因此我们的会员图表的一个名为 Cloud 的独立系统诞生了 - LinkedIn 的第一个服务。为了使该图服务与 Leo 分开,我们使用 Java RPC 进行通信。

大约在这个时候我们需要搜索功能。我们的会员图服务开始将数据输入到运行Lucene 的新搜索服务中。

副本读取数据库

随着网站的发展,Leo 也在不断发展,其角色和责任也不断增加,自然也增加了其复杂性。当多个 Leo 实例启动时,负载平衡很有帮助。但增加的负载给 LinkedIn 最关键的系统——其会员资料数据库带来了负担。

我们所做的一个简单的修复是经典的垂直扩展 - 投入更多的 CPU 和内存!虽然这赢得了一些时间,但我们需要进一步扩大规模。配置文件数据库同时处理读取和写入流量,因此为了扩展,引入了副本从属数据库。副本数据库是成员数据库的副本,使用最早版本的数据总线(现已开源)保持同步。它们被设置为处理所有读取流量,并构建逻辑来了解何时从副本读取相对于主主数据库是安全(一致)的。

aeed18058749276afa8482e711572572.png
* 虽然主从模型是中期解决方案,但我们已经转向分区数据库

随着网站的流量开始增加,我们的单一整体应用程序 Leo 经常在生产中出现故障,很难排除故障和恢复,也很难发布新代码。高可用性对于 LinkedIn 至关重要。很明显,我们需要“杀死 Leo”并将其分解为许多小型的功能性和无状态服务。

1db37c5c322a2a8137778af6d4116064.png
“杀死利奥”多年来一直是公司内部的口头禅……

面向服务的架构

工程部门开始提取微服务来保存 API 和业务逻辑,例如我们的搜索、个人资料、通信和群组平台。后来,我们的表示层被提取用于招聘人员产品或公共档案等领域。对于新产品,全新服务是在 Leo 之外创建的。随着时间的推移,每个功能区域都出现了垂直堆栈。

我们构建了前端服务器来从不同域获取数据模型、处理表示逻辑并构建 HTML(通过 JSP)。我们构建了中间层服务来提供对数据模型的 API 访问,并构建后端数据服务来提供对其数据库的一致访问。到 2010 年,我们已经拥有 150 多个独立服务。如今,我们拥有超过 750 项服务。

3537322fcbb43401b79c6f7d298fcf7e.png
LinkedIn 中面向服务的多层架构示例

由于无状态,可以通过启动任何服务的新实例并在它们之间使用硬件负载平衡器来实现扩展。我们积极开始对每个服务进行红线调整,以了解它可以承受多少负载,并构建了早期配置和性能监控功能。

缓存

LinkedIn 正在经历高速增长,需要进一步扩大规模。我们知道可以通过添加更多层缓存来完全减少负载。许多应用程序开始引入中间层缓存层,例如memcache或couchbase。我们还在数据层中添加了缓存,并在适当的时候开始使用带有预先计算结果的Voldemort。

随着时间的推移,我们实际上删除了许多中间层缓存。中间层缓存存储来自多个域的派生数据。虽然缓存一开始看起来是一种减少负载的简单方法,但失效和调用图的复杂性却变得失控。使缓存尽可能靠近数据存储可以保持较低的延迟,使我们能够水平扩展并减少认知负载。

Kafka

为了收集不断增长的数据量,LinkedIn 开发了许多用于流式传输和排队数据的自定义数据管道。例如,我们需要将数据流入数据仓库,我们需要将批量数据发送到我们的Hadoop 工作流程中进行分析,我们收集并聚合每个服务的日志,我们收集页面浏览量等跟踪事件,我们需要对 inMail 消息进行排队系统,每当有人更新个人资料时,我们都需要使我们的人员搜索系统保持最新状态。

随着网站的发展,更多的定制管道出现了。随着站点需要扩展,每个单独的管道也需要扩展。必须付出一些东西。结果是我们的分布式发布-订阅消息平台Kafka的开发。Kafka 成为一个通用管道,围绕提交日志的概念构建,并且在构建时考虑了速度和可扩展性。它使我们能够近乎实时地访问任何数据源,增强我们的 Hadoop 作业能力,使我们能够构建实时分析,极大地提高我们的站点监控和警报能力,并使我们能够可视化和跟踪我们的调用图。如今,Kafka每天处理超过5000 亿个事件。

9691b0c7ccc76d7b4f5e6bc20575fae4.png
Kafka 作为通用数据流代理

反转

规模化可以从多个维度来衡量,包括组织。2011 年底,LinkedIn 启动了一项名为Inversion的内部计划。这一举措暂停了功能开发,使整个工程组织能够专注于改进工具和部署、基础设施和开发人员的生产力。它成功地实现了我们构建当今可扩展新产品所需的工程敏捷性。

近代

当我们从 Leo 转型为面向服务的架构时,我们提取的 API 假设是基于 Java 的 RPC,跨团队不一致,与表示层紧密耦合,而且情况只会变得更糟。为了解决这个问题,我们构建了一个名为Rest.li的新 API 模型。Rest.li 是我们向以数据模型为中心的架构迈进的一步,它确保了整个公司一致的无状态 Restful API 模型。

通过使用 HTTP 上的 JSON,我们的新 API 最终使非基于 Java 的客户端变得容易。今天的 LinkedIn 仍然主要是一家 Java 商店,但也有许多使用 Python、Ruby、Node.js 和 C++ 的客户,这些都是内部开发的以及我们收购的技术堆栈。远离 RPC 还使我们摆脱了与表示层的高耦合和许多向后兼容性问题。另外,通过将动态发现 (D2)与 Rest.li 结合使用,我们获得了每个服务 API 的基于自动化客户端的负载平衡、发现和可扩展性。

如今,LinkedIn 在我们的所有数据中心拥有超过 975 个 Rest.li 资源,每天有超过 1000 亿次 Rest.li 调用。

421fd6b09cc3565f63e68549af32ea9a.png
Rest.li R2/D2 技术堆栈

超级积木

面向服务的架构可以很好地解耦域并独立扩展服务。但也有缺点。我们的许多应用程序获取多种类型的不同数据,进而进行数百个下游调用。在考虑所有许多下游调用时,这通常称为“调用图”或“扇出”。例如,任何个人资料页面请求获取的不仅仅是个人资料数据,还包括照片、连接、群组、订阅信息、关注信息、长篇博客文章、图表中的连接度、推荐等。此调用图可能难以管理并且变得越来越不守规矩。

我们引入了超级块的概念 - 具有单一访问 API 的后端服务分组。这使我们能够让特定的团队优化该块,同时检查每个客户端的调用图。

多数据中心

作为一家会员数量快速增长的跨国公司,我们需要扩大规模,超越从一个数据中心提供流量服务的范围。我们几年前就开始努力解决这个问题,首先是通过两个数据中心(洛杉矶和芝加哥)提供公共资料。一旦经过验证,我们就开始增强我们的所有服务,以处理数据复制、来自不同来源的回调、单向数据复制事件以及将用户固定到地理位置接近的数据中心。

我们的许多数据库都在Espresso(一种新的内部多租户数据存储)上运行。Espresso 在构建时就考虑到了多数据中心。它提供主/主支持并处理许多困难的复制。

多个数据中心对于维持“站点正常运行”和高可用性非常重要。您不仅需要避免每个单独服务的任何单点故障,还需要避免整个站点的任何单点故障。如今,LinkedIn 拥有三个主要数据中心,并在全球各地设有其他PoP 。

53bd1b63888368070f3f6741cd9b2464.png
LinkedIn 截至 2015 年的运营设置(圆圈代表数据中心,菱形代表 PoP)

我们还做了什么?

当然,我们的扩展故事从来没有这么简单。多年来,我们在所有工程和运营团队中做了无数的事情,其中包括一些更大的举措:

我们的许多最关键的系统都有自己丰富的历史和多年来解决规模问题的演变。这包括我们的会员图表服务(我们在 Leo 之外的第一项服务)、搜索(我们的第二项服务)、新闻源、通信平台和会员资料后端。

我们构建了能够实现长期增长的数据基础设施。这首先在 Databus 和 Kafka 中表现得很明显,然后在用于数据流的Samza 、用于存储解决方案的Espresso和 Voldemort、用于我们的分析系统的Pinot以及其他定制解决方案中得到延续。另外,我们的工具已经改进,开发人员可以自动配置此基础设施。

我们使用Hadoop和Voldemort 数据存储开发了一个大规模的离线工作流程,以预先计算数据见解,例如您可能认识的人、相似的个人资料、著名校友和个人资料浏览地图。

我们重新考虑了我们的前端方法,将客户端模板添加到组合中(个人资料页面、大学页面)。这使得应用程序的交互性更强,要求我们的服务器仅发送 JSON 或部分 JSON。另外,模板会缓存在 CDN 和浏览器中。我们还开始使用BigPipe和Play 框架,将我们的模型从线程 Web 服务器更改为非阻塞异步模型。

除了应用程序代码之外,我们还使用 Apache Traffic Server 和 HAProxy 引入了多层代理来处理负载平衡、数据中心固定、安全性、智能路由、服务器端渲染等。

最后,我们通过优化硬件、高级内存和系统调整以及利用更新的 Java 运行时,继续提高服务器的性能。

下一步是什么

LinkedIn 继续快速发展,我们仍有大量工作可以改进。我们正在解决很少有人能够解决的问题。


随手关注或者”在看“,诚挚感谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/776511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fuzzywuzzy,一个好用的 Python 库!

目录 前言 安装 基本功能 1. 字符串相似度比较 2. 模糊匹配与排序 实际应用场景 1. 数据清洗 2. 文本匹配与搜索 3. 搜索引擎优化 总结 前言 大家好,今天为大家分享一个好用的 Python 库 - fuzzywuzzy Github地址:https://github.com/seatgeek/fu…

企业如何乘上跨境电商的风口?

近年来,国内跨境电商成为内贸外贸发展的一个亮点,国家工作会议也提出:“要加快培育外贸新动能,巩固外贸外资基本盘,拓展中间品贸易、服务贸易、数字贸易、跨境电商出口”。多因素推动下,使得跨境电商成为我…

使用pytorch构建一个无监督的深度卷积GAN网络模型

本文为此系列的第二篇DCGAN,上一篇为初级的GAN。普通GAN有训练不稳定、容易陷入局部最优等问题,DCGAN相对于普通GAN的优点是能够生成更加逼真、清晰的图像。 因为DCGAN是在GAN的基础上的改造,所以本篇只针对GAN的改造点进行讲解,其…

Python算法100例-4.6 歌星大奖赛

完整源代码项目地址,关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序6.问题拓展7.知识点补充 1.问题描述 在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1~100分。选手最…

Spring Cloud+Spring Alibaba笔记

Spring CloudSpring Alibaba 文章目录 Spring CloudSpring AlibabaNacos服务发现配置中心 OpenFeign超时机制开启httpclient5重试机制开启日志 SeataSentinel流量控制熔断降级热点控制规则持久化集成 OpenFeign集成 Gateway MicrometerZipKinGateway路由断言过滤器 Nacos 服务…

TikTok养号保姆级教程:学好这9招,你就是流量宠儿!

01 什么是养号? 在回答这个问题之前,我们首先要明白Tiktok智能推荐机制,也就是著名TikTok算法。 每个创作者发布视频时,TikTok都会根据视频内容、视频发布地区、标题内容进行特征识别,来判断视频可能会有哪些人群喜欢…

鱼哥赠书活动第14期:看完这本《数字化运维》掌握数字化运维方法,构建数字化运维体系

鱼哥赠书活动第14期:看完这本《数字化运维》掌握数字化运维方法,构建数字化运维体系 主要内容:读者对象:赠书抽奖规则:往期赠书福利: 数字化转型已经成为大势所趋,各行各业正朝着数字化方向转型&#xff0c…

SpringBoot3集成PostgreSQL

标签:PostgreSQL.Druid.Mybatis.Plus; 一、简介 PostgreSQL是一个功能强大的开源数据库系统,具有可靠性、稳定性、数据一致性等特点,且可以运行在所有主流操作系统上,包括Linux、Unix、Windows等。 通过官方文档可以…

MySQL数据库高级语句

文章目录 MySQL高级语句older by 排序区间判断查询或与且(or 与and)嵌套查询(多条件)查询不重复记录distinctcount 计数限制结果条目limit别名as常用通配符嵌套查询(子查询)同表不同表嵌套查询还能用于删除…

C语言例4-36:求Fibonacci数列的前40个数

教材优化代码如下&#xff1a; //求Fibonacci数列的前40个数 #include<stdio.h> int main(void) {long int f11,f21;int i1;for(;i<20;i){printf("%15ld%15ld",f1,f2);if(i%20)printf("\n");f1f2;f2f1;}return 0; } 结果如下&#xff1a; 我的基…

IC-随便记

1、移远通信---通信模组 物联网解决方案供应商&#xff0c;可提供完备的IoT产品和服务&#xff0c;涵盖蜂窝模组(5G/4G/3G/2G/LPWA)、车载前装模组、智能模组&#xff08;5G/4G/边缘计算&#xff09;、短距离通信模组(Wi-Fi&BT)、GNSS定位模组、卫星通信模组、天线等硬件产…

Radio Silence for mac 好用的防火墙软件

Radio Silence for Mac是一款功能强大的网络防火墙软件&#xff0c;专为Mac用户设计&#xff0c;旨在保护用户的隐私和网络安全。它具备实时网络监视和控制功能&#xff0c;可以精确显示每个网络连接的状态&#xff0c;让用户轻松掌握网络活动情况。 软件下载&#xff1a;Radio…

DNS 服务 Unbound 部署最佳实践

文章目录 安装unbound-control配置启动服务测试 参考&#xff1a; 官网地址&#xff1a;https://nlnetlabs.nl/projects/unbound/about/ 详细文档&#xff1a;https://unbound.docs.nlnetlabs.nl/en/latest/index.html DNS服务Unbound部署于使用 https://cloud.tencent.com/…

Redis项目实战

本文用用代码演示Redis实现分布式缓存、分布式锁、接口幂等性、接口防刷的功能。 课程地址&#xff1a;Redis实战系列-课程大纲_哔哩哔哩_bilibili 目录 一. 新建springBoot项目整合Redis 二. Redis实现分布式缓存 2.1 原理及好处 2.2 数据准备 2.3 Redis实现分布式缓存…

知行之桥EDI系统功能介绍——FlatFile 端口介绍

FlatFile 端口能够实现平面文件与XML文件的互相转换。 每个 Flat File 端口配置一个特定的平面文件格式&#xff0c;从而实现与 XML 格式的互相转换。Flat File 端口有两个主要的模式&#xff1a; Position DelimitedCharacter Delimited 对于 Position Delimited 平面文件&a…

【Git篇】复习git

文章目录 &#x1f354;什么是git⭐git和svn的区别 &#x1f354;搭建本地仓库&#x1f354;克隆远程仓库&#x1f6f8;git常用命令 &#x1f354;什么是git Git是一种分布式版本控制系统&#xff0c;它可以追踪文件的变化、协调多人在同一个项目上的工作、恢复文件的旧版本等…

在宝塔面板中,为自己的云服务器安装SSL证书,为所搭建的网站启用https(主要部分攻略)

前提条件 My HTTP website is running Nginx on Debian 10&#xff08;或者11&#xff09; 时间&#xff1a;2024-3-28 16:25:52 你的网站部署在Debain 10&#xff08;或者11&#xff09;的 Nginx上 安装单域名证书&#xff08;默认&#xff09;&#xff08;非泛域名&#xf…

现在做抖音小店都需要准备什么?需要什么条件?门槛很高吗?

大家好&#xff0c;我是电商花花。 自从抖音小店这个项目做的人越来越多&#xff0c;很多人都想赶上抖音小店这个红利项目&#xff0c;但是很多新手在刚开始接触这个项目时候因为不懂&#xff0c;开始频频踩雷&#xff0c;不得不关店重新再来。 我们今天汇总了一下抖音小店的…

OSCP靶场--image

OSCP靶场–image 考点(CVE-2023-34152 suid strace提权) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap -Pn -sC -sV 192.168.178.178 --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-27 23:43 EDT Nmap scan report for 192.168.178.17…