网站架构演变

2023-11-16

网站架构演变


大型网站介绍

与传统企业应用系统相比,大型互联网网站系统具有以下特点

1、大流量、高并发
这一点往往是传统企业应用系统根本就不会遇到的问题,比如Goole每日访问量都是几十亿,如果服务器端处理不好早就被压的宕机了。


2、高可用
由于其面向的受众用户很多,所以对其要求也高,系统7 x 24小时运转。

3、海量数据
需要存储和管理的数据非常的庞大,facebook天上传图片量就达到数亿张。

4、用户分布广泛,网络情况复杂
跨市跨区跨省甚至跨国家对大型互联网系统都是正常的

5、网络安全问题
对于大型网站来说,安全问题就非常重要了,因为被更多的人关注着

6、需求变更较频繁
相比传统企业系统有比较固定和成熟的模型和解决方案,互联网系统则比较新,一切都在探索中发展。

7、渐进式发展
没有一开始就设计的完美的架构,只有逐渐演变完美的架构

备注:一切最初不是问题的问题,当数据量和用户量递增到一定规模之后不是问题的问题就成为问题了。

网站架构发展史


初始阶段的网站架构

大型网站都是由小型网站发展而来的,网站架构也一样,由小型简单架构到复杂大型架构。 
小型网站由于开始访问人数不多,不存在多少的并发量,也许只需要一台服务器就足够了。

这阶段往往应用程序、数据库、文件数据都存在同一台服务器上。
经典的LAMP架构往往就是如此

初始阶段网站架构

初始阶段网站架构


应用服务器和数据库服务器分离

随着网站的发展,越来越多的用户访问,一台服务器提供的性能开始并不能很好满足发展需求。 
此时将应用程序、数据库、文件单独各自放在私有服务器上市很有必要的。

备注:应用程序、数据库、文件对服务器配置资源要求是不同的。
应用程序服务器:强大的CPU(处理大量的业务逻辑)
数据库服务器:快速磁盘(固态硬盘)和大内存
文件服务器:大容量磁盘

应用服务器和数据服务器分离

应用服务器和数据服务器分离


使用缓存改善网站性能

网站中很多的数据都是集中在查询部分数据,因此将一些频繁查询和很少改动的数据作为缓存数据存储在内存中, 
可以大大提高网站访问数据性能和减轻数据库查询压力。


网站使用缓存通常可以分为两种:
1、应用服务中的内存缓存(很快)
2、分布式缓存(比较快)

备注:应用程序中的内存缓存受限于服务器内存大小,并且还存在和应用程序抢占资源情况。 
分布式缓存理论上是不存在内存大小限制,因为可以集群。

使用缓存后的网站架构



使用缓存可以有效的减轻网站大流量和并发带给数据库的压力,但是应用程序的压力并没有减小,因此下一步就要使用集群了来减轻应用服务器压力了

应用服务器集群改善网站并发能力

使用集群式网站解决高并发、海量数据问题的常用和有效的手段。当一台服务器处理能力有限时, 
不要试图换更强大的服务器,因为随着业务和流量的增大,再强大的单台服务器都很能满足性能要求。

使用集群架构



备注:
1、负载均衡我们可以选择F5(硬件负载)/nginx(软件负载)
2、应用程序服务器和缓存服务器的集群相对比较简单容易实现
3、最难实现的可能就是数据库服务器的集群了

数据库读写分离提高网站并发能力

随着网站的发展,数据库再一次成为了性能瓶颈。

由于读库和写库都在一个数据库服务器中操作因此数据库压力还是很大。此时将数据库分为一个主库多个读库就可以大大减轻数据库访问压力了。

主库:只进行写/更新操作
从库:只进行查询操作
从库的查询时存在一点点时延的(比较小)

数据库主从热备份,基于日志推拉模式来同步数据

数据库读写分离

备注数据库读写分离后程序段如何访问数据库
1、根据业务是查询操作还是写入操作指定不同的数据库配置
2、由数据库中间件单独统一处理,对请求的SQL语句分析,指定请求数据库

使用反向代理和CDN加速网站响应

由于地理因素和网络环境因素,导致网络环境比较复杂,因此要加速网站访问速度可以借组CDN和反向代理。


CDN和反向代理的基本原理都是缓存,区别在于CDN部署在网络提供商的机房,使用户访问网站服务时,
可以从最近的网络提供商机房那里获取数据(通常是静态文件)。而反向代理则部署在网站的中心机房, 
当用户请求到达中心机房后,首先访问的服务器是反向代理服务器,如果反向代理服务器缓存着用户请求资源的话,那么就直接响应用户。

使用反向代理和CDN加速网站响应



使用CDN和反向代理的目的都是为了尽早返回数据给用户,一方面提高用户访问速度,另一方面可以减轻后端服务器的负载压力。

使用分布式文件系统和分布式数据库系统

分布式数据库是网站数据库拆分的最后手段,只有在单表数据规模非常庞大时才使用。 
更多时候我们倾向业务拆分,将不同的业务数据放在不同的物理服务器上。

使用分布式文件系统和分布式数据库系统

使用NO-SQL和搜索引擎

随着网站业务越来越复杂,对数据存储和检索的需求也越来越复杂,网站需要采用一些非关系型数据库技术入股NOSQL和非数据库查询技术如搜索引擎。

使用NO-SQL和搜索引擎

NoSQL和搜索引擎都是来自互联网的技术手段,对可伸缩的分布式特性具有很好的支持。
应用服务器则通过一个统一的数据访问模块访问各种数据源,减轻应用程序管理诸多数据源的麻烦。

业务拆分

良好的业务拆分可以使得原本复杂的网站架构降低复杂度。

业务拆分

参考

1、大型网站技术架构

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

网站架构演变 的相关文章

  • C++实现——LCS-最大公共子串长度

    求两个字符串的最长公共子串的长度 子串不一定是原串中的连续子串组成 LCS 使用动态规划 include
  • Python基础知识及概念

    Python基础知识及概念 1 注释 单行注释 这是一个单行注释 在程序开发时 同样可以使用 在代码的后面 旁边 增加说明性的文字 但是 需要注意的是 为了保证代码的可读性 注释和代码之间 至少要有 两个空格 示例代码如下 print he
  • Vue-Quill-Editor 设置编辑器中文字的默认字体大小

    Vue Quill Editor 默认字体看起来有些小 如下 设置默认字体大小 ql container 设置默认字号 font size 16px 设置之后
  • 利用jsqlparser解析SQL语句

    时常会遇到很多情况 我们需要对SQL语句进行替换或者拼接 以往我们可能会用StringBuild来进行拼接 StringBuilder sql new StringBuilder sql append select from sql app
  • 开发框架Furion之Winform+SqlSugar

    目录 1 开发环境 2 项目搭建 2 1 创建WinFrom主项目 2 2 创建子项目 2 3 实体类库基础类信息配置 2 3 1 Nuget包及项目引用 2 3 2 实体基类创建 2 4 仓储业务类库基础配置 2 4 1 Nuget包及项

随机推荐

  • pytorch 人脸识别

    import torch import os import numpy as np import torch nn as nn import matplotlib pyplot as plt import time import torch
  • nim游戏 C++

    如果堆中石头的数量 nn 不能被 44 整除 那么你总是可以赢得 Nim 游戏的胜利 class Solution public bool canWinNim int n if n lt 0 return 0 else return n 4
  • 头插法和尾插法的详细区别

    浅析线性表 链表 的头插法和尾插法的区别及优缺点 线性表作为数据结构中比较重要的一种 具有操作效率高 内存利用率高 结构简单 使用方便等特点 今天我们一起交流一下单向线性表的头插法和尾插法的区别及优缺点 线性表因为每个元素都包含一个指向下一
  • IDE0006 加载项目时遇到了错误,已禁用了某些项目功能,例如用于失败项目和依赖于失败项目的其他项目的完整解决方案分析。

    重新打开vs2017就好了 原因猜测 vs来大姨妈了 现象是catch ex 后面是e message 单纯少个x vs没检测出来 辛辛苦苦搜个半天 可能太依赖vs了 懒人专属编辑器
  • npm私有化docker方式部署及使用说明

    一 部署nexus 本文采用docker方式部署nexus 安装docker yum install y docker 拉取nexus镜像 docker pull sonatype nexus3 准备本地映射目录 以便本地化持续存储数据 目
  • python No module named numpy. distutils._msvccompiler in numpy. distutils; trying from distutils

    在cmd 中输入 python setup py install 报错 No module named numpy distutils msvccompiler in numpy distutils trying from distutil
  • Android 报错 : FATAL EXCEPTION:main 解决方法

    今天安卓开发课上碰到的新问题 前景提示 老师让我们自己试一下那个两个页面跳转的效果 于是我就开始写了 然后报错 解决方法 逐一排查 首先要看你mainfest xml里面有没有增加Activity 当然我是加了 但是他还报错 具体代码界面
  • Ubuntu18.04 windows10双系统安装解决grub引导问题

    最近给服务器的电脑升级了ubuntu18 直接用u盘安装 老是说grub引导问题 网上有很多教程真的坑人 说的含含糊糊的 不知道在卖弄什么关子 我参照这两个教程解决了安装问题 十分钟就装好了 感谢你们 https blog csdn net
  • vue Tesseract的 ocr 文字识别

    npm结果页 https www npmjs com package tesseract js tesseract官网地址 https tesseract projectnaptha com npm结果页 npm结果页 tesseract官
  • 如何优雅的统计代码耗时

    点击上方 小强的进阶之路 选择 星标 公众号 优质文章 及时送达 预计阅读时间 16分钟 作者 Jitwxs 原文链接 底部链接可直达 https jitwxs cn 5aa91d10 html 一 前言 代码耗时统计在日常开发中算是一个十
  • R语言—列表

    文章目录 列表 定义 创建列表 List 列表 List 元素的引用 列表 List 元素的修改 访问列表元素和值 去列表化 在列表上使用apply系列函数 递归型列表 列表 R语言的6种模式 向量 矩阵 数组 数据框 列表 因子 向量 矩
  • SQLite如何删除,修改、重命名列

    今天在SQLite数据库中添加了一列 后来发现列名写错了 于是使用SQL语句来修改列名 可是根本不管用 首先 请放弃alter吧 sqlite官方说明如下 SQLite supports a limited subset of ALTER
  • 【JS】JavaScript时间与时间戳相互转换

    时间与时间戳相互转换 1 2 时间 JS常用时间类型 1 2 1 GMT 格林尼治标准时 1 2 2 UTC 协调世界时 1 2 3 中国标准时间 1 2 4 ISO8601标准时间格式 1 2 5 时间戳 timestamp 1 时间戳转
  • spring boot项目自动加载引入外部bean

    前言 spring boot项目简化了对外部项目的引入 使我们能够狠方便的构建一个web项目 我们通常在开发的过程中会开发出一些公用的模块组件 这样在项目找那个引入后能够直接使用 减少了轮子的重复构造 同时服务引入的模块化操作 能够更多的节
  • CV学习:OpenCv快速入门(python版)

    本文代码全部可运行 笔者运行环境 python3 7 pycharm opencv4 6 此文是学习记录 记录opencv的入门知识 对各知识点并不做深入探究 文章的目的是让阅读者在极短的时间达到入门水平 在学习过程中 我们应养成 查询op
  • pygame用blit()实现动画效果

    pygame的的实现动画的方法有很多 但是都是围绕着表面进行的 也就是说实现动画的方式不同 但是本质其实都是对表面的不同处理方式而已 原理其实很简单 有点像我们做地铁的时候隧道里的广告一样 我们设置一个窗口 然后让窗口在一个画着很多帧图像的
  • 约束综合中的逻辑互斥时钟(Logically Exclusive Clocks)

    注 本文翻译自Constraining Logically Exclusive Clocks in Synthesis 逻辑互斥时钟的定义 逻辑互斥时钟是指设计中活跃 activate 但不彼此影响的时钟 常见的情况是 两个时钟作为一个多路
  • IDEA从安装到使用--相关配置详解

    IDEA从安装到使用 相关配置详解 作为一个技术小白 刚开始学习使用Intellij IDEA 入门时踩了很多的坑 这里写下我的第一篇博客 分享相关IDEA的配置方法 希望能为各位提供一点帮助 IDEA2018安装及破解 作者 志哥的成长笔
  • 大数(四则运算)

    四则运算 大数加法 高精度加法 大数减法 大数乘法 大数乘法 幂运算 大数乘法 高精度幂运算 大数除法 大数加法 思路 从后往前算 即由低位向高位运算 计算的结果依次添加到结果中去 最后将结果字符串反转 输入的时候两个数都是以字符串的形式输
  • 网站架构演变

    网站架构演变 大型网站介绍 与传统企业应用系统相比 大型互联网网站系统具有以下特点 1 大流量 高并发 这一点往往是传统企业应用系统根本就不会遇到的问题 比如Goole每日访问量都是几十亿 如果服务器端处理不好早就被压的宕机了 2 高可用