服务器架构演进史

服务器架构演进史

概述

在进行后端的学习过程中,有时由于个人的学习广度的局限导致无法从全局理解一些概念,服务端的架构的演进历史,同时列举出每个演进阶段会遇到的相关技术,让对架构的演进有一个整体的认知。并帮助读者与本人提高在学习路上的能见度。

一、单机架构

初期,我们需要利用我们精干的技术团队,快速将业务系统投入市场进行检验,并且可以迅速响应变化要求。但好在前期用户访问量很少,没有对我们的性能、安全等提出很高的要求,而且系统架构简单,无需专业的运维团队,所以选择单机架构是合适的。

PS:所有的应用服务、业务所需的数据、业务处理等都在一台服务器上。

在这里插入图片描述

二、引用数据分离架构

​ 随着系统的上线,我们不出意外地获得了成功。市场上出现了一批忠实于我们的用户,使得系统的访问量逐步上升,逐渐逼近了硬件资源的极限,同时团队也在此期间积累了对业务流程的一批经验。面对当前的性能压力,我们需要未雨绸缪去进行系统重构、架构挑战,以提升系统的承载能力。但由于预算仍然很紧张,我们选择了将应用和数据分离的做法,可以最小代价的提升系统的承载能力。

Ps:我们直接将业务的应用和业务所需的数据拆分为2台服务器,使业务开始分层,逻辑处理层和数据储存层,使其可以更加专注(内聚)。

注:和之前架构的主要区别在于将数据库服务独立部署在同一个数据中心的其他服务器上,应用服务通过网络访问数据,而不是在本地直接访问。

在这里插入图片描述

三、应用服务集群架构

我们的系统受到了用户的欢迎,并且出现了爆款,单台应用服务器已经无法满足需求了。我们的单机应用服务器首先遇到了瓶颈,摆在我们技术团队面前的有两种方案,大家针对方案的优劣展示了热烈的讨论:

• 垂直扩展 / 纵向扩展 Scale Up:通过购买性能更优、价格更高的应用服务器来应对更多的流量。

这种方案的优势在于完全不需要对系统软件做任何的调整;但劣势也很明显:硬件性能和价格的增长关系是非线性的,意味着选择性能 2 倍的硬件可能需要花费超过 4 倍的价格,其次硬件性能提升是有明显上限的。

水平扩展 / 横向扩展 Scale Out:通过调整软件架构,增加应用层硬件,将用户流量分担到不同的应用层服务器上,来提升系统的承载能力。
这种方案的优势在于成本相对较低,并且提升的上限空间也很大。但劣势是带给系统更多的复杂性,需要技术团队有更丰富的经验。
经过团队的学习、调研和讨论,最终选择了水平扩展的方案,来解决该问题,但这需要引入一个新的组件 —— 负载均衡:为了解决用户流量向哪台应用服务器分发的问题,需要一个专门的系统组件做流量分发。实际中负载均衡不仅仅指的是工作在应用层的,甚至可能是其他的网络层之中。


同时流量调度算法也有很多种,这里简单介绍几种较为常见的:

Round-Robin 轮询算法:即非常公平地将请求依次分给不同的应用服务器。
Weight-Round-Robin 轮询算法:为不同的服务器(比如性能不同)赋予不同的权
重(weight),能者多劳。
一致哈希散列算法:通过计算用户的特征值(比如 IP 地址)得到哈希值,根据哈
希结果做分发,优点是确保来自相同用户的请求总是被分给指定的服务器。也就是我
们平时遇到的专项客户经理服务。

Ps:水平和垂直扩展不但是架构演进中的重要思想,也是设计原则中的重要思想,一般来说我们都是首先想到的为水平扩展/拆分,将一个整体拆分为可低依赖、高内聚的子模块,若是拆分子模块过多,我们将再垂直扩展,使用一个高层的模块统一管理这些子模块,若这个高层模块又过大,此时再次水平扩展,然后依次套娃。

在这里插入图片描述

四、读写分离/主从分离架构

​ 上一节提到,我们把用户的请求通过负载均衡分发到不同的应用服务器之后,可以并行处理了,并且可以随着业务的增长,可以动态扩张服务器的数量来缓解压力。但是现在的架构里,无论扩展多少台服务器,这些请求最终都会从数据库读写数据,到一定程度之后,数据的压力称为系统承载能力的瓶颈点

​ 我们可以像扩展应用服务器一样扩展数据库服务器么?答案是否定的,因为数据库服务有其特殊性:如果将数据分散到各台服务器之后,数据的一致性将无法得到保障。(数据的一致性:针对同一个系统,无论何时何地,我们都应该看到一个始终维持统一的数据)所以直接的水平/垂直扩展是不可取的。

​ 举一个例子,银行管理的账户金额,如果收到一笔转账之后,一份数据库的数据修改了,但另外的数据库没有修改,则用户得到的存款金额将是错误的。🤕

​ 我们采用的初步办法是这样的,保留一个主要的数据库作为写入数据库,其他的数据库作为从属数据库。从库的所有数据全部来自主库的数据,经过同步后,从库可
以维护着与主库一致的数据。然后为了分担数据库的压力,我们可以将写数据请求全
部交给主库处理,但读请求分散到各个从库中。

Ps:由于大部分的系统中,读写请求都是不成比例的,例如 100 次读 1 次写,所以只要将读请求由各个从库分担之后,数据库的压力就没有那么大了。当然这个过程不是无代价的,主库到从库的数据同步其实是由时间成本的,但这个问题我们暂时不做进一步探讨。

在这里插入图片描述

五、冷热分离(引入缓存)架构

​ 随着访问量继续增加,发现业务中一些数据的读取频率远大于其他数据的读取频率。我们把这部分数据称为热点数据,与之相对应的是冷数据。针对热数据,为了提升其读取的响应时间,可以增加本地缓存,并在外部增加分布式缓存,缓存热门商品信息或热门商品的 html 页面等。通过缓存能把绝大多数请求在读写数据库前拦截掉,大大降低数据库压力。其中涉及的技术包括:使用 memcached 作为本地缓存,使用Redis 作为分布式缓存,还会涉及缓存一致性、缓存穿透/击穿、缓存雪崩、热点数据
集中失效等问题。

相关软件:
Memcached、 Redis 等缓存软件
在这里插入图片描述

垂直分库

​ 随着业务的数据量增大,大量的数据存储在同一个库中已经显得有些力不从心了,所以可以按照业务,将数据分别存储。比如针对评论数据,可按照商品 ID 进行 hash,路由到对应的表中存储;针对支付记录,可按照小时创建表,每个小时表继续拆分为小表,使用用户 ID 或记录编号来路由数据。只要实时操作的表数据量足够小,请求能够足够均匀的分发到多台服务器上的小表,那数据库就能通过水平扩展的方式来提高性能。
在这里插入图片描述

业务拆分 —— 微服务

​ 随着人员增加,业务发展,我们将业务分给不同的开发团队去维护,每个团队独立实现自己的微服务,然后互相之间对数据的直接访问进行隔离,可以利用Gateway、消息总线等技术,实现相互之间的调用关联。甚至可以把一些类似用户管理等业务提成公共服务。
在这里插入图片描述

六、容器编排架构

随着业务增长,然后发现系统的资源利用率不高,很多资源用来应对短时高并发,平时又闲置,需要动态扩缩容,还没有办法直接下线服务器,而且开发、测试、生产每套环境都要隔离的环境,运维的工作量变的非常大。容器化技术的出现给这些问题的解决带来了新的思路。
目前最流行的容器化技术是 Docker,最流行的容器管理服务是 Kubernetes(K8S),应用/服务可以打包为 Docker 镜像,通过 K8S 来动态分发和部署镜像。 Docker 镜像可理解为一个能运行你的应用/服务的最小的操作系统,里面放着应用/服务的运行代码,运行环境根据实际的需要设置好。把整个“操作系统”打包为一个镜像后,就可以分发到需要部署相关服务的机器上,直接启动 Docker 镜像就可以把服务起起来,使服务的部署和运维变得简单。服务通常会有生产和研发 k8s 集群,一般不会公用,而研发集群通过命名空间来完成应用隔离,有的公司按照研发目的划分为研发和测试集群,有的公司通过组织架构完成部门间的资源复用。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/343026.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

书生·浦语大模型实战营第三次课堂笔记

LLM 的局限性 知识时效性受限: 如何让LLM能够获取最新的知识 专业能力有限: 如何打造垂域大模型 定制化成本高: 如何打造个人专属的LLM应用 RAG:检索增强生成, 核心思想:给大模型外挂一个知识库,对于用户的提问,会首先从知识库中…

虚拟机Linux硬盘扩容

扩容前(20G): 扩容后(60G): 步骤: 1. 点击 虚拟机 -> 设置 -> 硬件 -> 硬盘(SCSI) -> 扩展(E)... -> 输入想要扩容大大小 -> 扩展(E) 注:必须关机,挂起状态无法设置 2. 运行虚拟机,查…

矩阵的秩-

一、定义、理解 非零子式的最高阶数。 如何理解?什么叫做非零子式的最高阶数??? 举个例子:有一个5阶矩阵 首先什么叫子式? 例如2阶子式就是,任取某两行某两列组成的行列式,就叫…

Redis重点总结补充

Redis重点总结 1.redis分布式锁 2.redission实现分布式锁 注意:加锁、设置过期时间等操作都是基于lua脚本完成. redisson分布式锁,实现可重入(前提是同一个线程下 3.redis主从集群 实现主从复制 ( Master-slave Replication)的工作原理 : …

面试算法119:最长连续序列

题目 输入一个无序的整数数组,请计算最长的连续数值序列的长度。例如,输入数组[10,5,9,2,4,3],则最长的连续数值序列是[2,3,4,5],因此…

开源知识库工具大盘点,赶紧收藏

有一个顶尖的知识库是任何一家企业的核心竞争力。它不仅可以帮助新员工更快地熟悉工作,也可以节省资深团队成员的时间来解决重复问题。但是,如何找到一个适合你的知识库工具呢?别担心,本文就给你推荐5款顶尖的开源知识库工具&…

Exception in thread “main“ java.lang.ArrayIndexOutOfBoundsException(数组创建问题)

数组在Java中使用还是比较多的,通过索引去数组中寻值,也可以通过数组索引去赋值 问题描述: 我们在直接使用未被new的数组时就会出现这种情况, 这边简单创建一个运行类 public class a {public static void main(String[] args)…

5G前装搭载率即将迈过10%大关,车载通讯进入多层次增长通道

对于智能化来说,车载通讯性能的提升,对于相关功能的用户体验优化、进一步减少通讯时延以及打开应用新空间,至关重要。 目前,2G/3G正在进入运营商逐步关闭运营的阶段,4G依然是主力,但5G也在迎来新的增长机会…

强化学习应用(一):基于Q-learning的无人机物流路径规划研究(提供Python代码)

一、Q-learning简介 Q-learning是一种强化学习算法,用于解决基于马尔可夫决策过程(MDP)的问题。它通过学习一个价值函数来指导智能体在环境中做出决策,以最大化累积奖励。 Q-learning算法的核心思想是通过不断更新一个称为Q值的…

RflySim | 定点位置控制器设计实验二

基础实验 1.复现四旋翼Simulink仿真,分析控制作用在obxb轴和obyb轴的解耦。 2.对系统进行扫频以绘制Bode图,分析闭环位置控制系统稳定裕度。 3.完成硬件在环仿真。 本实验对应demo文件对于RflySim v3.0以下版本地址为:*\PX4PSP\RflySimAP…

【LeetCode每日一题】2085. 统计出现过一次的公共字符串(哈希表)

2024-1-12 文章目录 [2085. 统计出现过一次的公共字符串](https://leetcode.cn/problems/count-common-words-with-one-occurrence/)思路:哈希表计算 2085. 统计出现过一次的公共字符串 思路:哈希表计算 1.用两个哈希表分别统计word1和word2中字符出现的…

gcc/g++工具详解

目录 一、安装gcc/g 二、背景知识 三、相关选项 四、gcc如何工作 1.预处理 2.编译 3.汇编 4.链接 5.函数库的概念 6.动静态库 一、安装gcc/g gcc/g -v : 用来查看当前你使用的gcc/g版本 因为我的gcc/g是升级过的所以版本更高,如果你用的是centos7.6的话…