大型网站系统架构的演化

2023-05-16

前言

一个成熟的大型网站(如淘宝、京东等)的系统架构并不是开始设计就具备完整的高性能、高可用、安全等特性,它总是随着用户量的增加,业务功能的扩展逐渐演变完善的,在这个过程中,开发模式、技术架构、设计思想也发生了很大的变化,就连技术人员也从几个人发展到一个部门甚至一条产品线。所以成熟的系统架构是随业务扩展而完善出来的,并不是一蹴而就;不同业务特征的系统,会有各自的侧重点,例如淘宝,要解决海量的商品信息的搜索、下单、支付,例如腾讯,要解决数亿的用户实时消息传输,百度它要处理海量的搜索请求,他们都有各自的业务特性,系统架构也有所不同。尽管如此我们也可以从这些不同的网站背景下,找出其中共用的技术,这些技术和手段可以广泛运行在大型网站系统的架构中,下面就通过介绍大型网站系统的演化过程,来认识这些技术和手段。

一、最开始的网站架构

最初的架构,应用程序、数据库、文件都部署在一台服务器上,如图:

二、应用、数据、文件分离

随着业务的扩展,一台服务器已经不能满足性能需求,故将应用程序、数据库、文件各自部署在独立的服务器上,并且根据服务器的用途配置不同的硬件,达到最佳的性能效果。

三、利用缓存改善网站性能

在硬件优化性能的同时,同时也通过软件进行性能优化,在大部分的网站系统中,都会利用缓存技术改善系统的性能,使用缓存主要源于热点数据的存在,大部分网站访问都遵循28原则(即80%的访问请求,最终落在20%的数据上),所以我们可以对热点数据进行缓存,减少这些数据的访问路径,提高用户体验。

缓存实现常见的方式是本地缓存、分布式缓存。当然还有CDN、反向代理等,这个后面再讲。本地缓存,顾名思义是将数据缓存在应用服务器本地,可以存在内存中,也可以存在文件,OSCache就是常用的本地缓存组件。本地缓存的特点是速度快,但因为本地空间有限所以缓存数据量也有限。分布式缓存的特点是,可以缓存海量的数据,并且扩展非常容易,在门户类网站中常常被使用,速度按理没有本地缓存快,常用的分布式缓存是Memcached、Redis。

四、使用集群改善应用服务器性能

应用服务器作为网站的入口,会承担大量的请求,我们往往通过应用服务器集群来分担请求数。应用服务器前面部署负载均衡服务器调度用户请求,根据分发策略将请求分发到多个应用服务器节点。

常用的负载均衡技术硬件的有F5,价格比较贵,软件的有LVS、Nginx、HAProxy。LVS是四层负载均衡,根据目标地址和端口选择内部服务器,Nginx是七层负载均衡和HAProxy支持四层、七层负载均衡,可以根据报文内容选择内部服务器,因此LVS分发路径优于Nginx和HAProxy,性能要高些,而Nginx和HAProxy则更具配置性,如可以用来做动静分离(根据请求报文特征,选择静态资源服务器还是应用服务器)。

五、数据库读写分离和分库分表

随着用户量的增加,数据库成为最大的瓶颈,改善数据库性能常用的手段是进行读写分离以及分表,读写分离顾名思义就是将数据库分为读库和写库,通过主备功能实现数据同步。分库分表则分为水平切分和垂直切分,水平切换则是对一个数据库特大的表进行拆分,例如用户表。垂直切分则是根据业务不同来切换,如用户业务、商品业务相关的表放在不同的数据库中。

六、使用CDN和反向代理提高网站性能

假如我们的服务器都部署在成都的机房,对于四川的用户来说访问是较快的,而对于北京的用户访问是较慢的,这是由于四川和北京分别属于电信和联通的不同发达地区,北京用户访问需要通过互联路由器经过较长的路径才能访问到成都的服务器,返回路径也一样,所以数据传输时间比较长。对于这种情况,常常使用CDN解决,CDN将数据内容缓存到运营商的机房,用户访问时先从最近的运营商获取数据,这样大大减少了网络访问的路径。比较专业的CDN运营商有蓝汛、网宿。

而反向代理,则是部署在网站的机房,当用户请求达到时首先访问反向代理服务器,反向代理服务器将缓存的数据返回给用户,如果没有没有缓存数据才会继续走应用服务器获取,也减少了获取数据的成本。反向代理有Squid,Nginx。

七、使用分布式文件系统

用户一天天增加,业务量越来越大,产生的文件越来越多,单台的文件服务器已经不能满足需求。需要分布式的文件系统支撑。常用的分布式文件系统有NFS。

八、使用NoSql和搜索引擎

对于海量数据的查询,我们使用nosql数据库加上搜索引擎可以达到更好的性能。并不是所有的数据都要放在关系型数据中。常用的NOSQL有mongodb和redis,搜索引擎有lucene。

九、将应用服务器进行业务拆分

随着业务进一步扩展,应用程序变得非常臃肿,这时我们需要将应用程序进行业务拆分,如百度分为新闻、网页、图片等业务。每个业务应用负责相对独立的业务运作。业务之间通过消息进行通信或者同享数据库来实现。

十、搭建分布式服务

这时我们发现各个业务应用都会使用到一些基本的业务服务,例如用户服务、订单服务、支付服务、安全服务,这些服务是支撑各业务应用的基本要素。我们将这些服务抽取出来利用分部式服务框架搭建分布式服务。淘宝的Dubbo是一个不错的选择。

小结

大型网站的架构是根据业务需求不断完善的,根据不同的业务特征会做特定的设计和考虑,本文只是讲述一个常规大型网站会涉及的一些技术和手段。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大型网站系统架构的演化 的相关文章

  • 自制Anki选择题模板(支持桌面版/移动版)

    复习面试知识偶然发现了一个小东西 anki xff0c 感觉挺好用就是模板有点少 xff0c 做选择题比较费劲 xff0c 网上找了几个终究不如我心意 xff0c 于是参考前人源码 xff0c 自己改编了一个看起来还不错的版本 这是很久以前
  • VMware Workstation 安装 CentOS 7 虚拟机

    安装步骤 VMware 创建CentOS虚拟机 Jack魏的博客 CSDN博客 https blog csdn net WeiHao0240 article details 100894672 VMware Workstation Pro
  • 基于 HAProxy + Keepalived 搭建 RabbitMQ 高可用集群

    RabbitMQ 集群 通常情况下 xff0c 在集群中我们把每一个服务称之为一个节点 xff0c 在 RabbitMQ 集群中 xff0c 节点类型可以分为两种 xff1a 内存节点 xff1a 元数据存放于内存中 为了重启后能同步数据
  • [CentOS7] Install RabbitMQ Using PackageCloud Yum Repository

    Set up Yum Repository A quick way to set up the repository is to use a Package Cloud provided script It is not a require
  • go语言基础之map的增删改查

    package main span class token function import span span class token string 34 fmt 34 span func span class token function
  • 安卓getSharedPreferences 与 getPreferences 与getDefaultSharedPreferences的区别

    整理了一下getSharedPreferences 与 getPreferences 与 getDefaultSharedPreferences 的区别 xff0c 有需要的朋友可以参考下 1 SharedPreferences 简介 为了
  • request、response 中文乱码问题与解决方式

    request乱码 浏览器向服务器发送的请求参数中包含中文字符 xff0c 服务器获取到的请求参数的值是乱码 response乱码 服务器向浏览器发送的数据包含中文字符 xff0c 浏览器中显示的是乱码 乱码产生的原因 不管是request
  • 基于@Transactional注解的Spring事务

    64 Transactional注解 64 Transactional 可以作用于接口 接口方法 类以及类方法上 当作用于类上时 xff0c 该类的所有 public 方法将都具有该类型的事务属性 xff0c 同时 xff0c 我们也可以在
  • 解决Win7系统DHCP Client服务已设置为“自动”开机仍然无法启动问题

    前言 问题描述 xff1a 由于使用了管家 360等软件进行过网络优化 xff0c 导致每次开机不能正常获取IP连接网络 xff0c 并且系统服务项DHCP Client已设置为 自动 xff0c 但是开机仍无法正常启动 网上大部分解决方法
  • java -jar命令运行jar包时指定外部依赖jar包

    大家都知道一个java应用项目可以打包成一个jar xff0c 当然你必须指定一个拥有main函数的main class作为你这个jar包的程序入口 具体的方法是修改jar包内目录META INF下的MANIFEST MF文件 比如有个叫做
  • IntelliJ idea设置显示错误代码提示

    idea默认关闭自动编译 xff0c 所以一些编译错误只有在编译的时候才会提示 xff0c 例如修改了引用类 按图中设置打开自动编译 xff1a 注意 xff1a idea默认打开省电模式 xff0c 自动编译在省电模式下被禁用 xff0c
  • HTTPS协议及其工作原理

    一 什么是HTTPS HTTP 协议 xff08 HyperText Transfer Protocol xff0c 超文本传输协议 xff09 是客户端浏览器或其他程序与Web服务器之间的应用层通信协议 HTTP协议传输的数据都是未加密的
  • Tomcat配置https方式访问

    1 准备安全证书 获得安全证书有两种方式 xff1a 一种方式是到权威机构申购CA证书 xff0c 还有一种方式是创建自我签名的证书 本文以自签名证书为例 xff0c 使用SUN公司提供的证书制作工具keytool制作自签证书 xff0c
  • Java证书工具keytool用法总结

    Keytool简单介绍 keytool 是个密钥和证书管理工具 它使用户能够管理自己的公钥 私钥对及相关证书 xff0c 用于 xff08 通过数字签名 xff09 自我认证 xff08 用户向别的用户 服务认证自己 xff09 或数据完整
  • TaskSnapShot源码分析

    功能 在android设备上 xff0c 打开最近任务 xff0c 会显示退出app时的界面关机重启后马上打开最近任务 xff0c 还是会显示关机前的app列表 Android为了实现上述的功能 xff0c 在每次app切换时都会对app界
  • go语言基础之结构体赋值

    span class token keyword package span main span class token keyword import span span class token string 34 fmt 34 span s
  • MySQL架构,贴过来,抽空看看

    麻雀虽小 xff0c 五脏俱全 MySQL虽然以简单著称 xff0c 但其内部结构并不简单 本章从MySQL逻辑组成 xff0c 物理组成 xff0c 以及相关工具这几个角度来介绍MySQL的整体架构组成 xff0c 希望能够让读者对MyS
  • 不同人眼里的华为

    经济学人 称它是 xff1a 欧美跨国公司的灾难 xff0c 时代 杂志称它是 xff1a 所有电信产业巨头最危险的竞争对手 xff0c 爱立信全球总裁卫翰思 xff08 Hans Vestberg xff09 说 xff1a 它是我们最尊
  • 一个案例引发的思考

    今天下午 xff0c 团队开了一个简短的版本总结会 会上测试经理分析了一个案例 xff1a 某子程序在转测试后发现不能被平台调度 xff0c 原因是子程序的调度入口跟不符合平台规范 很明显开发在转测试前没有充分自验证 xff0c 测试经理提
  • C++动态创建对象应用技术讲解

    Native C 43 43 是不支持根据类名的C 43 43 动态创建对象 比如从一个文本文件中读取类名然后构造一个对象 主要原因是没有丰富的动态元信息 xff0c 没有单根类库 然而可以用几种技术进行实现 如果是类似Spring那样的根

随机推荐

  • 人际关系3大禁忌

    一 锋芒毕露 所有人都会抓机会除掉你的锋芒 xff0c 一个到处宣扬自己的能力的人是很容易被打击的 不轻易出手 xff08 出口 xff09 xff0c 多用 我试试看 等谦逊言辞 二 自负 给人一种目空一切 xff0c 难以团队协作和领导
  • 自动化测试系统的软件架构(转)

    自动化测试系统的软件架构 一 xff0e 为什么要自动化测试系统 随着产品可测性设计和仪表程控制技术的不断完善和提高 xff0c 自动化测试系统越来越广泛的被应用于从产品设计研发到生产制造验证的各个环节 自动化测试系统之所以风靡 xff0c
  • 一种应用程序命令执行架构设计

    一种应用程序命令执行架构设计 袁永福 2011 7 5 有感于一些程序中 ASPX页面中直接编写功能性代码 xff0c 难于组织和维护 xff0c 实现不了程序的高度可配置化 xff0c 自此提出一种应用程序命令执行架构 xff0c 其架构
  • 收藏一个架构博客

    http phl iteye com category 110171 http blog s135 com post 385
  • VM(虚拟机)部署自动化

    http www ibm com developerworks cn linux l auto deploy vm index html
  • 设计下一代自动化测试系统

    http www ni com white paper 7483 zhs
  • unity学习资料汇总

    xfeff xfeff unity这两年一直很火 xff0c 之前简单了解了一下 xff0c 个人认为它就像一个精简版的3ds max 为什么这样打比方呢 xff0c 因为我之前比较熟悉3ds max xff0c 初看unity的界面和功能
  • Java内部类的作用

    推荐一 定义 放在一个类的内部的类我们就叫内部类 二 作用 1 内部类可以很好的实现隐藏 一般的非内部类 xff0c 是不允许有 private 与protected权限的 xff0c 但内部类可以 2 xff0e 内部类拥有外围类的所有元
  • Dom4J解析xml文档

    1 DOM4J简介 DOM4J是 dom4j org 出品的一个开源 XML 解析包 DOM4J应用于 Java 平台 xff0c 采用了 Java 集合框架并完全支持 DOM xff0c SAX 和 JAXP DOM4J 使用起来非常简单
  • Eclipse 汉化插件

    汉化Eclipse xff08 1 xff09 下载Eclipse 对应版本的汉化包 下载链接 xff1a http download csdn net detail w57w57w57 7768469 xff08 2 xff09 在ecl
  • 使用java语言,利用多线程调用WebService进行数据处理

    http blog chinaunix net uid 20680669 id 3447319 html
  • excel VBA编程之:单元格保护

    ActiveSheet Unprotect Password 61 34 123 34 Cells 1 4 61 i 此处放上需要处理的代码 ActiveSheet Protect DrawingObjects 61 True Conten
  • vbs宏:excel读取多个文件并合并为一个文件

    Sub MergeFiles Dim p f m amp sh As Worksheet Set sh 61 ActiveSheet Application ScreenUpdating 61 False sh UsedRange Clea
  • vba日期和时间函数汇总和代码

    第一 xff0c vba日期和时间函数的基本用法 Excel中vba日期函数和时间函数分别是DATE和TIME VBA提供了三个无参数函数 xff1a Date Time Now xff0c 分别返回当前电脑系统的日期 时间 日期 43 时
  • 管道过滤器模式(Pipe and Filter)与组合模式(出处:http://haolloyin.blog.51cto.com/1177454/348277)

    之前在 benjielin 前辈的博客中看到 管道过滤器 xff08 Pipe And Filter xff09 模式 xff08 http bj007 blog 51cto com 1701577 345677 xff09 xff0c 当
  • 管道过滤器(Pipe-And-Filter)模式(出处:http://bj007.blog.51cto.com/1701577/345677)

    按照 POSA 面向模式的软件架构 里的说法 xff0c 管道过滤器 xff08 Pipe And Filter xff09 应该属于架构模式 xff0c 因为它通常决定了一个系统的基本架构 管道过滤器和生产流水线类似 xff0c 在生产流
  • 数据库架构的演变

    最近看了很多公司架构的演变的文章 xff0c 发现其中的基本思路和架构演变都很类似 xff0c 这里也总结一下数据库架构的演变以及演变背后的思路 单主机 最开始网站一般都是由典型的LAMP架构演变而来的 xff0c 一般都是一台linux主
  • 如何下载Android源代码

    Android已经火了很长时间了 xff0c 虽然做手机开发也有两年了 xff0c 但是一直没有深入接触到Android 前些天想下载Android源代码来看看 xff0c 没想到http android git kernel org九月初
  • Web数据库

    http baike baidu com link url 61 Tib3flBuOBsLy4IoMAxXt2z36Ms77 mQe85MBq7kJh0XfG7oluhlEinX3Maomb2mboXIcedxDEWvGPIDtNQfxa
  • 大型网站系统架构的演化

    前言 一个成熟的大型网站 xff08 如淘宝 京东等 xff09 的系统架构并不是开始设计就具备完整的高性能 高可用 安全等特性 xff0c 它总是随着用户量的增加 xff0c 业务功能的扩展逐渐演变完善的 xff0c 在这个过程中 xff