阅读更多

1顶
0踩

企业架构

转载新闻 LinkedIn架构进化简史

2015-07-24 11:23 by 副主编 mengyidan1988 评论(5) 有5405人浏览
LinkedIn创建于2003年,主要目标是连接你的个人人脉以得到更好的的工作机会。上线第一周只有2700个会员,之后几年,LinkedIn的产品、会员、服务器负载都增长非常快。
今天,LinkedIn全球用户已经超过3.5亿。我们每天每秒有上万个页面被访问,移动端流量已占到50%以上。所有这些接口请求都从后台获取,达到每秒上百万级。
那么,我们是怎么做到的呢?

早些年 - Leo
LinedIn开始跟很多网站一样,只有一台应用服务做了全部工作。这个应用我们给它取名叫“Leo”。它包含了所有的网站页面(JAVA Servlets),还包含了业务逻辑,同时连接了一个轻量的LinkedIn数据库。



哈!早年网站的形态-简单实用


会员图表
第一件要做的是管理会员与会员间的社交网络。我们需要一个系统来图形化遍历用户之间连接的数据,同时又驻留内存以达到有效和高性能。从这个不同的需求来看,很明显我们需要可以独立可扩展的Leo。一个独立的会员图示化系统,叫“云”的服务诞生了 - LinkedIn的第一个服务。为了让图表服务独立于Leo,我们使用了 Java RPC用来通讯。
也大概在这期间我们也有搜索服务的需求了,同时会员图表服务也在给搜索引擎-Lucene提供数据。

复制只读数据库
当站点继续增长,Leo也在增长,增加了角色和职责,同时自然也增加了复杂度。负载均衡的多实例Leo运转起来了。但新增的负载也影响了LinkedIn的其它关键系统,如会员信息数据库。
一个通常的解决方案是做垂直扩展 - 即增加更多的CPU和内存!虽然换取了时间,但我们以后还要扩展。会员信息数据库受理了读和写请求,为了扩展,一个复制的 从数据库 出现了,这个复制 从库, 是会员主库的一个拷贝,用早期的databus来保证数据的同步(现在开源了)。从库 接管了所有的读请求,同时添加了保证从库与主库一致的逻辑。



当 主-从 架构工作了一段时间后,我们转向了数据库分区
当网站开始看起来越来越多流量,我们的应用服务Leo在生产环境经常宕机,排查和恢复都很困难,发布新代码也很困难,高可用性对LinkedIn至关重要,很明显我们要“干掉”Leo,然后把它拆分成多个小功能块和无状态服务。

面向服务的架构 - SOA
工程师从分解负担API接口和业务逻辑的微服务开始,如搜索、个人信息、通讯及群组平台,然后是展示层分解,如招募功能和公共介绍页。新产品和新服务都放在Leo之外了,不久,每个功能区的垂直服务栈完成了。
我们构建了从不同域抓取数据模型的前端服务器,用于表现层展示,如生成HTML(通过JSPs)。我们还构建了中间层服务提供API接口访问数据模型及提供数据库一致性访问的后端数据服务。到2010年,我们已经有超过150个单独的服务,今天,我们已经有超过750个服务。



因为无状态,可以直接堆叠新服务实例及用硬件负载均衡实现扩展。我们给每个服务都画了警戒红线,以便知道它的负载,从而制定早期对策和性能监控。
缓存
LinkedIn可预见的增长,所以还需要进一步扩展。我们知道通过添加更多缓存可以减少集中压力的访问。很多应用开始使用如memcached/couchbase的中间层缓存,同时在数据层也加了缓存,某些场景开始使用useVoldemort提供预结果生成。
又过一了段时间,我们实际上去掉了很多中间层缓存,中间层缓存数据往往来自多个域,但缓存只是开始时对减少负载有用,但更新缓存的复杂度和生成图表变得更难于把控。保持缓存最接近数据层将降低潜在的不可控影响,同时还允许水平扩展,降低分析的负载。
Kafka
为了收集不断增长的数据,LinkedIn开始了很多自定义的数据管道来流化和队列化数据,例如,我们需要把数据保存到数据仓库、我们需要发送批量数据到Hadoop工作流以分析、我们从每个服务聚合了大量日志、我们跟踪了很多用户行为,如页面点击、我们需要队例化InMail消息服务、我们要保障当用户更新个人资料后搜索的数据是最新的等等。
当站点还在增长,更多定制化管道服务出现了,因网站需要可扩展,单独的管道也要可扩展,有些时候很难取舍。解决方案是使用kafka,我们的分布式发布-订阅消息平台。Kafka成为一个统一的管道服务,根据提交的日志生成摘要,同时一开始就很快速和具有可扩展性。它可以接近于实时的访问所有数据源,驱动了Hadoop任务,允许我们构建实时的分析,广泛的提升了我们站点监控和告警的能力,同时支持将调用可视化。今天,Kafka每天处理超过5亿个事件。



反转
扩展可从多个维度来衡量,包括组织结构。2011年晚些时候,LinkedIn内部开始一个创新,叫"反转"(Inversion)。我们暂停了新功能开发,允许所有的开发部门集中注意力提升工具和布署、基础架构及实用性开发。这对于今天敏捷开发新的可扩展性产品很有帮助。
近几年 - Rest.li
当我们从Leao转向面向服务的架构后,之前基于JAVA的RPC接口,在团队中已经开始分裂了,并且跟表现层绑得太死,这,只会变得更坏。为了搞定这个问题,我们开发了一套新的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资源和超过千亿级Rest.li调用。



Rest.li R2/D2 技术栈

超级块
面向服务的架构对于域解耦和服务独立扩展性很有帮助,但弊端是,大都我们的应用都需要很多不同类型的数据,按序会产品数百个延伸的调用。这就是通常说的“调用线路图”,或伴随着这么多延伸调用的“扇出”(fan-out)。例如,任何个人信息页都包含了远不止于相册、连接、群组、订阅、关注、博客、人脉维度、推荐这些。调用图表可能会很难管理,而且只会把事件搞得越来越不规则。
我们使用了"超级块"的概念 - 一个只有单一API接口的群组化后台服务。这样可以允许一个小组去优化一个“块”,同时保证每个客户端的调用情况可控。
多数据中心
作为一个会员快速增长的全球化公司,我们需要将数据中心进行扩展,我们努力了几年来解决这个问题,首先,从两个数据中心(洛杉矶 和 芝加哥)提供了公共个人信息,这表明,我们已经可以提供增强的服务用来数据复制、不同源的远程调用、单独数据复制事件、将用户分配到地理位置更近的数据中心。
我们大多的数据库运行在Espresso(一个新的内部多用户数据仓库)。Espresso支持多个数据中心,提供了 主-主 的支持,及支持复杂的数据复制。
多个数据中心对于高可用性具有不可思议的重要性,你要避免因单点故障不仅只导致某个服务失效,更要担心整个站点失效。今天,LinkedIn运行了3个主数据中心,同时还有全球化的PoPs服务。



我们还做了哪些工作?
当然,我们的扩展故事永远不止这么简单。我们的工程师和运维团队这些年做了不计其数的工作,主要包括这些大的初创性的:
这些年大多关键系统都有自己的丰富的扩展演化历史,包括会员图表服务(Leo之外的第一个服务),搜索(第二个服务),新闻种子,通讯平台及会员资料后台。
我们还构建了数据基础平台支持很长一段时间的增长,这是Databus和Kafka的第一次实战,后来用Samza做数据流服务,Espresso和Voldemort作存储解决方案,Pinot用来分析系统,以及其它自定义解决方案。另外,我们的工具也进步了,如工程师可自动化布署这些基础架构。
我们还使用Hadoop和Voldemort数据开发了大量的离线工作流,用以智能分析,如“你可能认识的人”,“相似经历”,“感觉兴趣的校友”及“个人简历浏览地图”。
我们重新考虑了前端的方法,加了客户端模板到混合页面(个人中心、我的大学页面),这样应用可以更加可交互,只要请求JSON或部分JSON数据。还有,模板页面通过CDN和浏览器缓存。我们也开始使用了BigPipe和Play框架,把我们的模型从线程化的服务器变成非阻塞异步的。
在代码之外,我们使用了Apache的多层代理和用HAProxy做负载均衡,数据中心,安全,智能路由,服务端渲染,等等。
最后,我们继续提升服务器的性能,包含优化硬件,内存和系统的高级优化,利用新的JRE。
下一步是什么
LinkedIn今天仍在快速增长,仍然有大量值得提升的工作要做,我们正在解决一些问题,看起来只解决了一部分 - 快来加入我们吧!

本文转自:译言网
  • 大小: 13.9 KB
  • 大小: 52.6 KB
  • 大小: 68.8 KB
  • 大小: 59.3 KB
  • 大小: 69.1 KB
  • 大小: 90.4 KB
来自: 译言网
1
0
评论 共 5 条 请登录后发表评论
5 楼 wcp88888888 2015-08-14 20:06
mark 学习中……
4 楼 silianbo 2015-07-26 09:36
mark
3 楼 Joey王 2015-07-24 17:01
mark 学习中
2 楼 Joey王 2015-07-24 17:01
mark 学习中
1 楼 Joey王 2015-07-24 17:01
mark 学习中

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • LinkedIn架构进化简史 Brief History Scaling Linkedin

    当网站开始看起来越来越多流量,我们的应用服务Leo在生产环境经常宕机,排查和恢复都很困难,发布新代码也很困难,高可用性对LinkedIn至关重要,很明显我们要“干掉”Leo,然后把它拆分成多个小功能块和无状态服务。...

  • 云计算二十年简史

    维基百科 [3]「万物简史」云计算进化史[OL].好奇心日报.2018.03.03 [4]中国云计算发展简史[OL].物联网人家.2019.09.01 [5]王坚播种,云计算成林[OL].锌财经.2019.11.24 [6]云计算极简史[OL].工程师与云.2019.08.12 ...

  • 架构学习资料精选

    架构师技术图谱,助你早日成为架构师 本项目是《码农周刊》架构学习资料精选,码农周刊团队官方出品。架构师必读,助你早日成为架构师! 架构师技术图谱包括:分布式、前端、大数据、存储、微服务、推荐系统、框架...

  • 云计算简史(完整版)

    因此,我们介绍云计算的发展简史,就必须要把关联技术域的发展也一并介绍。 云计算相关的技术领域 大数据(Big Data) 在大数据概念出现之前,数据存储、处理和分析的技术早已存在。随着存储成本的下降和云计算提供...

  • 图计算发展简史(2)

    图计算发展简史之完整目录: 一.图计算溯源 二.图论的早期应用场景 三.浅谈拓扑 四.从图到随机图理论的研究 五.关系型数据库和非关系型数据库 六.图计算与后关系型数据库时代 本文摘编于《图数据库原理、架构与应用...

  • 跟谁一起工作,到底有多重要?

    读完需要 9 ...不知道你有没有感受到,一个好的工作环境很重要。在适合自己的环境和...DBA菜鸟的进化简史:不忘初心,记工作中踩过的三个坑 美女主持直播,被突发意外打断!湾区网友却高喊: 我懂!超甜

  • 搜索、推荐、广告系统等人工智能优质技术资源最全整理

    前沿 文章目录前沿开源地址[算法学习资料: AI_Tutorial](https://github.com/cbamls/AI_Tutorial)开源相关LuceneSolrElasticLucidWorks中文...算法学习资料: AI_Tutorial 人工智能、AI架构、搜索系统、推荐系统...

  • 大数据与人工智能

    无论是专用还是通用领域,人工智能都将围绕“基础资源支持-AI技术-AI应用”这三层基本架构形成生态圈。 在专用领域的智能化阶段,有能力的企业都希望打通三层架构。他们有的将从上往下延伸,如苹果、海康威视、...

  • 主流分布式文件系统对比:区块链分布式技术引发云存储革命?HDFS,GFS,GPFS,FusionStorage,IPFS

    由于优势明显,Facebook,eBay,LinkedIn和Twitter都开始使用它来处理不断增长的应用程序数据,还被纽约时报用作大规模图像转换。       2006年,Hadoop的创始人将HDFS交给了Apache软件基金会。2012...

  • 从数据仓库到数据中台,终于有人说清楚了

    数据仓库简史提到数据中台,我们不得不从它的前辈数据仓库说起。数据仓库的概念可以追溯到20世纪80年代,当时IBM的研究人员提出了商业数据仓库的概念。本质上,数据仓库试图提供一种从操作型系统到决策支持环境的...

  • 文章目录(三周年)

    665 10.10 透过现象看本质:常见的前端架构风格和案例 664 10.09 Vue 3.0的源代码终于发布了 663 10.08 通过 Play Cloud 的 ART 优化配置提升应用性能 662 10.07 浅入深出的Copy和MutableCopy理解 661 10.06 QQ图标...

  • 行业规模的知识图谱——经验和挑战

    尽管许多挑战是所有企业共同面临的,但是,每个应用程序和产品目标的不同导致了不同的方法和系统架构,附表总结了这些知识图谱的性质。 Microsoft 多年以来,微软的工程师和科学家一直致力于大规模图谱的研究。这项...

  • 价值博客们,技术博客

    《浪潮之巅》:了解IT产业进化史,了解IT各大公司潮起潮落的好书,很大气,我很喜欢。 《白帽子讲web安全》:系统了解互联网安全,实战的好书。 《七周七语言:理解多种编程范型》 :了解几种编程范型的好书,有...

  • pendulum-2.1.2-cp39-cp39-win32.whl.rar

    python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。

  • Nginx配置文件中FastCGI相关参数理解

    Nginx配置文件中FastCGI相关参数理解

  • Pillow-8.4.0-cp310-cp310-win32.whl.rar

    python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。

  • yolo算法-刹车灯探测器数据集-1070张图像带标签-交通信号灯.zip

    yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值

  • pocketsphinx-0.1.15-cp36-cp36m-win32.whl.rar

    python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。

  • NI-VISA资源安装包

    Windows下2024Q4版本

  • 【java毕业设计】网上电子书店源码(ssm+mysql+说明文档+LW).zip

    功能说明: (a) 管理员;管理员使用本系统涉到的功能主要有主页、个人中心、用户管理、一级分类管理、二级分类管理、电子书管理、下单购买管理、我的书籍管理、留言反馈、系统管理等功能。 (b) 用户;用户进入系统可以实现首页、电子书、通知公告、留言反馈、个人中心、后台管理、在线客服等,登录注册后可以对主页、个人中心、下单购买管理、我的书籍管理、留言反馈等功能进行详细操作。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上 服务器:tomcat7及以上

Global site tag (gtag.js) - Google Analytics