阅读更多

1顶
0踩

企业架构

转载新闻 LinkedIn架构进化简史

2015-07-24 11:23 by 副主编 mengyidan1988 评论(5) 有5451人浏览
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安全》:系统了解互联网安全,实战的好书。 《七周七语言:理解多种编程范型》 :了解几种编程范型的好书,有...

  • COMSOL模拟碳酸钙岩石与盐酸反应的随机孔隙酸化路径及布林克曼流动形成的分形结构

    内容概要:本文详细介绍了利用COMSOL软件模拟碳酸钙(CaCO3)在岩石中与盐酸(HCl)反应过程中产生的随机孔隙酸化路径及其形成的布林克曼流动。首先,通过蒙特卡洛方法生成随机孔隙分布,模拟真实岩石内部复杂的孔隙结构。接着,采用布林克曼方程处理多孔介质中的粘性力和渗透流动,并引入化学反应模块,模拟CaCO3与HCl之间的化学反应。随着模拟的进行,酸液流动路径逐渐形成类似雪花状的分形结构,展示了流动与溶解之间的动态博弈。最后,通过自适应网格技术和粒子追踪功能,精确捕捉并可视化这些精美的分形图案。 适合人群:从事地质工程、材料科学、化学工程等领域研究的专业人士,以及对多孔介质传输现象感兴趣的科研工作者。 使用场景及目标:适用于研究多孔介质内的化学反应和流体流动特性,特别是对于优化石油开采中的酸化压裂工艺具有重要指导意义。 其他说明:文中提供了详细的MATLAB和COMSOL代码片段,帮助读者理解和重现模拟过程。此外,强调了随机性和确定性在微观尺度上的相互作用,揭示了自然界深层次的规律。

  • 基于滑模控制的永磁同步电机直接转矩控制仿真建模与实现

    内容概要:本文详细介绍了将滑模控制(SMC)应用于永磁同步电机(PMSM)直接转矩控制(DTC)的技术细节。首先解释了转矩和磁链误差计算方法,接着探讨了滑模面的设计及其对系统抖振的影响。文中还提供了扇区矢量选择的具体实现方式,并深入讨论了磁链观测器的改进措施。此外,文章分析了滑模控制器的设计要点以及仿真过程中需要注意的关键参数配置。通过对比传统PI控制,验证了滑模控制在提高系统鲁棒性和快速响应方面的优势。 适合人群:从事电机控制系统研究的专业人士,尤其是对永磁同步电机直接转矩控制感兴趣的科研工作者和技术人员。 使用场景及目标:适用于希望深入了解并掌握滑模控制理论及其在PMSM-DTC应用中的具体实现方法的研究人员。目标是在实际项目中能够运用滑模控制提升系统的稳定性和性能。 其他说明:文中提供的MATLAB/Simulink代码片段有助于读者更好地理解和复现实验结果。同时提醒读者关注一些常见的陷阱,如参数选择不当可能导致的问题。

  • 北京大学网络安全工作人员管理规定:涵盖人员职责、聘用、转岗离岗、教育培训及第三方管理

    内容概要:本文详细介绍了北京大学针对网络安全工作人员的管理规定,旨在加强网络安全管理和明确不同角色的责任。全文分为九章,涵盖了网络安全工作人员及其职责、聘用管理、转岗和离岗管理、教育培训、第三方人员管理及奖惩措施等方面的内容。重点在于明确各级单位和人员的具体职责,确保网络安全制度的有效执行,并强调了对第三方人员的严格管控和保密要求。 适合人群:适用于高校网络安全管理人员及相关技术人员,尤其是北京大学及其下属单位的网络安全工作者。 使用场景及目标:①帮助高校建立健全网络安全管理体系;②指导网络安全工作人员明确自身职责,提高工作效率;③规范第三方人员的访问和操作,降低安全风险。 其他说明:本文还提供了多个附件,如网络安全承诺书、访问申请表和保密协议模板,便于实际操作和管理。

  • 网络设备市场现状与发展趋势分析(2024-2030年)-技术革新与智能化应用

    内容概要:本文深入探讨了中国网络设备市场的现状及其未来发展潜力。首先介绍了网络设备的基本概念及其作为现代通信网络基础设施的重要地位,随后分析了当前市场面临的挑战和技术进步带来的机遇。文中特别强调了5G、物联网、云计算等新兴技术对网络设备性能和安全性的更高要求,以及由此催生的高带宽、低延迟产品的市场需求。此外,还讨论了软件定义网络(SDN)、网络功能虚拟化(NFV)、边缘计算等新技术的应用前景,指出未来网络设备将更加智能化、自动化,并能更好地支持AI和ML技术。最后,通过对多家领先企业的案例研究,展示了行业内竞争态势及各公司在技术创新方面的努力。 适用人群:从事网络设备相关领域的研究人员、工程师、管理人员,以及关注该领域发展的投资者。 使用场景及目标:帮助读者了解网络设备行业的最新动态和技术趋势,为制定战略决策提供依据;同时为企业和个人投资者提供市场洞察,辅助其做出合理的投资选择。 其他说明:报告基于详实的数据分析和专家意见撰写而成,旨在为专业人士提供有价值的参考资料。

  • 西门子1200 PLC码垛系统的SCL编程详解:涵盖变频器、机器人、视觉系统集成

    内容概要:本文详细介绍了基于西门子1200 PLC的码垛系统的设计与实现,涵盖了多个关键技术点。首先,文章讲解了Modbus TCP通讯的实现方法,展示了如何通过TSEND_C和TRCV_C功能块进行工业相机和机器人之间的数据传输,并提供了具体的报文处理代码。接着,文章深入探讨了SCL编程的优势及其在复杂逻辑处理中的应用,如托盘堆叠算法,该算法能够根据当前层数动态调整机械手的高度,确保堆叠的安全性和稳定性。此外,文章还介绍了机器人控制中的移位寄存器实现的动作队列管理和变频器的速度平滑处理,以及视觉系统的坐标解析和异常处理机制。最后,文章强调了良好的注释规范和异常处理链的重要性,确保程序的可维护性和可靠性。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是熟悉西门子PLC编程和SCL语言的从业者。 使用场景及目标:适用于需要深入了解和掌握西门子1200 PLC在码垛系统中的具体应用的技术人员。目标是帮助读者理解并实现多设备联动的复杂控制系统,提高系统的稳定性和效率。 其他说明:文中提供的代码示例和详细的解释有助于读者更好地理解和应用相关技术,同时也为后续的维护和优化提供了宝贵的参考资料。

  • ZYNQ平台PS与PL端驱动程序编写

    适合从入门到进阶的驱动程序爱好者

Global site tag (gtag.js) - Google Analytics