运维为什么学网站架构

运维人员学习网站架构有多方面的重要意义,主要体现在故障排查、性能优化、扩展维护、安全保障等工作的效率和质量提升上,具体如下:

  • 有助于故障排查

    • 快速定位问题:了解网站架构能让运维人员清楚各个组件的功能和相互关系。例如,当网站出现访问缓慢的问题时,如果知道数据库、应用服务器、缓存等组件在架构中的位置和作用,就可以迅速判断是数据库查询瓶颈,还是应用服务器负载过高,或是缓存失效等原因导致的,从而快速定位故障点。
    • 分析问题根源:在复杂的网站架构中,一个故障可能由多个因素引起。学习网站架构后,运维人员可以从整体上分析问题,通过查看相关组件的日志、监控数据等,深入挖掘问题的根源,而不是只停留在表面现象。
  • 便于性能优化

    • 资源合理分配:熟悉网站架构可以帮助运维人员根据业务需求和流量特点,合理分配服务器资源。比如,对于图片、视频等静态资源,若了解架构中静态资源服务器的作用,就可以根据访问量合理调整服务器的存储和带宽资源,提高访问速度。
    • 优化架构设计:随着业务的发展,网站架构可能需要不断优化。运维人员了解架构后,能从实际运行情况出发,提出合理的优化建议。例如,发现某些业务模块之间的交互存在性能瓶颈,就可以建议调整架构,采用分布式缓存、消息队列等技术来优化数据传输和处理流程。
  • 利于扩展与维护

    • 支持业务扩展:当网站业务量增长时,需要对架构进行扩展。运维人员掌握网站架构知识,就能更好地理解扩展的需求和方向。比如,是需要增加应用服务器来处理更多的业务请求,还是需要扩展数据库集群来存储更多的数据,都可以根据架构的特点做出合理的决策。(10台,日访问量500万人,800万)
    • 确保维护质量:在对网站进行升级、维护时,了解架构可以让运维人员提前做好准备工作,制定合理的维护计划。例如,在更新某个核心组件时,知道它与其他组件的依赖关系,就可以提前做好数据备份、服务切换等工作,确保维护过程中网站的稳定性和可用性。
  • 增强安全保障

    • 发现安全漏洞:网站架构中存在各种潜在的安全风险,如网络攻击、数据泄露等。运维人员学习网站架构后,能够从整体上审视安全问题,更容易发现架构中的安全漏洞。比如,通过分析网络架构,发现某些端口未进行安全限制,容易受到外部攻击,及时采取措施进行防护。
    • 制定安全策略:基于对网站架构的了解,运维人员可以制定更有效的安全策略。例如,根据不同的业务模块和数据敏感度,设置不同的访问权限,对关键数据进行加密存储和传输,防止数据泄露和篡改。
  • 促进团队协作

    • 有效沟通协作:在一个大型项目中,运维人员需要与开发人员、产品经理等多个团队进行协作。了解网站架构,能使运维人员更好地与其他团队沟通,理解他们的需求和工作内容。比如,开发人员提出新的功能需求时,运维人员可以从架构的角度提供建议,确保新功能的实现不会对现有系统造成影响。
    • 提升整体效率:当运维人员对网站架构有深入的理解时,整个团队在项目推进过程中能够更加顺畅。在出现问题时,能够快速定位和解决,减少沟通成本和问题处理时间,提高项目的整体效率和质量。

大型网站架构

大型网站架构是一个复杂且庞大的系统,可从其定义、架构设计目标、常见架构模式、关键技术组件等多个维度来理解,以下是具体内容:

定义与特点

  • 定义:大型网站架构是指为了支撑大规模用户访问、海量数据处理以及复杂业务功能而设计的一种软件架构体系,它涉及到服务器、网络、存储、软件等多个层面的技术和组件的组合与协同工作。
  • 特点
    • 高并发处理能力:能够应对海量用户同时访问,确保系统在高并发情况下仍能保持稳定、高效的运行,如电商平台在促销活动期间,要保证大量用户同时下单、查询等操作的流畅进行。
    • 海量数据存储与管理:可以存储和管理海量的业务数据,包括用户信息、交易记录、内容数据等,并能实现高效的数据查询、更新和分析,像社交媒体平台需要存储和处理大量的用户动态、图片、视频等数据。
    • 高可用性:具备高可靠性和稳定性,尽可能减少系统故障和停机时间,保证服务的连续性,通常采用冗余备份、故障自动切换等技术来实现,如银行的网上交易系统,必须保证7×24小时不间断服务。
    • 可扩展性:能够根据业务的增长和变化,灵活地扩展系统的功能和性能,支持水平扩展(增加服务器数量)和垂直扩展(提升单个服务器性能),如当一个在线教育平台用户量突然增加时,可方便地添加服务器来应对。

架构设计目标

  • 性能优化:通过各种技术手段,如缓存技术、负载均衡、分布式计算等,提高系统的响应速度和吞吐量,减少用户等待时间,提升用户体验。
  • 可靠性保障:确保系统在各种情况下都能稳定运行,数据不丢失、不损坏,通过数据备份、容错机制、监控报警等措施,提高系统的可靠性和稳定性。
  • 可维护性提升:使系统易于管理和维护,降低维护成本和难度,采用分层架构、模块化设计等方法,提高系统的可维护性和可扩展性。
  • 安全性保障:保护系统和数据的安全,防止数据泄露、恶意攻击等安全问题,通过身份认证、访问控制、数据加密等技术,保障系统的安全性。

常见架构模式

  • 分层架构:将系统分为多个层次,如表现层、应用层、数据层等,每个层次负责特定的功能,层次之间通过接口进行通信,优点是结构清晰、易于维护和扩展,不同层次可以独立进行开发、测试和部署。
  • 微服务架构:将大型系统拆分成多个小型的、独立的微服务,每个微服务都可以独立开发、部署和扩展,微服务之间通过轻量级通信机制进行交互,这种架构模式能够提高系统的灵活性和可扩展性,每个微服务可以根据自身的业务需求选择合适的技术栈。
  • 分布式架构:将系统的功能和数据分布在多个节点上,通过网络进行通信和协作,以实现高并发处理、海量数据存储等功能,如分布式文件系统、分布式数据库等,能够提高系统的性能和可靠性,通过数据冗余和分布式计算,提高系统的容错能力和处理能力。

关键技术组件

  • 负载均衡:通过负载均衡器将用户请求均匀分配到多个服务器上,以实现服务器的负载均衡,提高系统的并发处理能力和可用性,常见的负载均衡算法有轮询、加权轮询、最少连接数等。
  • 缓存:用于存储经常访问的数据,以减少对后端数据源的访问,提高系统的响应速度,如内存缓存(Redis)、分布式缓存(Memcached)等,缓存可以分为浏览器缓存、服务器端缓存等不同类型,根据数据的特点和访问频率选择合适的缓存策略。
  • 数据库:用于存储和管理系统的业务数据,包括关系型数据库(MySQL、Oracle等)和非关系型数据库(MongoDB、Cassandra等),为了提高数据库的性能和可扩展性,通常采用数据库集群、分布式数据库等技术。
  • 消息队列:用于在不同系统组件之间进行异步通信和数据传递,能够提高系统的解耦性和可靠性,如Kafka、RabbitMQ等,消息队列可以用于异步任务处理、流量削峰填谷等场景,提高系统的稳定性和性能。

00-淘宝网的十年架构

如下的内容,会是大家后面很长一段时间需要学习的具体知识点内容,甚至是你工作几年后都会要做的内容,也就是维护不同的运维架构;

本节以了解网站架构为主,先有整体的运维架构学习大框架理念,不要求完全理解,这是至少有五年工作经验,整合而来的架构理念知识。

后续再跟着于超老师,逐步学习,每一个架构下的技术细节即可。

这个架构是非常有魅力的,见证了一个互联网公司的诞生、传奇故事,也是技术人为之向往的天花板。

你能把这一套架构,在心中捋顺了,学会了,清晰的表达出来,以及未来在工作上实践应用,你就把简历改为,运维架构师吧。😁

image-20220415173453655

既然是开始学习了网站架构篇、你得对这个网站发展史有一些了解,当然是从运维架构角度去看待,技术是如何发展至今的。

在90年代初第一个网站的出现后,互联网站发展至今已有了巨大的变化,全球有一半的人口使用互联网,人们的生活因为互联网有了巨大的改变。

从百度、谷歌等信息搜索;

从淘宝、京东网上购物到斗鱼、虎牙文化娱乐,互联网渗透人们的每个角落,且这种趋势还在加速;

在互联网飞跃发展的过程里,电子商务的便捷背后缺是不堪重负的网站架构,一些B2C(Business to customer,指网络零售行业)的网站逢促销必然宕机;

铁道部电子购票网站频繁的故障和延迟更是把这种现象表现的淋漓尽致。

Deepseek

image-20200610162507242

一边是企业在网站技术上的投入,一边网站却在关键时刻,频繁宕机;

一边程序员夜以继日的加班,一边网站新功能上线故障,导致功能延缓上线;

一边是互联网业务快速发展挑战传统行业,一般是网站安全漏洞让网民胆战心惊;

打造一个高可用、高性能、易扩展、可伸缩且安全的网站,这是技术人员必须攻克,解决的难关。

《淘宝技术这十年》

《淘宝技术这十年》是子柳(原名赵超)编著,2013年5月由电子工业出版社出版的图书。以下是结合书中内容对淘宝这十年技术发展的一些介绍:

技术架构变迁

  • 初始阶段:淘宝诞生初期采用LAMP(Linux+Apache+MySQL+PHP)架构,随着PV上升,转变为IOE架构,即IBM小型机+Oracle数据库+EMC储存,开发语言也从PHP迁移到Java,引入了MVC框架+EJB(控制层)+ibatis(持久层),后又演变为MVC+spring+ibatis。
  • 分布式阶段:为应对海量数据和高并发,淘宝逐渐构建起分布式平台。如采用Hadoop分布式计算集群处理大量数据,建立分布于全国各地的CDN网络,在2013年时就有80多个节点,支持流量>800Gbps。

数据处理技术

  • 日志处理:淘宝会产生TB级的大量日志,通过高程度压缩(达到1:120)后传送给后台用于用户分析,日志包含用户订单交易的快照等详细信息。
  • 存储系统:商品详情因信息过多,经历了从分表存储到存放在TFS文件系统的转变,还用到了Block存储、raid5冗余存储、ext3文件系统等,TFS集群规模不断提升,随机IOPS达900+,并能实时生成缩略图,文件定位采用内存hash算法索引,写盘使用Append方式。

缓存与中间件技术

  • 缓存系统:TBstore缓存诞生,基于Berkeley DB,但存在数据量超过内存后性能下降的问题。后来TDBM、TBstore合并为tair(taobao pair),Tair是分布式系统,具备缓存和持久化两种存储功能,由中心控制节点和服务节点组成。
  • 中间件:HSF是淘宝的高性能服务框架,是一种实时调用中间件,还有notify异步消息通知中间件,用于实现异步消息通知和分布式事务处理,保证系统的基本可用、软状态和最终一致性。

负载均衡技术

淘宝使用LVS(Linux Virtual Server)等负载均衡技术,将大量的并发请求分担到多个处理节点,实现了横向扩展,避免纵向升级换代。通过建立一对多的映射机制,把请求分配到不同的服务器,确保众多服务器每台负担的用户数相对均衡。

搜索引擎技术

iSearch搜索引擎从每份数据1份变为多份,从单行变成矩阵,提升了访问容量和可用性,能够更高效地处理海量商品数据和用户搜索请求,为用户提供更准确、快速的搜索结果。

除了以上技术方面的发展,淘宝在这十年中还经历了产品的迭代、业务模式的创新以及人才培养体系的建立等多方面的变革,如支付宝的诞生、“招财进宝”到“淘宝直通车”的转变、淘宝技术大学的创立等。

大型网站架构特点(淘宝网)

微博,京东,淘宝,虎牙,斗鱼,抖音,快手,小红书,知乎等

大型网站架构具有多个显著特点,主要体现在高并发处理、海量数据管理、高可用性保障等方面,以下是详细介绍:

  1. 高并发处理能力
    • 能够应对海量用户同时访问:像在“双11”等购物狂欢节期间,淘宝、京东等大型电商网站会有海量用户同时涌入,进行商品浏览、下单、支付等操作,大型网站架构必须保证在这样的高并发场景下,系统依然能够快速响应,确保用户操作的流畅性,避免出现卡顿、加载缓慢甚至系统崩溃的情况。
    • 具备高效的请求处理机制:通过负载均衡技术,将用户请求均匀分配到多个服务器节点上进行处理,避免单个服务器负载过高。同时,采用异步处理、缓存等技术,提高请求的处理效率,减少用户等待时间。
  2. 海量数据管理
    • 存储海量数据:大型网站如社交媒体平台、电商平台等,会积累大量的用户数据、商品数据、交易记录、用户生成内容(如评论、图片、视频等)。以微信为例,每天都有海量的聊天记录、朋友圈动态等数据产生,需要大型网站架构具备强大的存储能力,能够存储和管理这些海量数据。
    • 高效的数据查询和分析:为了满足用户的查询需求以及企业的数据分析需求,大型网站架构需要提供高效的数据查询和分析功能。能够在海量数据中快速准确地检索出用户所需信息,同时支持对数据进行复杂的分析,为企业决策提供数据支持。
  3. 高可用性保障
    • 具备冗余备份机制:为了防止单点故障,大型网站架构通常会采用冗余备份技术,对关键的硬件设备、软件系统、数据等进行备份。如在数据存储方面,会采用多副本存储,确保在某个存储节点出现故障时,数据不会丢失,仍然可以从其他正常的副本中获取。
    • 实现故障自动切换:当系统中的某个组件或节点出现故障时,能够自动将业务流量切换到其他正常的组件或节点上,保证服务的连续性,用户几乎不会察觉到系统故障的发生。
  4. 可扩展性强
    • 支持水平扩展:随着业务的增长,能够通过增加服务器数量来扩展系统的处理能力。例如,当网站的用户量不断增加时,可以方便地添加更多的Web服务器、应用服务器、数据库服务器等,以应对不断增长的业务需求。
    • 易于功能扩展:在业务发展过程中,往往需要不断添加新的功能和业务模块。大型网站架构应具备良好的可扩展性,能够轻松应对这些变化,方便地集成新的功能模块,而不会对整个系统的架构造成太大的影响。
  5. 安全性高
    • 保护用户数据安全:大型网站存储了大量用户的敏感信息,如账号密码、身份证号码、银行卡信息等,需要采用严格的安全措施,如数据加密、访问控制、安全审计等,防止用户数据泄露,保障用户的信息安全。
    • 防范网络攻击:面对各种网络攻击威胁,如DDoS攻击、SQL注入攻击、恶意爬虫等,大型网站架构需要具备强大的安全防护能力。通过部署防火墙、入侵检测系统、WAF(Web应用防火墙)等安全设备和技术,对网络流量进行监控和过滤,及时发现并阻止恶意攻击。
  6. 性能优化
    • 低延迟响应:优化系统架构和算法,减少数据传输和处理的时间,使系统能够快速响应用户请求。如采用CDN(内容分发网络),将静态资源缓存到离用户更近的节点,加快用户访问速度,提高用户体验。
    • 高吞吐量:能够在单位时间内处理大量的请求和数据,提高系统的整体性能和效率。通过优化数据库查询、采用异步处理、分布式计算等技术,提高系统的吞吐量,满足大量用户的并发访问需求。

单体应用架构

image-20250211143011608

单体架构比较初级,典型的三级架构,前端(Web/手机端)+中间业务逻辑层+数据库层。这是一种典型的Java Spring mvc或者Python Django框架的应用。其架构图如下所示。

单体应用架构是一种传统且基础的软件架构模式,以下将从定义、结构、优缺点、适用场景几个方面详细介绍:

定义

/myapp/xxx

包含所有代码功能

单体应用架构是将整个应用程序作为一个单一的、自包含的单元进行开发、部署和运行的架构模式。

在这种架构中,所有的功能模块,如用户界面、业务逻辑和数据访问层等,都被打包成一个独立的应用程序。

结构

典型的单体应用架构通常采用分层架构设计,一般分为以下三层:

  • 表示层:负责与用户进行交互,接收用户的请求并展示处理结果。

    • 常见的表现形式为Web页面、桌面应用程序界面等。例如,一个电商网站的商品展示页面、购物车页面等都属于表示层。
  • 业务逻辑层:包含了应用程序的核心业务逻辑,负责处理表示层传递过来的请求,进行业务规则的验证、计算和处理等操作。比如,在电商系统中,订单的创建、商品库存的更新等业务逻辑都在这一层实现。

  • 数据访问层:主要负责与数据库或其他数据存储系统进行交互,执行数据的增删改查操作。例如,从数据库中查询用户信息、保存订单数据等。

优点

  • 开发简单:开发人员可以在一个项目中进行统一开发,对项目的整体结构和代码逻辑有清晰的认识,不需要考虑多个服务之间的复杂交互和通信问题,降低了开发难度和学习成本。
  • 部署方便:单体应用通常只需要将整个应用程序打包成一个可执行文件或部署包,然后部署到服务器上即可。相比于分布式架构,部署过程更加简单快捷,不需要管理多个服务的部署和配置。django上线部署。
  • 易于测试:由于所有的功能都集中在一个应用程序中,测试人员可以方便地对整个系统进行集成测试和功能测试,能够快速定位和解决问题。

缺点

  • 可维护性差:随着项目的不断发展和功能的不断增加,单体应用的代码量会变得越来越庞大,代码结构也会变得越来越复杂,导致代码的可读性和可维护性下降。当需要修改或添加一个功能时,可能会影响到其他部分的代码,增加了维护的难度和风险。
  • 扩展性有限:单体应用通常是垂直扩展,即通过增加服务器的硬件资源(如CPU、内存、磁盘等)来提高系统的性能。但这种扩展方式存在一定的瓶颈,当业务量增长到一定程度时,垂直扩展将无法满足需求。而且,对于不同的功能模块,可能有的模块需要更多的资源,有的模块资源需求较少,在单体架构中难以进行针对性的扩展。
  • 可靠性低:由于整个应用程序是一个单一的单元,一旦某个部分出现故障,可能会导致整个系统无法正常运行。而且,在进行系统升级或维护时,需要停止整个应用程序,会影响到用户的正常使用。

适用场景

  • 小型项目:对于功能简单、业务逻辑不复杂、用户量较少的小型项目,单体应用架构可以快速开发和部署,满足项目的需求,同时也能降低开发成本和维护成本。
  • 初创阶段:在项目的初创阶段,业务需求可能还不明确,变化比较频繁。单体应用架构可以让开发团队快速迭代和验证产品的可行性,随着业务的发展再考虑架构的升级和转型。

集群架构

中级架构,分布式应用,中间层分布式+数据库分布式,是单体架构的并发扩展,将一个大的系统划分为多个业务模块,业务模块分别部署在不同的服务器上,各个业务模块之间通过接口进行数据交互。数据库也大量采用分布式数据库,如redis、ES、solor等。通过LVS/Nginx代理应用,将用户请求均衡的负载到不同的服务器上。其架构图如下所示:

image-20250211143040987

集群架构是一种将多台计算机连接在一起协同工作的架构模式,通过整合多台计算机的资源,实现更高的性能、可用性和可扩展性。以下从定义、工作原理、特点、常见类型、应用场景几个方面详细介绍:

定义

集群架构是指将多个独立的计算机系统(节点)通过网络连接起来,形成一个统一的整体,这些节点共同承担计算任务、存储数据,对外提供统一的服务。每个节点都可以是物理服务器,也可以是虚拟机或容器。

工作原理

  • 负载均衡:集群架构中通常会有一个负载均衡器,它负责接收客户端的请求,并根据一定的算法(如轮询、加权轮询、最少连接数等)将请求分配到集群中的各个节点上,使得各个节点的负载相对均衡,避免某个节点过载而其他节点闲置。
  • 节点协作:集群中的各个节点通过网络进行通信和协作,共同完成一个任务。

    • 例如,在一个分布式文件系统集群中,不同的节点负责存储不同的数据块,当客户端需要访问某个文件时,各个节点会协同工作,将文件的各个部分组合起来返回给客户端。
  • 监控与管理:集群需要有一套监控和管理机制,实时监控各个节点的状态、性能指标(如CPU使用率、内存使用率、网络带宽等),当某个节点出现故障或性能异常时,能够及时发现并采取相应的措施,如自动将该节点的任务转移到其他正常节点上。

特点

  • 高性能:通过将计算任务分配到多个节点上并行处理,可以显著提高系统的处理能力和响应速度。例如,在大数据处理领域,使用集群架构可以在短时间内处理海量的数据。
  • 高可用性:集群中的多个节点可以互为备份,当某个节点出现故障时,其他节点可以继续提供服务,从而保证系统的高可用性。例如,在一个Web应用集群中,如果某个Web服务器出现故障,负载均衡器会自动将请求分配到其他正常的服务器上,用户几乎不会察觉到服务的中断。
  • 可扩展性:可以通过增加节点的数量来扩展集群的处理能力和存储容量,以满足不断增长的业务需求。例如,随着网站访问量的增加,可以随时添加新的服务器节点到集群中。
  • 容错性:集群架构具备一定的容错能力,能够自动检测和处理节点故障,确保系统的稳定运行。例如,在分布式数据库集群中,如果某个数据库节点出现故障, 。

常见类型

  • 负载均衡集群:主要用于将客户端的请求均匀地分配到多个服务器上,以提高系统的并发处理能力和响应速度。常见的负载均衡软件有Nginx、HAProxy等。
  • 高可用性集群:旨在确保系统在部分节点出现故障时仍能正常运行,通过冗余备份和故障转移机制来实现高可用性。例如,使用Heartbeat、Pacemaker等软件可以构建高可用性集群。
  • 计算集群:将多个计算节点连接在一起,共同完成复杂的计算任务,如科学计算、数据分析等。常见的计算集群技术有MPI(Message Passing Interface)、Hadoop等。
  • 存储集群:用于提供大规模的存储服务,将多个存储节点组合成一个统一的存储系统,实现数据的分布式存储和管理。例如,Ceph、GlusterFS等都是常见的存储集群系统。

应用场景

  • 大型网站和Web应用:如淘宝、京东等电商网站,每天会有大量的用户访问和交易请求,使用集群架构可以应对高并发访问,保证网站的性能和可用性。
  • 大数据处理和分析:在处理海量数据时,单个服务器的处理能力往往无法满足需求,集群架构可以将数据分布到多个节点上进行并行处理,提高数据处理的效率。例如,使用Hadoop集群进行数据存储和分析,使用Spark集群进行实时数据处理。
  • 云计算:云计算平台通过集群架构将大量的服务器资源整合在一起,为用户提供弹性的计算、存储和网络服务。用户可以根据自己的需求随时调整使用的资源量。
  • 科学研究和工程计算:在气象预报、基因测序、航空航天等领域,需要进行大量的复杂计算,集群架构可以提供强大的计算能力,加速科学研究和工程计算的进程。

负载均衡

负载均衡是一种将工作负载(如网络流量、计算任务等)均匀分配到多个计算资源(如服务器、虚拟机、容器等)上的技术,以下从基本概念、工作原理、常见类型、实现方式和应用场景几个方面进行介绍:

基本概念

负载均衡的主要目标是优化资源使用,避免某个资源因负载过高而出现性能瓶颈甚至故障,同时提高系统的整体性能、可用性和可扩展性。通过将负载分散到多个资源上,可以使每个资源的负载相对均衡,从而充分发挥每个资源的效能。

工作原理

  • 负载均衡器:作为负载均衡系统的核心组件,负载均衡器位于客户端和服务器集群之间,负责接收客户端的请求,并根据一定的算法将请求转发到合适的服务器上。
  • 负载分配算法:负载均衡器依据特定的算法来决定将请求分配到哪个服务器。常见的算法包括轮询、加权轮询、最少连接数、IP哈希等。不同的算法适用于不同的场景,例如轮询算法简单公平,适用于服务器性能相近的情况;最少连接数算法则会将请求分配给当前连接数最少的服务器,更适合处理长连接请求。
  • 健康检查:负载均衡器会定期对服务器集群中的各个服务器进行健康检查,以确保只有正常运行的服务器才能接收请求。如果发现某个服务器出现故障或响应异常,负载均衡器会自动将其从可用服务器列表中移除,直到该服务器恢复正常。

常见类型

  • 硬件负载均衡器:基于专门的硬件设备实现,具有高性能、高可靠性和强大的处理能力等优点。常见的硬件负载均衡器品牌有F5、Citrix等。硬件负载均衡器通常价格较高,但适用于对性能和可靠性要求极高的大型企业和数据中心。
  • 软件负载均衡器:通过软件程序实现负载均衡功能,具有成本低、易于部署和配置等优点。常见的软件负载均衡器有Nginx、HAProxy、LVS(Linux Virtual Server)等。软件负载均衡器适用于各种规模的企业和应用场景,尤其是对成本较为敏感的中小型企业。

实现方式

  • 四层负载均衡:基于TCP/IP协议的第四层(传输层)进行负载均衡,主要根据IP地址和端口号来转发请求。四层负载均衡器工作在网络的底层,处理速度快,适用于对性能要求较高的场景。例如,LVS就是一种典型的四层负载均衡器。
  • 七层负载均衡:基于HTTP、HTTPS等应用层协议进行负载均衡,能够根据请求的内容(如URL、HTTP头部信息等)进行更细粒度的负载分配。七层负载均衡器可以实现更多的应用层功能,如内容缓存、应用层防火墙等,但处理性能相对较低。例如,Nginx和HAProxy既可以作为四层负载均衡器使用,也可以作为七层负载均衡器使用。

应用场景

  • 网站和Web应用:在面对大量用户访问时,通过负载均衡可以将用户请求均匀分配到多个Web服务器上,避免单个服务器因负载过高而崩溃,提高网站的响应速度和可用性。例如,淘宝、京东等大型电商网站在促销活动期间,会使用负载均衡技术来应对高并发的访问请求。
  • 应用程序接口(API)服务:对于提供API服务的企业,负载均衡可以确保API请求被均匀分配到多个后端服务器上,保证API的稳定运行和高可用性。例如,各大云服务提供商的API网关通常会使用负载均衡技术来管理大量的API请求。
  • 数据库集群:在数据库集群中,负载均衡可以将数据库查询和写入请求分配到多个数据库节点上,提高数据库的读写性能和并发处理能力。例如,在分布式数据库系统中,使用负载均衡器可以实现对多个数据库节点的负载均衡。

高可用

高可用(High Availability,HA)是指系统在长时间运行过程中,能够持续地提供服务,尽可能减少因各种软硬件故障、人为错误、自然灾害等原因导致的系统停机时间,以保障业务的连续性。以下将从其衡量指标、实现策略、技术手段、应用场景等方面展开详细介绍:

衡量指标

通常用系统的可用性百分比来衡量高可用性,其计算公式为:可用性 = 系统正常运行时间 /(系统正常运行时间 + 系统故障时间)× 100%。常见的可用性级别及对应的年度停机时间如下:

  • 三个九(99.9%):意味着系统每年的停机时间不超过 8.76 小时。这是较为常见的企业级应用的可用性目标。
  • 四个九(99.99%):表示系统每年的停机时间不超过 52.6 分钟,适用于对服务连续性要求较高的业务,如金融交易系统、电信运营系统等。
  • 五个九(99.999%):即系统每年的停机时间不超过 5.26 分钟,一般用于对可用性要求极高的关键业务,如航空交通管制系统、大型数据中心等。

实现策略

  • 冗余设计:通过增加额外的硬件设备、软件组件或数据副本,当某个组件出现故障时,备用组件能够立即接替其工作,保证系统的正常运行。例如,在服务器集群中,采用多台服务器同时提供服务,当其中一台服务器出现故障时,其他服务器可以继续承担业务负载。
  • 故障检测与自动切换:建立实时的监控系统,能够及时检测到系统中的故障,并自动进行切换操作。例如,在数据库系统中,通过心跳检测机制实时监测主数据库的状态,当主数据库出现故障时,自动将业务切换到备用数据库上。
  • 数据备份与恢复:定期对重要数据进行备份,并建立完善的数据恢复机制,确保在数据丢失或损坏时能够快速恢复。常见的数据备份方式包括全量备份、增量备份和差异备份等。

技术手段

  • 负载均衡:通过负载均衡器将用户请求均匀分配到多个服务器上,不仅可以提高系统的并发处理能力,还能在某个服务器出现故障时,自动将请求转移到其他正常服务器上,保证服务的连续性。
  • 集群技术:将多个服务器组成一个集群,集群中的各个服务器相互协作,共同提供服务。当集群中的某个节点出现故障时,其他节点可以继续工作,实现系统的高可用性。常见的集群技术包括服务器集群、数据库集群等。
  • 热备与冷备:热备是指备用设备与主设备同时运行,实时同步数据,当主设备出现故障时,备用设备能够立即接管业务;冷备则是备用设备平时处于闲置状态,只有在主设备出现故障时才启动并接管业务。

应用场景

  • 金融行业:银行的网上银行系统、证券交易系统等对可用性要求极高,哪怕是短暂的停机都可能导致巨大的经济损失和客户信任危机。因此,金融机构通常会采用高可用架构来确保系统的稳定运行,保障交易的实时性和准确性。
  • 电信行业:电信运营商的核心网络、计费系统等需要 7×24 小时不间断运行,以提供可靠的通信服务。高可用技术可以保证在网络设备故障、自然灾害等情况下,通信服务不受影响或尽快恢复。
  • 互联网行业:大型电商平台、社交媒体网站等每天都要面对海量的用户访问,系统的高可用性直接关系到用户体验和企业的经济效益。一旦系统出现故障,可能会导致用户流失和业务收入下降。因此,互联网企业会投入大量的资源来构建高可用的系统架构。

图解架构升级(单体>集群)

image-20220415153901045

集群的特点:

扩展性好:集群只是单机的多个复制,没有改变单机的原有的代码结构,每次部署新节点只需要复制部署即可。

架构升级、单体架构和集群架构在软件开发和系统运维中都是重要的概念,下面为你详细介绍它们各自的含义以及相互之间的关联:

单体架构

  • 定义:单体架构是一种将整个应用程序作为一个单一的、自包含的单元进行开发、部署和运行的架构模式。所有的功能模块,如用户界面、业务逻辑和数据访问层等,都被打包成一个独立的应用程序。
  • 优点
    • 开发简单:开发人员可以在一个项目中进行统一开发,对项目的整体结构和代码逻辑有清晰的认识,不需要考虑多个服务之间的复杂交互和通信问题,降低了开发难度和学习成本。
    • 部署方便:单体应用通常只需要将整个应用程序打包成一个可执行文件或部署包,然后部署到服务器上即可。相比于分布式架构,部署过程更加简单快捷,不需要管理多个服务的部署和配置。
    • 易于测试:由于所有的功能都集中在一个应用程序中,测试人员可以方便地对整个系统进行集成测试和功能测试,能够快速定位和解决问题。
  • 缺点
    • 可维护性差:随着项目的不断发展和功能的不断增加,单体应用的代码量会变得越来越庞大,代码结构也会变得越来越复杂,导致代码的可读性和可维护性下降。
    • 扩展性有限:单体应用通常是垂直扩展,即通过增加服务器的硬件资源来提高系统的性能,但这种扩展方式存在一定的瓶颈。而且,对于不同的功能模块,难以进行针对性的扩展。
    • 可靠性低:由于整个应用程序是一个单一的单元,一旦某个部分出现故障,可能会导致整个系统无法正常运行。而且,在进行系统升级或维护时,需要停止整个应用程序,会影响到用户的正常使用。

集群架构

  • 定义:集群架构是指将多个独立的计算机系统(节点)通过网络连接起来,形成一个统一的整体,这些节点共同承担计算任务、存储数据,对外提供统一的服务。每个节点都可以是物理服务器,也可以是虚拟机或容器。
  • 优点
    • 高性能:通过将计算任务分配到多个节点上并行处理,可以显著提高系统的处理能力和响应速度。
    • 高可用性:集群中的多个节点可以互为备份,当某个节点出现故障时,其他节点可以继续提供服务,从而保证系统的高可用性。
    • 可扩展性:可以通过增加节点的数量来扩展集群的处理能力和存储容量,以满足不断增长的业务需求。
    • 容错性:集群架构具备一定的容错能力,能够自动检测和处理节点故障,确保系统的稳定运行。
  • 缺点
    • 管理复杂:需要管理多个节点,包括节点的配置、监控、维护等,增加了管理的难度和成本。
    • 网络依赖:节点之间通过网络进行通信和协作,网络故障可能会影响系统的正常运行。
    • 数据一致性问题:在多个节点之间同步数据时,可能会出现数据不一致的问题,需要采取相应的措施来保证数据的一致性。

架构升级

  • 定义:架构升级是指对现有系统的架构进行改进和优化,以满足不断变化的业务需求、提高系统的性能和可维护性、增强系统的稳定性和安全性等。架构升级可能涉及到从一种架构模式转换到另一种架构模式,也可能是对现有架构进行局部的调整和优化。
  • 单体架构升级到集群架构的原因
    • 业务增长:随着业务的发展,单体架构可能无法满足日益增长的用户访问量和数据处理需求,需要通过集群架构来提高系统的性能和可扩展性。
    • 提高可用性:单体架构存在单点故障的风险,一旦出现故障,整个系统将无法正常运行。集群架构可以通过冗余备份和故障转移机制,提高系统的可用性。
    • 技术发展:新的技术和工具不断涌现,集群架构可以更好地利用这些新技术,如分布式计算、云计算等,提高系统的竞争力。
  • 升级过程中面临的挑战
    • 技术难题:需要掌握新的技术和工具,如负载均衡、分布式存储、分布式计算等,同时还需要解决数据迁移、系统兼容性等问题。
    • 业务影响:架构升级可能会对现有业务产生一定的影响,需要制定详细的升级计划和应急预案,确保业务的连续性。
    • 团队能力:升级过程需要团队具备较高的技术水平和项目管理能力,需要对团队进行培训和提升。

图解微服务(分布式)

  • 微服务是指架构师在开发之前,设计的产品开发模式
  • 分布式是指运维部署微服务代码的方式

虽说上述的集群已经很优秀了、稳定、高性能,但是从代码业务上来看,还有很大问题

  • 每一个节点都是耦合性很高的,淘宝网的后端所有功能都揉在一个代码文件夹,并且被复制了很多个,造成资源浪费,因为运行了多次

简单说就是,老式的网站架构,在集群模式下 LNMP

1.所有的功能被重复运行了很多次,如,用户中心系统2 ; 支付系统2 ; 订单系统*2;造成服务器资源浪费; 2.并且随着网站越来越复杂,所有功能耦合在一个单体代码中,必然是灾难,一环出错、环环出错/myapp/ 3.因此如今的企业应用开发模式,从诞生就是以微服务(分布式)模式开发,运维部署也以微服务(分布式)模式部署;

微服务(分布式)

分布式运维部署结构,就是指原本是一套单体的代码系统,被拆分为了很多个独立子系统,这每一个分布式结构的子系统,就被称为微服务‘。

服务程序本身,LNMP(python Django /mysite/)

django ,单体应用开发,集群,负载均衡+ 前端

前后端分离开发模式,后端微服务开发模式,

后端仅提供API,组件之间走API通信。

每一个微,服务系统,通过网络、远程的互相调用,再完成统一的功能(淘宝网的官网)。

image-20220415160124455

微服务架构是一种用于构建应用程序的架构风格,它将一个大型应用拆分成多个小型、自治的服务。以下从定义、特点、优势、面临的挑战和适用场景等方面详细介绍:

定义

微服务架构是一种将单一应用程序作为一组小型服务开发的方法,每个服务运行在自己的进程中,并使用轻量级机制(通常是HTTP资源API)进行通信。

这些服务围绕业务能力构建,并可通过全自动部署机制独立部署。每个服务都有自己的数据库,以实现对数据的独立管理。

特点

  • 服务拆分:把一个复杂的大型应用按照,,业务功能拆分成多个微小的服务,例如电商系统可拆分为用户服务、商品服务订单服务支付服务等。每个服务专注于单一的业务功能,职责清晰。
  • 独立部署:每个微服务都可以独立开发、测试和部署。开发团队可以根据需求快速迭代某个微服务,而不需要重新部署整个应用。例如,若要对商品服务的展示页面进行优化,只需对商品服务进行更新部署,不会影响其他服务。
  • 技术多样性:不同的微服务可以根据自身的需求选择合适的技术栈。比如,用户服务可以使用Java语言和Spring框架开发,而日志分析服务可能选择Python和相关的数据处理库。
  • 数据自治:每个微服务都有自己独立的数据库,服务之间的数据存储相互隔离。这样可以避免不同服务之间的数据冲突,并且每个服务可以根据自身业务需求选择最适合的数据库类型,如订单服务使用关系型数据库MySQL,而商品评论服务使用非关系型数据库MongoDB。

优势

  • 易于开发和维护:由于每个微服务的功能相对简单,代码量较少,开发人员可以更快速地理解和修改代码。而且,当出现问题时,能够更精准地定位到具体的微服务进行修复。
  • 提高开发效率:不同的微服务可以由不同的团队并行开发,加快了整个项目的开发进度。各团队可以根据自己的节奏进行开发和部署,互不干扰。
  • 增强系统的可扩展性:可以针对不同微服务的负载情况进行独立的扩展。如果订单服务在促销活动期间压力较大,可以单独增加订单服务的服务器数量,而不需要对整个系统进行扩展,降低了扩展成本。
  • 容错性强:当某个微服务出现故障时,不会影响其他微服务的正常运行。例如,支付服务出现问题,用户仍然可以浏览商品、管理订单等。

面临的挑战

  • 服务间通信复杂:微服务之间需要通过网络进行通信,这增加了通信的复杂性和延迟。需要处理网络故障、消息丢失等问题,并且要确保服务间通信的可靠性和安全性。
  • 分布式系统管理困难:管理多个微服务的部署、监控和维护变得更加复杂。需要建立有效的监控系统,实时掌握每个微服务的运行状态,及时发现和处理问题。
  • 数据一致性问题:由于每个微服务有自己独立的数据库,在进行跨服务的业务操作时,保证数据的一致性变得困难。例如,在创建订单时,需要同时更新库存信息,若库存服务和订单服务之间的数据同步出现问题,就会导致数据不一致。
  • 服务间依赖管理:微服务之间存在相互依赖关系,如果某个服务发生变更,可能会影响到依赖它的其他服务。需要建立良好的版本管理和接口管理机制,确保服务间的兼容性。

适用场景

  • 大型复杂应用:对于功能繁多、业务逻辑复杂的大型应用,采用微服务架构可以将其拆分成多个小的服务,便于开发和维护。例如,大型电商平台、社交网络平台等。
  • 快速迭代的项目:当项目需要快速响应市场变化,频繁进行功能更新和迭代时,微服务架构的独立部署和开发特性可以满足快速迭代的需求。例如,互联网金融产品、移动应用等。
  • 团队协作开发:在多个团队协同开发的项目中,微服务架构可以让每个团队专注于自己负责的微服务,提高团队协作效率。例如,大型企业级软件项目。

淘宝网的十年架构演进

大型网站都是由小型网站发展而来,网站架构也是一样,从小网站逐步演化,最开始小网站访问人数很少,一台服务器即可完成工作。

此时应用程序,数据库,文件等所有资源都在一台服务器,也就是我们常见的LAMP、LNMP单机,使用各种开源软件和一台普通的服务器即可运行网站。

单机架构

以淘宝作为例子。在网站最初时,应用数量与用户数都较少,可以把Tomcat(后端)和数据库部署在同一台服务器上。

浏览器往www.taobao.com发起请求时,首先经过DNS服务器(域名系统)把域名转换为实际IP地址10.102.4.1,浏览器转而访问该IP对应的Tomcat。

image-20220415162511524

随着用户数的增长,Tomcat和数据库之间竞争资源,单机性能不足以支撑业务

第一次升级、tomcat和数据库分开了

因为tomcat是java写的,非常占内存资源,总是和数据库抢占磁盘资源、内存资源,导致服务器压力过大,网站解析、处理整体能力都很差。

因此让tomcat和数据库分开两台机器,显著提升各自的运行性能。

以下是关于淘宝十年架构中Tomcat和数据库拆分的相关内容:

1. 单纯的,tomcat和数据库里,分为2个服务器单独去运行,简单理解。

2. 深层的,代码层面的拆分优化,服务拆分,微服务优化。
架构,请求分流的优化,负载均衡优化。
数据库,蹭

Tomcat拆分

  • 背景:在淘宝发展初期,可能只是使用少量的Tomcat服务器来承载整个应用。但随着业务的快速增长,用户量、交易量等不断攀升,单台Tomcat或少量Tomcat服务器难以满足性能需求,出现了响应变慢、甚至服务不稳定等问题。
  • 具体方式
    • 按业务功能拆分:将不同的业务模块部署到不同的Tomcat服务器上。比如,将商品展示、交易下单、用户中心等业务分别部署在不同的Tomcat实例上。这样做的好处是各个业务模块之间相互隔离,避免了相互干扰。当某个业务模块出现问题时,只会影响到该模块对应的Tomcat服务器,而不会导致整个系统崩溃。同时,也方便对不同业务模块进行独立的扩展和优化。
    • 按用户群体或地域拆分:根据用户的特征或所在地区,将用户请求分配到不同的Tomcat服务器上。例如,针对不同国家或地区的用户,分别部署专门的Tomcat服务器来处理他们的请求。这样可以根据不同地区的用户量和业务特点,灵活地调整服务器资源,提高用户访问的响应速度。DNS优化,负载均衡的优化,请求的分配。
  • 效果
    • 提高性能和稳定性:通过拆分,每个Tomcat服务器承载的业务压力相对减小,能够更高效地处理请求,提高了系统的整体性能和稳定性。
    • 便于维护和扩展:各个Tomcat服务器上的业务相对独立,维护人员可以更方便地对单个业务模块进行维护、升级和扩展,降低了维护成本,提高了开发和运维效率。

数据库拆分

  • 背景:随着淘宝业务的不断发展,数据量呈爆发式增长,单库单表难以存储海量数据,同时读写压力也越来越大,导致数据库性能下降,成为系统的瓶颈。
  • 具体方式
    • 垂直拆分:按照业务功能将数据库中的表进行拆分,不同的业务模块对应不同的数据库。例如,将用户相关的表放在用户数据库中,商品相关的表放在商品数据库中。这样可以使每个数据库专注于处理特定业务的数据,提高了数据库的管理和维护效率。同时,不同业务的数据库可以根据各自的业务特点进行独立的优化和扩展。
    • 水平拆分:当单表数据量过大时,采用水平拆分的方式,将表中的数据按照一定的规则(如按照用户ID取模、时间范围等)分散存储到多个数据库或表中。比如,将用户表按照用户ID的奇偶性拆分成两个表,或者按照时间将订单表拆分成多个历史订单表和当前订单表。水平拆分可以有效地解决单表数据量过大带来的性能问题,提高数据的读写速度。
  • 效果
    • 提升数据处理能力:通过拆分,数据库能够更好地应对海量数据的存储和处理需求,提高了数据的读写性能,降低了查询和更新数据的时间。
    • 增强系统的扩展性和可用性:可以根据不同业务的数据增长情况,灵活地扩展相应的数据库资源。同时,当某个数据库出现故障时,只会影响到部分数据和业务,不会导致整个系统的数据丢失或无法运行,提高了系统的可用性和可靠性。

淘宝十年架构中Tomcat和数据库的拆分是应对业务快速发展和数据量剧增的重要举措,通过合理的拆分,提高了系统的性能、稳定性、可扩展性和可维护性,为淘宝的持续发展提供了强大的技术支撑。

应用服务和数据库分离

随着网站业务的发展,用户量增多,一台服务器逐渐支撑不住,越来越多的用户访问导致网站响应速度变慢,越来越多的数据,导致存储空间不足。这时候应该把应用和数据分离,使用三台服务器的架构,分别运行应用服务器、文件服务器、数据库服务器。

这三台机器对硬件资源要求各不同,

  • 应用服务器需要处理大量的业务逻辑,需要更强大,更快的CPU处理器
  • 数据库服务器需要更快速的读写数据,因此需要更强大的磁盘和大内存
  • 文件服务器要存储大量用户上传的文件,因此需要更大容量的硬盘。

image-20220415163139695

应用和数据分离后,不同作用的服务器承担不同的服务角色,各司其职,网站的并发处理能力和存储空间都得到了很大的改善,进一步支持网站业务。

但是随着公司发展,用户持续增长,网站此时架构又一次面临挑战,数据库压力太大,导致用户访问延迟,用户体验变差,老板又要拍板骂人了,于超老师需要对网站架构进一步优化。

应用服务和数据库分离架构是一种将应用程序的业务逻辑和数据存储功能分开部署的架构模式,以下是其相关内容:

架构概述

在这种架构中,应用服务层负责处理业务逻辑、接收和响应用户请求等,通常由多个应用服务器组成,可以采用Tomcat、JBoss等服务器来部署Java应用,或使用IIS来部署.NET应用等。数据库层则专门负责数据的存储、管理和检索,常见的数据库系统如MySQL、Oracle、SQL Server等都可用于此层。应用服务和数据库之间通过网络通信进行交互,应用服务通过数据库连接池等技术与数据库建立连接,以执行数据的读写操作。

优势

  • 提高性能:应用服务和数据库可以根据各自的负载需求独立进行扩展。例如,当业务逻辑处理需求增加时,可以增加应用服务器的数量;当数据存储和查询压力增大时,可扩展数据库服务器或进行数据库优化,从而避免了资源的浪费,提高了系统整体性能。
  • 增强稳定性:应用服务和数据库相互独立,当其中一方出现故障时,只会影响到自身,而不会导致整个系统崩溃。比如数据库出现故障,应用服务可以通过缓存等机制提供部分有限的服务,或者显示友好的错误提示,而不至于让用户无法使用整个应用。
  • 便于维护和升级:开发人员可以独立地对应用服务和数据库进行维护、升级和优化。对应用服务的代码修改、功能更新等操作不会影响到数据库的运行,同理,对数据库的结构调整、性能优化等也不会干扰应用服务的正常运行,降低了维护的复杂性和风险。
  • 提升安全性:将应用服务和数据库分离,可以在两者之间设置不同的安全策略和访问控制。例如,只允许特定的应用服务器IP地址访问数据库,对数据库的访问权限进行细粒度的控制等,从而提高了数据的安全性,降低了数据泄露的风险。

实现方式

  • 部署架构设计
    • 网络架构:在网络层面,应用服务器和数据库服务器通常位于不同的子网或服务器集群中,通过防火墙等网络安全设备进行隔离和访问控制。应用服务器所在的网络区域一般面向外部用户或其他客户端,而数据库服务器所在区域则相对更加安全,只允许经过授权的应用服务器进行访问。
    • 数据交互:应用服务通过数据库连接字符串等配置信息来建立与数据库的连接。在应用代码中,使用各种数据库访问框架或技术,如Java中的JDBC、Hibernate,.NET中的ADO.NET等,来实现对数据库的操作。为了提高性能和资源利用率,通常会使用连接池技术来管理数据库连接,避免频繁地创建和销毁连接。
  • 数据同步与一致性保证
    • 事务处理:在分布式环境下,确保应用服务和数据库之间的数据一致性是一个关键问题。通过使用分布式事务处理技术,如两阶段提交(2PC)、三阶段提交(3PC)等,来保证在多个操作涉及应用服务和数据库时,要么所有操作都成功提交,要么都回滚,以维持数据的一致性。
    • 数据缓存:为了提高数据访问性能,在应用服务层通常会引入缓存机制,如Redis、Memcached等。缓存可以存储经常访问的数据,当应用服务需要获取数据时,首先从缓存中查找,如果缓存中不存在,则再从数据库中获取,并将数据存入缓存以便下次使用。同时,需要设置合理的缓存更新策略,以保证缓存数据与数据库数据的一致性。

应用场景

  • 大型互联网应用:如电商平台、社交媒体平台等,这些应用通常具有海量的用户数据和高并发的业务请求,应用服务和数据库分离架构能够很好地应对高负载和大规模数据存储的需求,提供稳定、高效的服务。
  • 企业级应用:如企业资源规划(ERP)系统、客户关系管理(CRM)系统等,这些应用对数据的安全性、稳定性和一致性要求较高,应用服务和数据库分离架构便于进行安全管理和维护,能够满足企业对数据管理的严格要求。

第二次升级、引入本地缓存、分布式缓存

网站访问特点也逃不掉现实世界的二八定律:80%的业务访问集中在20%的商品数据上。

例如淘宝的用户最关注的都是成交量多,评价较好的商品;

很明显,对于网站的数据,就有热数据,冷数据之分,大部分的业务集中在一小部分数据上,那么如果把热门的数据缓存再内存中,是不是可以减轻数据库的访问压力,提高网站的整体访问效果呢,当然是可以。

image-20220415164350873

PS:内存的I/O速度是远超于磁盘的

网站的缓存主要分两种:

  • 缓存再应用服务器上的本地缓存(内存)---
  • 缓存放在专门的分布式缓存服务器上(单独的一台大内存服务器)----redis

在应用服务和数据库分离架构的基础上引入本地缓存和分布式缓存,能够进一步提升系统性能、减轻数据库压力,以下是具体介绍:

本地缓存

  • 概念及原理

    • Java tomcat服务器
    • 概念:本地缓存是指在应用服务器本地内存中存储数据的一种缓存机制,它属于进程内缓存,每个应用服务器都有自己独立的本地缓存空间。
    • 原理:应用程序在处理请求时,首先检查本地缓存中是否有所需数据。如果存在,则直接从本地缓存获取,避免了与数据库或其他远程数据源的交互。当本地缓存中没有所需数据时,才会去数据库或其他数据源获取,获取后将数据存入本地缓存,以便后续请求使用。
  • 优势

    • 快速响应:由于数据存储在应用服务器本地内存中,访问速度极快,能够显著减少数据获取的时间,提高应用程序的响应速度。
    • 减轻网络压力:对于一些频繁访问且数据量较小的数据,使用本地缓存可以避免多次从数据库或其他远程数据源获取数据,从而减轻了网络带宽压力。
    • 降低数据库负载:减少了对数据库的查询次数,特别是对于一些只读数据或不经常变化的数据,能够有效降低数据库的负载,提高数据库的整体性能。
  • 适用场景
    • 个性化用户数据:如用户的个性化配置、最近浏览记录等,这些数据通常只与单个用户相关,且访问频繁,适合存储在本地缓存中。
    • 小型静态数据:如系统中的一些代码表数据、配置参数等,数据量较小且相对稳定,放入本地缓存可以提高系统的初始化速度和运行效率。

分布式缓存

  • 概念及原理
    • 概念:分布式缓存是一种跨多个节点(服务器)进行数据存储和管理的缓存系统,它将数据分散存储在多个缓存节点上,以提供高可扩展性和高可用性。
    • 原理:分布式缓存通常采用一致性哈希等算法来将数据均匀地分布到各个缓存节点上。当应用程序需要访问数据时,根据数据的键值通过相同的算法计算出数据所在的缓存节点,然后直接从该节点获取数据。如果数据不在本地节点缓存中,则向其他节点请求数据,并将获取到的数据缓存到本地节点,以便下次访问。
  • 优势
    • 高可扩展性:能够通过增加缓存节点来轻松应对不断增长的数据量和访问请求,理论上可以无限扩展,以满足大规模应用的需求。
    • 高可用性:数据分布在多个节点上,即使部分节点出现故障,也可以通过其他正常节点提供服务,保证了系统的稳定性和可用性。
    • 数据共享:适用于多个应用服务器或不同微服务之间需要共享数据的场景,所有应用都可以访问分布式缓存中的数据,实现了数据的统一管理和共享。
  • 适用场景
    • 大型电商平台的商品数据:商品的基本信息、库存等数据,在多个业务模块和页面中都会用到,且数据量较大,使用分布式缓存可以提高数据的访问效率,减轻数据库压力,同时保证数据在多个应用服务器之间的一致性。
    • 社交媒体平台的热点数据:如热门话题、点赞数、评论数等热点数据,访问量巨大且实时性要求较高,分布式缓存可以快速响应用户请求,提升用户体验。

引入缓存后的架构调整及注意事项

  • 架构调整
    • 缓存与应用服务的集成:在应用服务中需要引入相应的缓存客户端库,以便与本地缓存和分布式缓存进行交互。同时,要合理设计缓存的使用策略,如缓存的读取、写入、更新和删除操作,确保缓存数据的有效性和一致性。
    • 缓存与数据库的交互:需要确定缓存与数据库之间的数据同步策略。例如,当数据库中的数据发生变化时,要及时更新缓存中的数据,避免出现数据不一致的情况。可以采用缓存更新策略,如写后更新、失效时间等方式来保证缓存与数据库数据的一致性。
  • 注意事项
    • 缓存数据一致性:由于数据可能同时存在于本地缓存、分布式缓存和数据库中,要确保在数据更新时,能够及时、准确地更新所有存储位置的数据,避免出现数据不一致的问题。
    • 缓存穿透、缓存击穿和缓存雪崩:需要采取相应的措施来防止这些问题的发生。例如,对于缓存穿透,可以采用布隆过滤器等技术进行拦截;对于缓存击穿和缓存雪崩,可以通过设置合理的缓存过期时间、采用热点数据永不过期等策略来解决。
    • 缓存容量管理:要根据业务需求和数据特点,合理规划本地缓存和分布式缓存的容量,避免缓存空间不足导致数据丢失或缓存溢出,同时也要避免缓存空间过大造成资源浪费。

本地缓存的弊端

比如修改tomcat的参数、添加JVM缓存参数、或者在应用服务器部署memcached缓存数据库,也都可以。

本地缓存的访问更快,没有网络延时,但是应用服务器的内存有限,缓存的数据量有限制,而且会有缓存和应用程序争夺内存的情况。

分布式缓存的优点

远程分布式缓存可以采用集群的方案,部署较大内存的服务器作为专门的缓存服务器,可以在理论上实现内存不受限的扩容服务。当然这需要有成本代价。

image-20220415164740847

新的问题又来了

使用缓存后,数据库的访问压力得到有效的缓解,但是应用服务器在后续也有了瓶颈;

缓存抗住了绝大多数的访问请求,但是随着淘宝网的崛起,用户越来越多,并发压力更大了,网站的压力就集中在了tomcat这样的应用服务器上;

后端服务器解析速度越来越慢;

主要使用负载均衡集群方式改善。

第三次升级、引入反向代理、负载均衡

使用集群是网站解决高并发,海量请求的常见手段,俗话说三个臭皮匠,胜过诸葛亮。

一台服务器的处理能力,存储空间都会有瓶颈,此时压根不要企图再去换一个更强大的服务器,对于大型网站而言,无论多么强大的服务器,都满足不了业务增长的需求,此时你的做法应该是再增加一个臭皮匠,也就是增加一台服务器,去分担原有服务器的压力。

对于网站架构而言,通过增加机器的形式改善负载压力,就可以持续不断的改善系统性能,实现系统的可伸缩性。

image-20220415165143402

在很多台机器上,都部署tomcat、使用反向代理软件nginx,把请求均匀的分发给每一个tomcat。

假设tomcat本身最多支持1000个并发(1000个用户同时在线);

Nginx最多支持50000个并发(支持5万个用户同时连接);

那么nginx只要把5万个并发请求,转发给50个tomcat服务器就能扛得住这个流量;

通过负载均衡调度服务器,将用户的请求分发到应用服务器集群中的任何一台机器上,根据用户访问量,来决定增/删集群中的服务器,以此来解决应用服务器的压力。

涉及技术、nginx、haproxy、lvs等

问题又来了

既然理论上,只要不断增加负载均衡的节点,应用服务器的数量,后端就必然能扛得住更多的用户流量;

此时的压力就落到了谁身上?

数据库,此时数据库mysql、依然是单机,读写性能达到瓶颈。

在引入本地缓存、分布式缓存的基础上,进一步引入反向代理和负载均衡,能让系统架构更加完善、性能更优、可靠性更高,以下是具体介绍:

反向代理

  • 概念及原理
    • 概念:反向代理位于服务器端,是客户端访问服务器的中间代理服务器。客户端向服务器发送请求时,实际上是先将请求发送到反向代理服务器,由反向代理服务器根据一定的规则将请求转发到后端真正的服务器上,并将服务器的响应返回给客户端,对于客户端来说,反向代理服务器就像是真正的服务器。
    • 原理:反向代理服务器接收来自客户端的HTTP请求等,根据请求的内容,如URL、请求头信息等,按照预设的规则决定将请求转发到哪台后端服务器。例如,根据域名将请求分发到不同的服务器集群,或者根据请求的路径将请求发送到特定的应用服务器处理。
  • 优势
    • 隐藏服务器真实架构:对外只呈现反向代理服务器的地址,隐藏了后端服务器的真实IP地址和架构,降低了服务器被直接攻击的风险,提高了系统的安全性。
    • 缓存静态资源:可以缓存经常访问的静态资源,如HTML页面、图片、CSS和JavaScript文件等。当有相同请求再次到来时,直接从反向代理的缓存中返回数据,无需再向后端服务器请求,大大提高了响应速度,减轻了后端服务器的负载。
    • 实现内容过滤和压缩:可以对请求和响应进行处理,如对请求进行合法性检查、过滤恶意请求,对响应数据进行压缩,减少网络传输的数据量,提高数据传输效率。
  • 适用场景
    • 应对高并发的Web应用:对于访问量巨大的网站,如大型新闻网站、电商促销活动期间等,反向代理可以通过缓存和请求分发,有效应对高并发请求,确保网站的稳定运行。
    • 多服务器集群环境:在由多个服务器组成的集群环境中,反向代理作为统一的入口,方便对后端服务器进行管理和维护,实现请求的合理分配和负载均衡的初步筛选。

负载均衡

  • 概念及原理
    • 概念:负载均衡是一种将网络流量均匀分配到多个服务器上的技术,通过在多个后端服务器之间分配工作负载,确保每个服务器都能合理地处理请求,避免单个服务器因负载过高而影响性能甚至崩溃,从而提高整个系统的可用性和性能。
    • 原理:负载均衡器通常位于客户端和后端服务器集群之间,它会根据一定的负载均衡算法,如轮询、加权轮询、最少连接数、IP哈希等,决定将客户端的请求发送到哪个后端服务器上。例如,轮询算法会按照顺序依次将请求分配到各个服务器上;加权轮询算法则会根据服务器的性能差异为每个服务器设置不同的权重,性能好的服务器权重高,分配到的请求相对更多。
  • 优势
    • 提高系统性能和可用性:避免了单个服务器负载过重,使系统能够处理更多的并发请求,提高了整体性能。同时,当部分服务器出现故障时,负载均衡器可以自动将请求分配到其他正常的服务器上,保证系统的不间断运行,提高了可用性。
    • 实现服务器资源的合理利用:根据服务器的实际性能和负载情况分配请求,使服务器资源得到充分利用,避免了资源浪费,提高了服务器的利用率,降低了硬件成本。
  • 适用场景
    • 大型企业级应用:如银行系统、大型ERP系统等,这些系统通常有大量的用户并发访问,需要处理大量的业务请求,负载均衡可以确保系统的稳定运行和高效响应。
    • 云计算和数据中心:在云计算平台和数据中心中,有大量的服务器资源用于为不同的用户和应用提供服务,负载均衡是实现资源合理分配和高效利用的关键技术,能够为用户提供可靠的云计算服务。

引入后的架构优化及注意事项

  • 架构优化
    • 与现有架构的融合:反向代理可以部署在负载均衡器之前,先对请求进行初步处理和缓存,然后再将请求发送到负载均衡器。负载均衡器根据算法将请求分配到后端的应用服务器集群,应用服务器再结合本地缓存和分布式缓存进行数据处理,形成一个多层次、高效的架构体系。
    • 监控与管理:需要建立完善的监控系统,对反向代理、负载均衡器和后端服务器的性能指标进行实时监控,如请求响应时间、吞吐量、服务器负载等。通过监控数据及时调整负载均衡策略和服务器资源配置,确保系统始终处于最佳运行状态。
  • 注意事项
    • 配置的复杂性:引入反向代理和负载均衡后,系统的配置变得更加复杂,需要仔细配置反向代理和负载均衡的规则、算法等参数,确保请求能够正确地分发和处理。同时,要注意不同组件之间的兼容性和协作问题,避免出现配置冲突导致系统故障。
    • 单点故障问题:虽然负载均衡和反向代理提高了系统的可用性,但它们本身也可能成为单点故障点。因此,需要采用冗余设计,如部署多个反向代理服务器和负载均衡器,并进行主备切换或集群部署,以确保在某个组件出现故障时,系统仍然能够正常运行。

第四次升级、数据库读写分离

数据库读写分离是一种优化数据库性能和提高系统可用性的技术手段,以下是关于它的详细介绍:

概念及原理

  • 概念:数据库读写分离是指将数据库的读操作和写操作分别分配到不同的数据库服务器上执行。通常会有一个主数据库(Master)负责处理所有的写操作,如插入、更新和删除数据等,而多个从数据库(Slave)则负责处理读操作,如查询数据。
  • 原理:主数据库在执行写操作后,会通过数据库的复制机制将数据变更同步到从数据库。常见的复制方式有基于日志的复制(如MySQL的二进制日志)和基于逻辑的复制等。应用程序在进行数据操作时,根据操作类型自动将读请求发送到从数据库,将写请求发送到主数据库,从而实现读写操作的分离。

优势

  • 提高系统性能:将读操作分散到多个从数据库上,可以分担主数据库的负载,避免因大量读请求导致主数据库性能下降。特别是在高并发读的场景下,多个从数据库可以并行处理读请求,大大提高了系统的整体读取性能。
  • 增强系统可用性:当主数据库出现故障时,从数据库仍然可以提供读服务,保证系统的部分功能能够继续运行,提高了系统的容错能力和可用性。同时,在进行主数据库的维护、升级等操作时,读操作可以继续由从数据库提供服务,减少对业务的影响。
  • 便于水平扩展:随着业务的增长和数据量的增加,可以方便地通过添加从数据库来扩展系统的读能力,实现系统的水平扩展,而不需要对应用程序进行大规模的修改。

实现方式

  • 基于数据库中间件:在应用程序和数据库之间引入数据库中间件,如MyCAT、Sharding-JDBC等。中间件会拦截应用程序的数据库请求,根据配置规则自动将读请求路由到从数据库,将写请求路由到主数据库。这种方式对应用程序的侵入性较小,只需要在应用程序中配置中间件的相关参数即可,适用于各种规模的系统。
  • 在应用程序层面实现:在应用程序的代码中,通过配置不同的数据源来分别连接主数据库和从数据库。在执行数据库操作时,根据操作类型手动选择使用主数据源还是从数据源。例如,在Java项目中,可以使用Spring框架的多数据源配置来实现读写分离。这种方式需要在应用程序中编写额外的代码来处理数据源的切换,对应用程序的代码有一定的侵入性,但可以更灵活地控制读写分离的策略。
  • 利用数据库自身功能:一些数据库本身提供了读写分离的功能或插件,如MySQL的Replication(复制)功能结合一些配置工具可以实现简单的读写分离。通过配置主从复制关系,将从数据库配置为只读模式,应用程序根据需要连接主数据库或从数据库进行读写操作。

面临的挑战及解决方法

  • 数据一致性问题
    • 挑战:由于主从数据库之间的数据同步存在一定的延迟,可能会导致在写操作后立即进行读操作时,从数据库中还没有及时更新到最新数据,出现数据不一致的情况。
    • 解决方法:可以采用一些策略来尽量减少数据不一致的影响,如在写操作后,根据业务允许的延迟时间,短暂地将读请求仍然发送到主数据库,确保能读取到最新数据;或者在从数据库上采用一些缓存机制,对热点数据进行缓存,减少因数据同步延迟导致的不一致问题。
  • 事务处理问题
    • 挑战:在读写分离架构下,事务处理可能会变得复杂。如果一个事务中既包含写操作又包含读操作,可能会出现读操作从从数据库读取到旧数据,导致事务处理异常。
    • 解决方法:对于包含读写操作的事务,通常可以将整个事务都路由到主数据库进行处理,确保事务的一致性。另外,也可以通过使用分布式事务解决方案,如两阶段提交(2PC)、三阶段提交(3PC)等,但这些方案会增加系统的复杂性和性能开销。
  • 维护成本增加
    • 挑战:引入读写分离后,需要维护多个数据库服务器,包括主数据库和从数据库的配置、监控、故障处理等,增加了系统的维护成本和管理难度。
    • 解决方法:建立完善的数据库监控系统,实时监控主从数据库的状态、数据同步情况等指标。同时,制定合理的运维策略和应急预案,以便在出现问题时能够快速定位和解决。

网站在使用缓存后,使得大部分数据的读取操作,不通过数据库就可以访问完成,但是也会有一部分的读取操作(例如缓存未命中,缓存过期)和全部的写入操作需要访问数据库,在网站达到一定规模之后,数据库因为负载压力过高而成为网站瓶颈。

主从复制

目前主流的数据库软件都提供了主从热备功能 ,配置两台数据库的主从关系,可以将一台数据库的数据,同步更新到另一台机器上。

网站利用该功能,可以实现数据读写分离,减轻数据库负载压力。

image-20220415170917940

读写分离

数据库规划为读库(从库);写库(主库);

应用服务器进行写入操作的时候,访问主数据库,主数据库通过主从复制机制将数据更新同步到从数据库,这样当

应用服务器读取数据的时候,可以通过从库获取数据,以此实现数据读写分离;

针对不同的网站业务,读,写的操作比率,也是不一样的。

如电商类站点,用户浏览商品居多,读取居多;

博客类站点,用户写入数据居多,需要依次进行不同的优化调整。

读库可以有多个,通过主从同步技术把写库的数据,同步到所有的读库;

对于需要读取最新数据的场景,可以再从写库,同步到缓存中,确保可以通过缓存也能拿到最新数据;

这里的数据库拆分、主要是DBA的专业数据库运维工作内容,以及开发工程师要根据业务的拆分涉及,系统运维主要以配置数据库复制为主。

问题又来了

依然是随着淘宝网的发展,不仅是用户量、并发量更大了;

业务复杂性也更高了、如下圈出来的全都是淘宝网额外的功能

image-20220415172853005

业务越来越多、不同业务之间的访问量、访问频率相差也太大,甚至有业务会对数据库竞争,相互影响性能,因此数据库瓶颈依然是个问题。

后续就是DBA级别的数据库优化架构了,主要是

  • 数据库按业务分为多个数据库
  • 数据表拆分

这就不在网站架构的讨论范畴了,因此不做讲解了

第五次升级、负载均衡升级

负载均衡的再次升级以及应对大并发的升级是一个系统工程,涉及到硬件升级、算法优化、架构调整等多个方面,以下是具体的升级措施:

硬件升级

  • 增加服务器资源:添加更多的服务器到负载均衡集群中,以增加整体的处理能力。可以选择性能更高的服务器,如具有更多CPU核心、更大内存容量和更快网络接口的服务器,来应对大并发下的计算和数据处理需求。
  • 升级网络设备:确保网络设备(如交换机、路由器等)具备更高的转发能力和更低的延迟,以支持大量数据的快速传输。可以采用万兆甚至更高带宽的网络设备,升级网络拓扑结构,减少网络传输中的瓶颈。

负载均衡算法优化

  • 采用更智能的算法
    • 加权最少连接算法:在考虑服务器连接数的基础上,为不同性能的服务器分配不同的权重,性能高的服务器权重高,能分配到更多的请求,使负载分配更合理。
    • IP哈希算法:根据客户端的IP地址进行哈希计算,将来自同一IP的请求始终路由到同一台服务器,适用于有状态服务或需要保持会话一致性的场景,减少了会话管理的复杂性。
  • 结合多种算法:根据业务特点和流量模式,动态地结合多种负载均衡算法。例如,在业务高峰期采用加权最少连接算法,以充分利用服务器资源;在平时则采用轮询算法,保证请求均匀分配。

架构优化

  • 引入分布式架构:将应用系统拆分成多个微服务,每个微服务可以独立地进行扩展和部署。通过分布式架构,将负载分散到多个微服务实例上,提高系统的整体并发处理能力。同时,使用服务治理框架来管理微服务之间的通信和协作,确保系统的稳定性和可靠性。
  • 多级负载均衡:构建多级负载均衡架构,例如在数据中心入口处设置一级负载均衡,将流量分发到不同的区域或集群;在每个区域或集群内部再设置二级负载均衡,将流量进一步分发到具体的服务器。这样可以实现更精细的流量管理和负载分配,提高系统的可扩展性和容错性。
  • 采用云原生技术:利用容器化技术(如Docker)和容器编排工具(如Kubernetes)来管理和部署应用。容器化可以实现应用的快速部署和弹性伸缩,Kubernetes能够自动根据负载情况动态地调整容器的数量,实现资源的高效利用和自动负载均衡。

缓存和异步处理

  • 强化缓存机制:扩大缓存的容量和覆盖范围,采用分布式缓存系统(如Redis Cluster)来提高缓存的读写性能和可扩展性。对热点数据进行缓存,减少对后端服务器的请求压力,从而提高系统的并发处理能力。
  • 异步处理:将一些非关键的业务逻辑(如日志记录、消息通知等)进行异步处理,通过消息队列(如RabbitMQ、Kafka等)将任务发送到消息队列中,由专门的消费者进行处理。这样可以避免这些任务阻塞主线程,提高系统的响应速度和并发处理能力。

监控与优化

  • 建立完善的监控体系:部署全面的监控工具,对负载均衡器、服务器、网络等各个环节进行实时监控。监控指标包括请求流量、响应时间、服务器负载、连接数等,通过监控数据及时发现系统中的瓶颈和异常情况。
  • 性能测试与调优:定期进行性能测试,模拟高并发场景,对系统进行压力测试,找出系统的性能瓶颈所在。根据测试结果,对系统进行针对性的优化,如调整服务器配置、优化应用代码、调整数据库参数等,不断提高系统的性能和稳定性。

假设nginx能够支撑5万的用户并发,但是此时的淘宝网已经有50万的用户了,也就是入口的nginx也扛不住这个请求压力了,瓶颈此时出现在了nginx。

因此依然是采用负载均衡的理念,运行多个nginx来分摊这个集中式的请求压力;

入口此时发现被修改为了叫做LVS、或是F5这样的软件,它俩也是提供负载均衡能力的软件,但是性能上比nginx更强悍,支持更高的并发,单机的F5就能扛得住支持几十万的用户请求,但是价格昂贵,是一台硬件负载均衡设备,需要企业估值成本;

成本不允许,则可以使用开源技术,LVS替代F5、性能也足够强悍,也是提供负载均衡的能力。

image-20220415180532928

但是LVS是软件负载均衡,也就是linux上运行的一个程序而已,如果lvs服务器宕机了,会导致网站入口直接就挂了,因此需要实现高可用,常见的方案就是keepalived;

这套负载均衡+高可用技术,后面跟着于超老师学就好了,这里不再多叙述,了解架构理念即可。

第六次升级、DNS负载均衡

DNS负载均衡是一种通过DNS服务器来实现负载均衡的技术,在应对大并发等场景下具有独特作用,以下是引入DNS负载均衡的相关内容:

原理

DNS负载均衡的工作原理是基于DNS服务器对域名解析请求的响应。当客户端请求访问一个域名时,DNS服务器会根据一定的算法,如轮询、随机、加权等,将域名解析为不同的IP地址,这些IP地址对应着不同的服务器。客户端根据解析得到的IP地址去访问相应的服务器,从而实现将流量分散到多个服务器上,达到负载均衡的目的。

优势

  • 易于实现和部署:无需在网络中额外添加复杂的负载均衡设备,只需在DNS服务器上进行简单的配置即可实现负载均衡功能,降低了部署成本和复杂度。
  • 全局负载均衡:可以在全球范围内根据客户端的地理位置等因素,将请求分配到距离客户端最近或负载最轻的服务器上,提高用户访问速度和体验,特别适用于具有多个数据中心的分布式系统。
  • 灵活性高:可以根据业务需求灵活地调整DNS记录,如添加或删除服务器、调整服务器权重等,方便地实现对负载均衡策略的动态调整。

实现方式

  • 轮询DNS:这是最基本的实现方式。DNS服务器按照顺序依次将域名解析为不同服务器的IP地址,轮流分配客户端请求。例如,有三台服务器A、B、C,DNS服务器会依次将第一个请求解析到服务器A的IP,第二个请求解析到服务器B的IP,第三个请求解析到服务器C的IP,然后再循环。
  • 加权DNS:根据服务器的性能、处理能力等因素为每个服务器分配一个权重值。DNS服务器在解析域名时,会按照权重比例将请求分配到不同的服务器上。性能较高的服务器可以设置较高的权重,从而接收更多的请求。
  • 基于地理位置的DNS:利用客户端的IP地址确定其地理位置,然后将请求解析到距离客户端最近的数据中心或服务器。这样可以减少网络传输延迟,提高访问速度。例如,对于位于北京的客户端,DNS服务器会将请求解析到位于北京或附近地区的数据中心的服务器上。

面临的挑战及解决方法

  • DNS缓存问题
    • 挑战:由于DNS缓存的存在,客户端可能会缓存之前解析得到的IP地址,导致在服务器负载情况发生变化或服务器出现故障时,客户端仍然访问到旧的服务器,无法及时实现负载均衡或故障转移。
    • 解决方法:可以通过设置较短的DNS TTL(Time to Live)值来减少缓存时间,使客户端能够更快地获取最新的DNS解析结果。但较短的TTL值会增加DNS服务器的负载,需要根据实际情况进行权衡。
  • 无法精确控制负载
    • 挑战:DNS负载均衡只是在域名解析层面进行简单的地址分配,无法像硬件负载均衡器或应用层负载均衡那样精确地感知服务器的实时负载情况,可能会导致负载分配不均匀。
    • 解决方法:可以结合其他负载均衡技术,如在服务器端采用应用层负载均衡器,对DNS分配过来的请求进一步进行负载均衡处理,根据服务器的实际负载情况进行动态调整,以提高负载均衡的准确性和效果。
  • 故障检测与切换延迟
    • 挑战:当服务器出现故障时,DNS服务器需要一定的时间来检测故障并更新DNS记录,将请求切换到其他正常的服务器上,这个过程可能会有一定的延迟,导致部分请求失败。
    • 解决方法:采用更先进的DNS动态更新技术和健康检查机制,加快对服务器故障的检测和DNS记录的更新速度。同时,可以设置备用的DNS服务器,在主DNS服务器出现故障时能够快速切换,保证DNS服务的连续性。

问题又来了(并发实在是太多了)

Linux 服务器的理论最大并发连接数受到多个因素的限制,以下从不同方面为你详细分析:

硬件资源限制

CPU

  • 原理:CPU 负责处理服务器上的各种任务,包括网络请求的处理、数据的计算等。当并发连接数增加时,CPU 需要处理更多的上下文切换、数据包处理等操作,因此 CPU 的处理能力会成为并发连接数的一个重要限制因素。
  • 计算方式:很难给出一个确切的最大并发连接数与 CPU 的对应关系,因为这取决于 CPU 的核心数、主频、架构以及应用程序的 CPU 使用率。例如,一个低负载的网络服务可能每个连接只占用极少的 CPU 资源,此时 CPU 可以支持大量的并发连接;而对于高计算密集型的服务,CPU 很快就会成为瓶颈。

内存

  • 原理:每个并发连接都需要一定的内存来存储连接状态、缓冲区数据等信息。当内存不足时,系统可能会开始进行交换(swap)操作,这会严重影响系统性能,甚至导致系统崩溃。
  • 计算方式:假设每个连接需要占用的内存为 $M$ 字节,服务器的可用内存为 $T$ 字节,那么理论上最大并发连接数 $N$ 可以近似表示为 $N = \frac{T}{M}$。但在实际情况中,还需要考虑操作系统、其他服务以及预留内存等因素。例如,对于一个简单的 TCP 连接,可能每个连接需要占用几 KB 到几十 KB 的内存。

网络带宽

  • 原理:网络带宽决定了服务器能够处理的数据传输速率。如果并发连接产生的数据流量超过了网络带宽的限制,就会导致数据包丢失、延迟增加等问题,从而影响系统的并发处理能力。
  • 计算方式:假设每个连接的平均数据传输速率为 $r$ (bps),服务器的网络带宽为 $B$ (bps),那么理论上最大并发连接数 $n$ 可以表示为 $n=\frac{B}{r}$。例如,一个 1Gbps 的网络接口,如果每个连接平均数据传输速率为 1Mbps,那么理论上最多可以支持 1000 个并发连接,但实际情况中还需要考虑网络协议开销等因素。

软件限制

文件描述符限制

  • 原理:在 Linux 系统中,每个网络连接都对应一个文件描述符。系统对每个进程和整个系统所能打开的文件描述符数量有一定的限制。当并发连接数达到文件描述符的限制时,新的连接将无法建立。
  • 查看和修改:可以使用 ulimit -n 命令查看当前进程的文件描述符限制,使用 ulimit -n <number> 临时修改该限制,或者通过修改 /etc/security/limits.conf/etc/sysctl.conf 文件进行永久修改。例如,将 fs.file - max 参数设置为一个较大的值可以增加系统级的文件描述符限制。

TCP/IP 栈参数

  • 原理:Linux 的 TCP/IP 栈有许多参数可以影响并发连接的处理能力,如半连接队列长度(tcp_max_syn_backlog)、全连接队列长度(somaxconn)等。如果这些参数设置不合理,可能会导致连接被拒绝或丢失。
  • 修改方法:可以通过修改 /etc/sysctl.conf 文件来调整这些参数。例如,增大 tcp_max_syn_backlogsomaxconn 的值可以增加系统处理并发连接的能力。修改后使用 sysctl -p 命令使配置生效。

理论极限

在理想情况下,假设硬件资源无限且软件配置最优,Linux 服务器的并发连接数可以达到非常高的水平。例如,通过优化 TCP/IP 栈和使用高效的网络 I/O 模型(如 epoll),理论上可以支持数十万甚至上百万的并发连接。但在实际应用中,受到硬件成本、网络环境等因素的限制,很难达到这样的理论极限。通常,通过合理的硬件配置和软件优化,一台 Linux 服务器可以支持数万到数十万的并发连接。

提示,服务器理论上,最大并发数是
>>> 2**48
281474976710656

每一条连接都是要消耗系统资源的,所以实际中可能会设置最大并发数来保证服务器的安全和稳定,所以这个理论最大并发数是不可能达到的。

实际中并发数和业务是直接相关的,服务器支持几十万连接是没问题的

由于LVS这套软件负载均衡技术,虽说并发数能达到几十万,但是淘宝实在是太挣钱了,老百姓花钱的能力太强了,淘宝网的用户已经达到千万、上亿级别了。

并且此时的服务器架构,已经是在全国不同的地区,有很多的机房了,并且用户也是分散在全国不同的地区,和服务器的距离各不相同;

新疆的用户访问淘宝网,请求如果是发给了杭州的淘宝服务器,那这个过程显然是太慢太慢了。。

你得让新疆的用户,访问淘宝网,这个请求发给了新疆周边的淘宝服务器、或者说找到一个离新疆最近的淘宝服务器(前提是,淘宝在新疆地区周边部署了机房),要不只能通过网络去找其他地区的服务器了。

image-20220415182328567

以阿里云官网提供的资料来看,如果是新疆的用户,离得最近的就是呼和浩特这个机房。

DNS负载均衡

在DNS服务器中可以配置一个域名、解析到多个IP地址,每个IP地址对应不同地区的机房服务器IP。

用户在不同的地区访问www.taobao.com时,DNS服务器会自动判断该用户所在地区,然后选择离他最近的淘宝服务器,返回其IP地址提供访问。

因此实现了DNS负载均衡,让用户可以访问离自己最近的淘宝网服务器,这样的话,只要增加机房,扩大服务器规模,无论你是千万、千亿级别的并发量,都可以负载均衡、分发给在全国各地的机房了,因此网站入口的并发再也不是问题。

image-20220415183413252

问题又来了

此时流量入口,不是什么大问题了,难题依然是在业务的复杂度上、业务发展、数据越来越恐怖,后续的优化、又是在数据库角度了

第N次升级

引入 NoSQL 数据库 Redis

原因

  • 高性能读写:Redis 基于内存存储数据,具有极高的读写速度,能够满足高并发场景下对数据快速访问的需求。例如,在电商系统中,对于热门商品的库存信息、用户的购物车数据等,使用 Redis 可以快速读写,减少响应时间,提升用户体验。
  • 数据结构丰富:Redis 支持多种数据结构,如字符串、哈希、列表、集合和有序集合等。这些丰富的数据结构可以方便地实现各种业务逻辑,如使用哈希结构存储用户信息,使用有序集合实现排行榜功能等。
  • 缓存功能强大:可以作为缓存层,将经常访问的数据存储在 Redis 中,减少对后端数据库的访问压力。当有新的数据写入时,还可以通过缓存更新策略保证数据的一致性。

应用场景

  • 缓存加速:将商品详情页、热门搜索词等数据缓存到 Redis 中,当用户访问时直接从缓存中获取,避免频繁查询数据库。
  • 会话管理:存储用户的会话信息,实现用户登录状态的快速验证和管理。
  • 计数器和排行榜:利用 Redis 的原子操作和有序集合实现商品的浏览量统计、销售排行榜等功能。

引入搜索引擎技术 ElasticSearch

原因

  • 全文搜索能力:ElasticSearch 具有强大的全文搜索功能,能够快速准确地在大量数据中查找匹配的信息。在电商场景中,用户可以通过关键词搜索商品,ElasticSearch 可以在毫秒级的时间内返回搜索结果。
  • 分布式架构:支持分布式部署,可以水平扩展节点,处理海量数据和高并发的搜索请求。随着业务的发展,数据量不断增加,ElasticSearch 的分布式特性可以保证系统的性能和可扩展性。
  • 实时性强:数据写入后可以立即被搜索到,满足实时搜索的需求。例如,当商品信息更新后,用户可以马上搜索到最新的商品数据。

应用场景

  • 商品搜索:为用户提供快速、准确的商品搜索服务,支持多种搜索方式,如关键词搜索、分类搜索、价格区间搜索等。
  • 日志分析:对系统日志、用户行为日志等进行分析,帮助企业了解用户行为、发现系统问题。
  • 数据挖掘:通过对商品数据、用户评价等进行挖掘,为企业提供市场分析和决策支持。

代码架构升级与业务拆分

好处

  • 提高开发效率:将大功能拆分为小功能,每个小功能由专门的团队负责开发和维护,团队成员可以更加专注于自己的业务领域,提高开发效率和代码质量。
  • 便于维护和扩展:当业务需求发生变化时,只需要对相应的小功能进行修改和扩展,不会影响到其他部分的代码。例如,如果要对天猫超市的业务进行调整,只需要修改天猫超市代码部分,而不会对淘宝网其他业务产生影响。
  • 增强系统的灵活性和可伸缩性:不同的小功能可以根据业务需求独立部署和扩展,提高系统的整体性能和可用性。

复杂功能抽象成微服务

优势

  • 代码复用:将用户数据管理系统、订单管理系统等公共功能抽象为微服务,多个应用可以共享这些服务,避免了代码的重复开发和维护,提高了代码的复用率。
  • 独立部署和扩展:每个微服务可以独立部署和扩展,根据自身的负载情况动态调整资源,提高了系统的资源利用率和可伸缩性。
  • 团队协作高效:不同的微服务由专门的团队负责维护,团队之间可以并行开发和部署,提高了开发效率和响应速度。

微服务模式下的开发与运维挑战

开发挑战

  • 服务间通信:微服务之间需要进行通信,需要选择合适的通信协议和框架,如 HTTP、RPC 等,并处理好服务间的调用超时、重试等问题。
  • 分布式事务:当一个业务操作涉及多个微服务时,需要保证数据的一致性,解决分布式事务问题是一个挑战。

运维挑战

  • 服务监控和管理:需要对多个微服务进行监控和管理,包括服务的状态、性能指标、日志等,及时发现和解决问题。
  • 部署和更新:微服务的部署和更新更加频繁,需要建立自动化的部署和更新机制,确保服务的快速上线和稳定运行。

为了应对这些挑战,可以采用服务注册与发现、分布式配置管理、熔断机制、自动化测试和部署等技术和工具,如使用 ZooKeeper、Consul 进行服务注册与发现,使用 Docker 和 Kubernetes 进行容器化部署和管理等。

容器时代

在前面架构升级的基础上引入容器技术,能够为系统带来更高的灵活性、可移植性和资源利用率,以下是详细介绍:

容器技术概述

容器是一种轻量级的虚拟化技术,它将应用程序及其依赖项打包成一个独立的容器镜像,该镜像包含了运行应用所需的一切:代码、运行时环境、系统工具、系统库等。容器之间相互隔离,共享操作系统内核,通过容器编排工具(如Kubernetes)可以对容器进行高效的管理和调度。

引入容器技术的好处

开发部署方面

  • 环境一致性:开发、测试和生产环境保持一致,避免了“在我的机器上能运行,在生产环境不行”的问题。开发人员可以将应用程序及其依赖项打包到容器中,确保在不同环境中都能以相同的方式运行,减少了因环境差异导致的故障。
  • 快速部署和迭代:容器的启动速度极快,通常只需几秒钟,相比传统的虚拟机部署方式,大大缩短了应用的部署时间。这使得开发团队能够更快速地进行代码部署和功能迭代,提高了开发效率。
  • 资源利用率高:容器共享操作系统内核,不需要像虚拟机那样为每个实例分配独立的操作系统,因此占用的资源更少。在相同的硬件资源下,可以运行更多的容器化应用,提高了服务器的资源利用率。

运维管理方面

  • 易于扩展和收缩:通过容器编排工具,可以根据应用的负载情况动态地扩展或收缩容器的数量。例如,在电商促销活动期间,可以自动增加应用容器的数量来应对高并发流量;活动结束后,再减少容器数量以节省资源。
  • 故障隔离:容器之间相互隔离,一个容器出现故障不会影响其他容器的正常运行。运维人员可以快速定位和解决问题,提高了系统的可靠性和稳定性。
  • 版本控制和回滚:容器镜像可以进行版本控制,方便记录应用的不同版本。当新版本出现问题时,可以快速回滚到之前的稳定版本,降低了系统风险。

容器技术的应用场景

微服务架构

在微服务架构中,每个微服务都可以打包成一个独立的容器,通过容器编排工具进行管理和调度。容器的轻量级和快速部署特性使得微服务的开发、部署和维护更加高效,能够更好地实现微服务的独立开发、部署和扩展。

持续集成和持续部署(CI/CD)

容器技术与 CI/CD 流程紧密结合,开发人员提交代码后,通过自动化的 CI/CD 工具可以自动构建容器镜像,并将其部署到测试和生产环境中。这实现了代码的快速迭代和持续交付,提高了软件的发布效率和质量。

容器技术的实现步骤

构建容器镜像

使用 Dockerfile 来定义容器镜像的构建过程。Dockerfile 是一个文本文件,包含了一系列的指令,用于指定基础镜像、安装依赖项、复制应用代码等操作。例如:

# 使用基础镜像
FROM python:3.8-slim

# 设置工作目录
WORKDIR /app

# 复制应用代码
COPY . /app

# 安装依赖项
RUN pip install --no-cache-dir -r requirements.txt

# 暴露端口
EXPOSE 8000

# 定义启动命令
CMD ["python", "app.py"]

使用 docker build 命令根据 Dockerfile 构建容器镜像:

docker build -t myapp:1.0 .

运行容器

使用 docker run 命令运行容器:

docker run -d -p 8000:8000 myapp:1.0

其中,-d 表示在后台运行容器,-p 8000:8000 表示将容器内部的 8000 端口映射到主机的 8000 端口。

容器编排和管理

使用 Kubernetes 等容器编排工具对容器进行管理和调度。首先需要创建 Kubernetes 集群,然后使用 YAML 文件定义应用的部署和服务配置,例如:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp-container
        image: myapp:1.0
        ports:
        - containerPort: 8000

使用 kubectl apply 命令将配置文件应用到 Kubernetes 集群中:

kubectl apply -f myapp-deployment.yaml

引入容器技术的挑战及解决方法

网络管理

  • 挑战:容器之间的网络通信和容器与外部网络的通信需要进行合理的配置和管理,否则可能会出现网络不通、性能瓶颈等问题。
  • 解决方法:使用 Kubernetes 的网络策略和网络插件来管理容器网络,如 Calico、Flannel 等。这些插件可以提供安全的网络隔离和高效的网络通信。

安全问题

  • 挑战:容器的隔离性并不是绝对的,存在一定的安全风险,如容器逃逸、漏洞利用等。
  • 解决方法:采用安全的基础镜像,定期更新镜像和应用程序,使用安全扫描工具对容器镜像进行漏洞扫描,同时加强容器运行时的安全配置,如限制容器的权限、启用安全审计等。

存储管理

  • 挑战:容器是无状态的,当容器重启或销毁时,数据会丢失。对于需要持久化存储的应用,需要进行合理的存储管理。
  • 解决方法:使用 Kubernetes 的持久化卷(Persistent Volume)和持久化卷声明(Persistent Volume Claim)来管理容器的持久化存储,支持多种存储后端,如 NFS、Ceph 等。

image-20220415205344370

image-20220415184453075

目前市面上最主流的就是通过docker容器技术管理微服务应用,每一个微服务也就是一个个应用程序,全部运行在docker容器里,当容器数量过多后,你必须进行容器编排管理。

目前最主流的docker管理平台肯定是Kubernetes了。

那置于容器是什么,未来于超老师再去讲解了。

以云平台承载系统

到这里,就不是关乎于网站架构的性能问题了,而是成本问题,机器的运行、管理成本,服务器很贵的,部门每个月都有支出预算,这个月服务器费用是50万,如何降低个10万?是不是需要合理的去规划机器的硬件配置,以及不用的机器,是否要回收,关机?

机房的电费也是很贵的。。

问题它又来了

使用容器化技术后服务动态扩缩容问题得以解决,但是物理机器还是需要公司自身来管理

在非大促的时候,还是需要闲置着大量的机器资源来应对大促,机器自身成本和运维成本都极高,资源利用率低

image-20220415210655200

现在的企业,要么是用公有云(阿里、腾讯、华为云等),部署运行自己的应用;

要么就是自己有机房、搭建私有云平台,管理虚拟机。

核心都是在与系统部署在云平台上,利用云平台的海量机器资源,以及可以动态伸缩机器资源,可以在如大促的时候申请更多的机器硬件,结合docker、k8s快速部署业务;

在大促结束之后,在降低、释放资源,真正做到按需付费,资源利用率提高了,也很大的降低了运营成本。

在经历了前面一系列架构升级,包括引入容器技术等之后,使用云平台承载系统是进一步提升系统灵活性、可扩展性和降低成本的重要举措。以下是关于以云平台承载系统的详细介绍:

云平台概述

云平台是一种基于云计算技术的服务平台,它提供了计算、存储、网络等基础设施资源,以及数据库、中间件等平台服务,用户可以通过互联网按需使用这些资源和服务,无需自行搭建和维护硬件设施。常见的云平台有阿里云、腾讯云、亚马逊 AWS、微软 Azure 等。

使用云平台承载系统的优势

成本效益

  • 按需付费:云平台采用按需付费的模式,用户只需根据实际使用的资源量进行付费,无需前期投入大量资金购买硬件设备和软件许可。例如,在业务低谷期可以减少资源使用,降低成本;在业务高峰期可以随时增加资源,满足业务需求。
  • 降低运维成本:云平台提供商负责基础设施的维护和管理,包括硬件的更新、软件的升级、安全防护等,用户无需组建专业的运维团队,从而降低了运维成本。

可扩展性

  • 弹性扩展:云平台具有强大的弹性扩展能力,能够根据系统的负载情况自动调整资源。当业务流量突然增加时,可以快速增加计算、存储等资源;当流量减少时,又可以及时释放资源,避免资源浪费。例如,电商平台在促销活动期间可以轻松应对高并发流量。
  • 全球扩展:云平台通常在全球多个地区设有数据中心,用户可以根据业务需求选择合适的地理位置部署系统,实现全球范围内的业务扩展,提高用户访问速度和体验。

高可用性和可靠性

  • 冗余设计:云平台采用冗余设计,将数据和应用程序分布在多个节点和数据中心,当某个节点或数据中心出现故障时,系统可以自动切换到其他正常的节点继续运行,保证系统的高可用性。
  • 数据备份和恢复:云平台提供数据备份和恢复服务,定期对用户的数据进行备份,确保数据的安全性和可恢复性。即使发生数据丢失或损坏,也可以快速恢复到最近一次备份的状态。

技术创新

  • 先进技术支持:云平台不断引入和推广新的技术和服务,如人工智能、机器学习、大数据分析等,用户可以方便地使用这些先进技术来提升系统的功能和性能,推动业务创新。
  • 快速迭代:云平台提供商持续更新和优化平台功能,用户可以及时享受到最新的技术成果,无需自行进行技术研发和升级,加快了业务的迭代速度。

云平台的服务类型

基础设施即服务(IaaS)

  • 特点:提供基础的计算、存储和网络资源,用户可以在这些资源上自行搭建和管理操作系统、数据库和应用程序。例如,用户可以在云平台上创建虚拟机、存储卷和网络实例等。
  • 适用场景:适合对系统有较高定制化需求的用户,如大型企业的核心业务系统、科研机构的计算密集型应用等。

平台即服务(PaaS)

  • 特点:提供了一个完整的开发和运行环境,包括操作系统、中间件、数据库等,用户只需专注于应用程序的开发和部署,无需关心底层基础设施的管理。例如,使用云平台提供的 PaaS 服务可以快速搭建和运行 Web 应用。
  • 适用场景:适合开发团队,能够提高开发效率,缩短开发周期,降低开发成本。

软件即服务(SaaS)

  • 特点:用户通过互联网直接使用云平台提供的软件应用,无需进行安装和维护。例如,在线办公软件、客户关系管理系统等。
  • 适用场景:适合中小企业和个人用户,无需投入大量资金购买和维护软件,只需按需订阅服务即可。

云平台承载系统的实施步骤

评估和规划

  • 业务需求分析:对系统的业务需求、性能要求、数据量等进行全面评估,确定所需的云平台服务类型和资源规格。
  • 成本估算:根据业务需求和资源使用情况,估算在云平台上运行系统的成本,并与自建基础设施进行对比,评估成本效益。
  • 迁移策略制定:根据系统的现状和特点,制定合理的迁移策略,确定是采用直接迁移、重新架构还是混合迁移等方式。

选择云平台和服务

  • 云平台选择:根据业务需求、预算、技术支持等因素,选择合适的云平台提供商。考虑因素包括云平台的可靠性、性能、安全性、服务质量等。
  • 服务选型:根据业务需求选择合适的云平台服务类型,如选择 IaaS 服务自行搭建系统,或选择 PaaS 服务快速开发和部署应用。

系统迁移和部署

  • 数据迁移:将系统的数据从原有环境迁移到云平台上,可以采用在线迁移或离线迁移的方式。在迁移过程中,要确保数据的完整性和一致性。
  • 应用部署:将应用程序部署到云平台上,可以使用容器技术和容器编排工具(如 Kubernetes)进行自动化部署和管理。
  • 配置和优化:对云平台上的系统进行配置和优化,包括网络配置、安全设置、性能调优等,确保系统的稳定运行和高性能。

监控和管理

  • 监控系统性能:使用云平台提供的监控工具或第三方监控工具,对系统的性能指标进行实时监控,如 CPU 使用率、内存使用率、网络带宽等。
  • 故障处理和应急响应:建立故障处理和应急响应机制,及时处理系统出现的故障和异常情况,确保系统的高可用性。
  • 持续优化:根据监控数据和业务需求,持续对系统进行优化和调整,提高系统的性能和效率。

面临的挑战及解决方法

安全问题

  • 挑战:云平台上的数据和应用程序面临着各种安全威胁,如网络攻击、数据泄露、恶意软件感染等。
  • 解决方法:采用多层次的安全防护措施,包括网络安全防护、数据加密、身份认证和访问控制等。同时,选择具有良好安全记录和技术实力的云平台提供商,并定期进行安全审计和漏洞扫描。

供应商锁定

  • 挑战:不同云平台提供商的技术和服务存在差异,一旦选择了某个云平台,可能会面临供应商锁定的问题,难以迁移到其他云平台。
  • 解决方法:在设计系统架构时,采用开放标准和技术,尽量减少对特定云平台的依赖。同时,制定合理的迁移策略,以便在需要时能够顺利迁移到其他云平台。

网络延迟

  • 挑战:云平台的服务器通常位于数据中心,与用户之间可能存在一定的网络距离,导致网络延迟增加,影响用户体验。
  • 解决方法:选择地理位置靠近用户的云数据中心,采用内容分发网络(CDN)等技术加速数据传输,减少网络延迟。

云平台是什么

所谓的云平台,就是把海量机器资源,通过统一的资源管理,抽象为一个资源整体,在之上可按需动态申请硬件资源(如CPU、内存、网络等),并且之上提供通用的操作系统,提供常用的技术组件(如Hadoop技术栈,MPP数据库等)供用户使用,甚至提供开发好的应用,用户不需要关系应用内部使用了什么技术,就能够解决需求(如音视频转码服务、邮件服务、个人博客等)。

在云平台中会涉及如下几个概念:

  • IaaS:基础设施即服务。对应于上面所说的机器资源统一为资源整体,可动态申请硬件资源的层面;
  • PaaS:平台即服务。对应于上面所说的提供常用的技术组件方便系统的开发和维护;
  • SaaS:软件即服务。对应于上面所说的提供开发好的应用或服务,按功能或性能要求付费。

架构师原则

    • N+1设计。系统中的每个组件都应做到没有单点故障;
    • 回滚设计。确保系统可以向前兼容,在系统升级时应能有办法回滚版本;
    • 禁用设计。应该提供控制具体功能是否可用的配置,在系统出现故障时能够快速下线功能;
    • 监控设计。在设计阶段就要考虑监控的手段;
    • 多活数据中心设计。若系统需要极高的高可用,应考虑在多地实施数据中心进行多活,至少在一个机房断电的情况下系统依然可用;
    • 采用成熟的技术。刚开发的或开源的技术往往存在很多隐藏的bug,出了问题没有商业支持可能会是一个灾难;
    • 资源隔离设计。应避免单一业务占用全部资源;
    • 架构应能水平扩展。系统只有做到能水平扩展,才能有效避免瓶颈问题;
    • 非核心则购买。非核心功能若需要占用大量的研发资源才能解决,则考虑购买成熟的产品;
    • 使用商用硬件。商用硬件能有效降低硬件故障的机率;
    • 快速迭代。系统应该快速开发小功能模块,尽快上线进行验证,早日发现问题大大降低系统交付的风险;
    • 无状态设计。服务接口应该做成无状态的,当前接口的访问不依赖于接口上次访问的状态。

架构师在设计和构建系统架构时,需要遵循一系列原则以确保系统的质量、可维护性、可扩展性和性能等。以下是一些常见的架构师原则:a

通用原则

简单性原则

  • 含义:尽可能设计简单的架构,避免过度复杂的设计。简单的架构易于理解、开发、测试和维护,能够降低系统的整体复杂度和开发成本。
  • 应用示例:在设计数据库表结构时,避免创建过多的关联表和复杂的关系,尽量采用简洁明了的设计。例如,对于一个简单的博客系统,用户表和文章表之间的关联可以通过用户 ID 简单关联,而不是引入过多的中间表。

可维护性原则

  • 含义:架构应具备良好的可维护性,便于开发团队在后续的开发过程中进行代码修改、功能扩展和故障修复。这包括代码的可读性、模块化设计和清晰的文档等。
  • 应用示例:采用模块化的设计思想,将系统拆分成多个独立的模块,每个模块负责特定的功能。例如,在一个电商系统中,可以将商品管理、订单管理、用户管理等功能分别封装成独立的模块,每个模块有清晰的接口和职责,便于开发人员进行维护和扩展。

可扩展性原则

  • 含义:架构应能够轻松应对未来业务的增长和变化,通过添加新的功能模块、服务或资源,而不需要对整个系统进行大规模的重构。
  • 应用示例:在设计微服务架构时,各个微服务之间通过接口进行通信,当需要添加新的业务功能时,可以创建新的微服务并与现有微服务进行集成。例如,电商系统中添加直播带货功能时,可以独立开发一个直播微服务,并与原有的商品、订单等微服务进行对接。

可靠性原则

  • 含义:确保系统在各种情况下都能稳定运行,具备容错能力和故障恢复能力。这包括采用冗余设计、备份和恢复机制等。
  • 应用示例:在数据库设计中,采用主从复制或集群技术,当主数据库出现故障时,从数据库可以自动接管服务,保证数据的可用性。同时,定期对数据库进行备份,以便在数据丢失时能够快速恢复。

性能原则

  • 含义:架构应能够满足系统的性能要求,包括响应时间、吞吐量等指标。通过合理的算法选择、资源分配和缓存机制等提高系统的性能。
  • 应用示例:在高并发的 Web 应用中,使用缓存技术(如 Redis)缓存经常访问的数据,减少对数据库的访问次数,提高系统的响应速度。同时,采用负载均衡技术将请求均匀分配到多个服务器上,提高系统的吞吐量。

技术选型原则

合适性原则

  • 含义:根据系统的业务需求、性能要求、团队技术栈等因素选择合适的技术和工具,而不是盲目追求新技术。
  • 应用示例:对于一个小型的企业内部管理系统,如果业务逻辑相对简单,对性能要求不高,可以选择轻量级的开发框架和数据库,如 Flask + SQLite,而不是使用复杂的大型框架和分布式数据库。

成熟度原则

  • 含义:优先选择成熟稳定的技术和工具,这些技术通常有完善的文档、丰富的社区支持和大量的成功案例,能够降低技术风险。
  • 应用示例:在选择数据库时,如果业务对数据的一致性和事务处理要求较高,优先选择成熟的关系型数据库,如 MySQL 或 Oracle,而不是选择一些新兴的、尚未经过充分验证的数据库。

开放性原则

  • 含义:选择具有开放性和标准化的技术和接口,便于与其他系统进行集成和扩展,避免技术锁定。
  • 应用示例:在设计系统接口时,采用 RESTful API 标准,这样可以方便与不同的客户端(如 Web 端、移动端)进行交互,也便于与第三方系统进行集成。

团队协作原则

沟通原则

  • 含义:架构师需要与开发团队、测试团队、运维团队等进行有效的沟通,确保各方对架构设计的理解一致,避免因沟通不畅导致的问题。
  • 应用示例:定期组织架构评审会议,向团队成员详细介绍架构设计方案,听取各方的意见和建议,并及时进行沟通和协调。

分工原则

  • 含义:明确各个团队成员的职责和分工,确保每个人都清楚自己的工作内容和目标,提高团队的协作效率。
  • 应用示例:在一个大型项目中,架构师负责整体架构设计,开发人员负责具体的代码实现,测试人员负责系统测试,运维人员负责系统的部署和维护,每个角色都有明确的职责和工作流程。

知识共享原则

  • 含义:鼓励团队成员之间进行知识共享和经验交流,提高整个团队的技术水平和创新能力。
  • 应用示例:组织技术分享会,让团队成员分享自己在项目中遇到的问题和解决方案,或者学习到的新技术和新方法。同时,建立内部的技术文档和知识库,方便团队成员查阅和学习。

wiki文档库。

Copyright © www.yuchaoit.cn 2025 all right reserved,powered by Gitbook作者:于超 2025-02-11 19:24:04

results matching ""

    No results matching ""