浅谈分布式系统

在这里插入图片描述

常见基本概念

在正式引入架构演进之前,先了解几个比较重要的概念做前置介绍。
应用(Application)/系统(System)
一个应用,就是一个/一组服务器程序
模块(Module)/组件(Component)
一个应用,里面有很多个功能。每个独立的功能,就可以称为是一个模块/组件
分布式(Distributed)
引入多个主机/服务器,协同配合完成一系列的工作
物理上的多个主机
集群(Cluster)
引入多个主机/服务器,协同配合完成一系列的工作
逻辑上的多个主机
主(Master)/从(Slave)
集群中,通常有一个程序需要承担更多的职责,被称为主;其他承担附属职责的被称为从。
多个服务器节点,其中一个是主,另外的是从,从节点的数据主要从主节点这里同步过来
中间件(Middleware)
和业务无关的服务(功能更通用的服务),比如数据库、缓存和消息队列
评价指标(Metric)
可用性(Availability):系统整体可用的时间/总的时间
响应时长(Response Time RT):用来衡量服务器的性能,和具体服务器要做的业务密切相关,越小越好
吞吐(Throughput)vs并发(Concurrent):衡量系统的处理请求的能力,是衡量性能的一种方式

架构演进

下文以“电子商务”应用为例,介绍从一百个到千万级并发情况下服务端的架构的演进过程。

单机架构

在初期,大部分公司的产品都是单机架构,只有一台服务器,这个服务器负责所有的工作

前期用户访问量很少,没有对我们的性能、安全等提出很高的要求,而且系统架构简单,无需专业的运维团队,所以选择单机架构是合适的。

虽然只有一个单机服务器,但是至少包含两部分,应用服务和数据库服务应用服务就是我们写的服务器程序(HTTP服务器),比如Spring;数据库服务比如MySQL;MySQL是一个客户端服务器结构的程序,本体是MySQL服务器(存储和组织数据的部分),客户端就是应用服务器,来读写数据库服务器;

比如用户现在想查看商品列表,应用服务器就会发送一个select查询请求到MySQL服务器上,MySQL服务器负责查到并返回给应用服务器应用服务器再通过HTTP协议返回给用户,最终显示在浏览器界面上。

image.png


如果业务进一步增长,用户量和数据量都水涨船高,一台主机难以应付的时候,就需要引入更多的主机,引入更多的硬件资源。
一台主机的硬件资源是有上限的,包括但不限于CPU、内存、硬盘、网络等,服务器每次收到一个请求,都是需要消耗上述的一些资源的,如果同一时刻,处理的请求多了,就可能会导致某个硬件资源不够用了。
无论是哪方面不够用了,都可能会导致服务器处理请求的时间变长,甚至于处理出错;
如果真的遇到了这样的服务器不够用的场景,就需要通过开源节流两种方式来解决,开源就是简单粗暴的通过增加更多的硬件资源来实现,节流是指在软件上优化,需要通过性能测试,找到对应瓶颈,再去对症下药,对我们的要求就比较高了。

应用服务和数据库分离

随着请求量和数据量的增加,一台主机很有可能就扛不住了,就需要引入多台主机来解决,最典型的方案就是把应用服务和数据库来分别部署到两台主机上
应用服务器里面可能会包含很多的业务逻辑,可能会吃CPU和内存
数据库服务器需要更大的磁盘空间,更快的数据访问速度
image.png

应用服务集群——负载均衡

应用服务器可能会比较吃CPU和内存,如果把CPU或者内存吃没了,此时应用服务器就顶不住了,需要引入更多的应用服务器来解决上述问题
用户的请求,会先到达负载均衡器/网关服务器(单独的服务器),然后会根据一些算法再分配给多个应用服务器
负载均衡器看起来承担了所有的请求,但是其对于请求量的承担能力,要远超过应用服务器。
这是因为负载均衡器就类似于领导,只负责分配工作,而应用服务器组员,需要执行任务,分配工作所耗费的成本要远少于执行任务所耗费的成本。

如果出现请求量大到负载均衡器也扛不住了,就需要引入更多的负载均衡器(引入多个机房)

image.png

读写分离——主(master)从(slave)架构

如上所讨论,增加应用服务器,确实能够处理更高的请求量,但是随之存储服务器要承担的请求量也就更多了,我们就需要引入更多的存储服务器来处理请求
在实际的应用场景中,读的频率要比写的频率是高的,所以我们保留一个主要的数据库作为写入数据库(主库),其他的数据库作为从属数据库(从库),从库的所有数据全部来自主库的数据,经过同步后,从库可以维护着和主库一致的数据。然后为了分担数据库的压力,我们可以将写数据请求全部交给主库处理,但读请求分散到各个从库中。

主服务器一般是一个,从服务器可以有多个(一主多从);同时从数据库通过负载均衡的方式,让应用服务器进行访问。

image.png

缓存——冷热分离

数据库天然有个问题,响应速度是更慢的,但随着访问量的增加,我们可以发现一部分热点数据,可以被频繁的访问到,也就是20%的数据,能够支持80%的访问量;
所以我们把数据区分**“冷热”**,把热点数据放到缓存中,缓存的访问速度要比数据库快很多,以这种方式来解决响应速度慢的问题。
image.png

分库分表

引入分布式系统,不光要能够去应对更高的请求量,同时也要能应对更大的数据量,在实际场景中,可能会出现一台服务器已经存不下数据了,这时候就需要多台主机来存储。
原来的一个数据库服务器,可以通过引入多个数据库服务器来演变为一个数据库集群,每个数据库服务器存储一个或者一部分数据库(create database)。
如果某个表特别大,大到一台主机存不下,也可以针对表进行拆分,具体分库分表如何实践,还需要结合实际的业务场景来展开。
image.png

微服务

之前的应用服务器,一个服务器程序里可能做了很多的业务,这就可能会导致这一个服务器的代码变的越来越复杂,为了更方便于代码的维护,就可以把这样的一个复杂的服务器,拆分成更多的,功能更单一,但是更小的服务器,这样服务器的种类和数量就增加了。
当应用服务器复杂了,势必就需要更多的人来维护了;当人多了,就需要划分组织结构,分成多个组,每个组分别配备领导进行管理。
按照功能,拆分成多组微服务,就可以有利于上述人员的组织结构的分配了。

所以微服务,本质上是在解决“人”的问题

image.png
微服务的代价:
1、系统的性能下降
因为拆出来更多的服务,多个功能之间要更依赖网络通信,网络通信的速度很可能是比硬盘还慢的;要想保证性能不下降太多,只能引入更多的机器,更多的硬件资源
2、系统复杂程度提高,可用性受到影响
微服务引入的服务器更多了,出现问题的概率也就更大了
这就需要一系列的手段,来保证系统的可用性,比如更丰富的监控报警,以及配套的运维人员


微服务的优势
1、解决了人的问题
2、使用微服务,可以更方便于功能的复用
3、可以给不同的服务进行不同的部署

小结

所谓的分布式系统,就是想办法引入更多的硬件资源,上文所谈及的分布式架构的演化步骤,只是一个粗略的过程,实际上一个商业项目,真实的演化过程,都是和他的业务发展密切相关的。
分布式系统演化过程的小结如下:
1、单机架构(应用程序+数据库服务器)
2、数据库和应用分离
应用程序和数据库服务器 分别放到不同主机上部署了
3、引入负载均衡 应用服务器=>集群
通过负载均衡器,把请求比较均匀的分发给集群中的每个应用服务器
4、引入读写分离 数据库主从结构
一个数据库节点作为主节点,其他N个数据库节点作为从节点
主节点负责写数据,从节点负责读数据;主节点需要把修改过的数据同步给从节点
5、引入缓存,冷热数据分离
根据二八原则,将热点数据存储在缓存中,加快访问速度,进一步的提升了服务器针对请求的处理能力,但是同时也引入了数据库和缓存数据不一致的问题;
Redis在一个分布式系统中,通常就扮演着缓存这样的角色;
6、引入分库分表,数据库能够进一步扩展存储空间
7、引入微服务,从业务上进一步拆分应用服务器
从业务功能的角度,把应用服务器,拆分成更多的功能更单一,更简单,更小的服务器

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

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

相关文章

Unity AnimationRigging无法修改权重?

个人理解,已解决无法修改权重的问题: unity自带的动画系统是在FixUpdate和Update之后LateUpdate之前执行,如果在这FixedUpdate或Update函数内更新AnimationRigging内的权重后,内部动画系统会覆盖权重的修改,导致无法正确更新&…

外贸邮件群发如何做?外贸邮件群发靠谱吗?

外贸邮件群发有哪些平台?外贸群发邮件用什么邮箱? 外贸邮件群发是许多企业在开展国际贸易时常用的营销手段,它不仅能够快速地将产品信息和促销活动传达给目标客户,还能够有效地建立和维护客户关系。下面,就让蜂邮探讨…

创建TextMeshPro字体文件

相比于Unity的Text组件,TextMesh Pro提供了更强大的文本格式和布局控制,更高级的文本渲染技术,更灵活的文本样式和纹理支持,更好的性能以及更易于使用的优点。但unity自带TextMeshPro字体不支持中文。这里使用普通字体文件生成Tex…

2023年12月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 一个非零的二进制正整数,在其末尾添加两个“0”,则该新数将是原数的?( ) A:10倍 B:2倍 C:4倍 D:8倍 答案:C 二进制进位规则是逢二进一,因此末尾添加一个0,是扩大2倍,添加两个0…

天线阵列车载应用——第1章 介绍 1.1节 汽车工业中的天线阵列:应用和频率范围

1.1 汽车工业中的天线阵列:应用和频率范围 无线通信系统的发展需要新的技术来支持更高质量的通信、新的服务和应用。近年来,汽车无线通信市场得到了极大的扩展。现代汽车使用不同的服务:AM/FM收音机、卫星广播(SDARS)、移动电话通信、数字音频广播(DAB)、远程无钥匙…

【Docker与微服务】基础篇

1 Docker简介 1.1 docker是什么 1.1.1 问题:为什么会有docker出现? 假定您在开发一个项目,您使用的是一台笔记本电脑而且您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。您正在开发的应用依赖于您当前的配置且还要依…

机器人运动学林沛群——变换矩阵

对于仅有移动,由上图可知: A P B P A P B o r g ^AP^BP^AP_{B org} APBPAPBorg​ 对于仅有转动,可得: A P B A R B P ^AP^A_BR^BP APBA​RBP 将转动与移动混合后,可得: 一个例子 在向量中&#xff…

CentOS下安装vlc

一、引言 vlc是一跨多媒体播放器,可以播放本地媒体文件和网络串流,帮助我们排查音视频开发过程中遇到的问题。大部分情况下,我们只需要在Windows系统下安装vlc就可以了。但有一种情况是需要在Linux下安装vlc的:我们的音视频拉流软…

Vue.js2+Cesium1.103.0 十五、绘制视锥,并可实时调整视锥姿态

Vue.js2Cesium1.103.0 十五、绘制视锥&#xff0c;并可实时调整视锥姿态 Demo <template><divid"cesium-container"style"width: 100%; height: 100%;"/> </template><script> /* eslint-disable no-undef */ /* eslint-disable …

Golang 基础 Go Modules包管理

Golang 基础 Go Modules包管理 在 Go 项目开发中&#xff0c;依赖包管理是一个非常重要的内容&#xff0c;依赖包处理不好&#xff0c;就会导致编译失败&#xff0c;本文将系统介绍下 Go 的依赖包管理工具。 我会首先介绍下 Go 依赖包管理工具的历史&#xff0c;并详细介绍下…

三网码支付系统源码,三网免挂有PC软件,有云端源码,附带系统搭建教程

搭建教程 1.先上传云端源码 然后配置Core/Config.php文件里面数据库信息注改&#xff1b;数据库帐号密码 2.云端源码里面Core/Api_Class/Instant_Url_List.php文件配置终端地址注改&#xff1b;第4 http://终端地址/ 3.导入云端数据库 账号admin 密码123456注改&#xff1…

以“防方视角”观JS文件信息泄露

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 案例概述02 攻击路径03 防方思路 01 案例概述 这篇文章来自微信公众号“黑白之道”&#xff0c;记录的某师傅从js文件泄露接口信息&#xff0c;未授权获取大量敏感信息以及通过逻辑漏洞登录管理员账…

Go语言Gin框架安全加固:全面解析SQL注入、XSS与CSRF的解决方案

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站https://www.captainbed.cn/kitie。 前言 在使用 Gin 框架处理前端请求数据时&#xff0c;必须关注安全性问题&#xff0c;以防范常见的攻击…

ChatGPT论文指南|ChatGPT论文写作过程中6个润色与查重提示词

论文完成初稿之后&#xff0c;一般情况下&#xff0c;宝子们还需要找专家给我们提出评审意见。找专家评审其实并不容易&#xff0c;即使对老师来说&#xff0c;找人评审论文也是一件苦活。我们这个时候可以通过文字提示让 ChatGPT充当我们的评审专家&#xff0c;为论文提出问题…

微信小程序新手入门教程四:样式设计

WXSS (WeiXin Style Sheets)是一套样式语言&#xff0c;用于描述 WXML 的组件样式&#xff0c;决定了 WXML 的组件会怎么显示。 WXSS 具有 CSS 大部分特性&#xff0c;同时为了更适合开发微信小程序&#xff0c;WXSS 对 CSS 进行了扩充以及修改。与 CSS 相比&#xff0c;WXSS …

javaEE - 20( 18000字 Tomcat 和 HTTP 协议入门 -1)

一&#xff1a; HTTP 协议 1.1. HTTP 是什么 HTTP (全称为 “超文本传输协议”) 是一种应用非常广泛的 应用层协议. HTTP 诞生与1991年. 目前已经发展为最主流使用的一种应用层协议. 最新的 HTTP 3 版本也正在完善中, 目前 Google / Facebook 等公司的产品已经支持了. HTT…

kafka 文件存储机制

文章目录 1. 思考四个问题&#xff1a;1.1 topic中partition存储分布&#xff1a;1.2 partiton中文件存储方式&#xff1a;1.3 partiton中segment文件存储结构&#xff1a;1.4 在partition中如何通过offset查找message: 2. kafka日志存储参数配置 Topic是逻辑上的概念&#xff…

STM32F407移植OpenHarmony笔记8

继上一篇笔记&#xff0c;成功开启了littlefs文件系统&#xff0c;能读写FLASH上的文件了。 今天继续研究网络功能&#xff0c;让控制台的ping命令能工作。 轻量级系统使用的是liteos_m内核lwip协议栈实现网络功能&#xff0c;需要进行配置开启lwip支持。 lwip的移植分为两部分…

MC34063异常发热分析

问题描述&#xff1a; 工程现场反馈若干电源转换模块损坏&#xff0c;没有输出。拿到问题模块后&#xff0c;查看有一个MC34063周围的PCB有比较明显的高温痕迹&#xff0c;配套的电感也有明显的高温过热痕迹。 问题调查&#xff1a; MC34063的电路非常经典&#xff08;虽然自…

数据结构——D/二叉树

&#x1f308;个人主页&#xff1a;慢了半拍 &#x1f525; 创作专栏&#xff1a;《史上最强算法分析》 | 《无味生》 |《史上最强C语言讲解》 | 《史上最强C练习解析》 &#x1f3c6;我的格言&#xff1a;一切只是时间问题。 ​ 1.树概念及结构 1.1树的概念 树是一种非线性的…