浅谈分布式系统

文章目录

  • 分布式系统
    • 应用数据分离架构
    • 应用服务集群架构
    • 读写分离 / 主从分离架构
    • 引入缓存--冷热分离架构
    • 数据库分库分表存储集群
    • 微服务架构
    • 小结

分布式系统

只有一台服务器负责所有的工作称为单机架构,但是一台主机的硬件资源是有上限的,当同一时刻主机收到的请求很多,就可能导致主机的某个硬件资源不够用了,无论是哪个方面不够用都可能会导致服务器处理请求的时间变长甚至会出错。

那么遇到这种情况应该怎么处理呢?

  1. 对应用软件进行优化,也就是对代码进行优化
  2. 引入更多的硬件资源,但是由于一台主机能够扩展的硬件资源是有限的,因此这并不能应对更复杂的问题
  3. 引入多台主机,一旦引入了多台主机就可以称为是分布式系统

引入分布式系统是万不得已的选择,因为多台机器就会导致复杂程度会大大提高,出现bug的概率也会更高

应用数据分离架构

将应用服务器和存储服务器分开。像应用服务器里面会包含更多的业务逻辑,所以就会消耗更多的CPU和内存,因此对于应用服务器就可以选用CPU和内存更强的主机。想存储服务器就需要更大的硬盘空间,更快的数据访问速度,因此可以选用更大硬盘的主机

image-20231027171928802

应用服务集群架构

应用服务器可能会比较吃CPU和内存如果把CPU或者内存吃没了,此时应用服务器就顶不住了。

此时引入更多的应用服务器,就可以有效解决上述问题

用户的请求先到负载均衡器,再由负载均衡器分发给应用服务器,就可以让单个应用服务器承担总请求数的一部分,尽量避免承担压力过大。这里和多线程的方式如出一辙,只不过多线程是局限于单个服务器中的。

负载均衡器就好像小组里的领导,负责管理并将任务分配给组里的每个成员。常见的分配算法例如轮询算法,当然需要根据不同的场景应用不同的分配算法

image-20231027172454994

那么又有问题了,这样子看起来负载均衡器不就承担了所有请求嘛。实际上负载均衡器对于请求量的承担能力要远超过应用服务器的,因

为负载均衡器并不需要处理请求的业务逻辑,它只是负责分配工作。如果负载均衡器确实是顶不住了,那只需要引入更多的负载均衡器即

读写分离 / 主从分离架构

现在的架构里,无论扩展多少台服务器,这些请求最终都会从数据库读写数据,到一定程度之后,数据的压力称为系统承载能力的瓶颈

点。我们可以像扩展应用服务器一样扩展数据库服务器么

答案是否定的,因为数据库服务有其特殊性:如果将数据分散到各台服务器之后,数据的一致性将无法得到保障

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

image-20231027173517024

引入缓存–冷热分离架构

对于数据库而言,它天然的响应速度都是较慢的,因为都是要去访问硬盘。

因此为了解决这个问题,就引入了缓存的概念,缓存服务器只存放一小部分的热点数据

一般而言缓存的存储就好像二八原则,因为缓存要想快就只能变小,因此不能存储太多的数据

image-20231027173831694

Redis主要的出现场景就是缓存

数据库分库分表存储集群

引入分布式系统,不光要能够处理更大的请求量(并发量),也需要去应对更大的数据量

随着业务的数据量增大,大量的数据存储在同⼀个库中已经显得有些力不从心了,所以可以按照业务将数据分别存储。也就是可以引入多个数据库服务器,每个数据库服务器存储一个或者一部分数据库

image-20231027174751262

每个存储集群中对应一个或者一部分的数据,例如一个存储集群里负责存储商品评论的数据,一个负责存储用户信息等

具体的分库分表还是得要结合实际的使用场景展开分析

微服务架构

上述的应用服务器,一个服务器程序里面做了很多的业务,这就可能导致一个服务器会变得越来越复杂

为了更方便的维护,就可以把一个复杂的服务器拆分成更多的功能更单一但是更小的服务器—微服务器

使用微服务可以更方便于功能的复用,同时可以给不同的服务进行不同的部署

image-20231027224512650

引入微服务就需要付出一些代价

  1. 整个系统的性能会下降,拆分更多的服务意味着多个功能之间要更依赖网络通信。通常情况下网络的速度比硬盘还要慢。
  2. 系统复杂程度提高,可用性会受到影响。这就需要更丰富的监控中心等手段来保证系统的可用性

小结

  1. 单机架构(应用程序 + 数据库服务器)
  2. 数据库和应用分离(应用程序和数据库服务器分别在不同主机上部署)
  3. 引入负载均衡器(应用服务器 — 集群)(有负载均衡器分发任务给集群中的应用服务器)
  4. 引入数据库主从结构(读写分离)(主写从读)(主修改过的数据需要同步给从)
  5. 引入缓存(冷热数据分离)(Redis在分布式系统中通常就扮演着缓存)
  6. 数据库分库分表
  7. 引入微服务架构(从业务上拆分应用服务器)

所谓的分布式系统本质上就是想办法引入更多的硬件资源

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

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

相关文章

公司电脑如何限制安装软件

公司电脑如何限制安装软件 安企神终端管理系统下载使用 在企业环境中,电脑已经成为企业中必不可少的办公工具,确保员工的生产力和公司的信息安全是至关重要的。为了实现这一目标,公司可能会限制员工在某些情况下安装软件或者由管理员来为终…

解决:谷歌浏览器访问http时,自动转https访问的问题

问题背景:某个系统网站,之前一直用https域名访问,现在改成http域名后,用http访问,谷歌浏览器会自动跳转到https。 解决方法: 在浏览器中输入网址:chrome://net-internals/#hsts -》 在“Delete…

驱动day8

基于GPIO子系统编写LED驱动,编写应用程序进行测试,设置定时器,5秒钟打印一次hello world 驱动代码 #include <linux/init.h> #include <linux/module.h> #include <linux/of.h> #include <linux/of_gpio.h> #include <linux/gpio.h> #include …

【Java 进阶篇】使用 Java 和 Jsoup 进行 XML 处理

XML&#xff08;可扩展标记语言&#xff09;是一种常用的数据交换格式&#xff0c;它被广泛用于在不同系统之间传递和存储数据。Java作为一种强大的编程语言&#xff0c;提供了多种方式来处理XML数据。其中&#xff0c;Jsoup 是一个流行的Java库&#xff0c;用于解析和操作XML文…

《算法通关村—最大小栈问题解析》

《算法通关村—最大小栈问题解析》 最小栈 描述 leetCode 155: 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现最小栈 MinStack() 初始化堆栈对象。 void push(int val) 将元素val推入堆栈。 void pop()…

unity button移动位置some values driven by canvas

1 可以在button父节点把限制取消勾选 2 在不动整个布局的情况下&#xff0c;只修改局部变量&#xff1a;忽略布局即可

深入探究ASEMI肖特基二极管MBR60100PT的材质

编辑-Z 在电子零件领域中&#xff0c;肖特基二极管MBR60100PT因其出色的性能和广泛的应用而显得尤为关键。理解其材质不仅有助于我们深入理解其运作原理&#xff0c;也有助于我们做出更合适的电子设计。那么&#xff0c;肖特基二极管MBR60100PT是什么材质呢? 首先&#xff0c…

一文2000字教你从0到1实现Jmeter 分布式压测

你可以使用 JMeter 来模拟高并发秒杀场景下的压力测试。这里有一个例子&#xff0c;它模拟了同时有 5000 个用户&#xff0c;循环 10 次的情况‍。 请求默认配置 token 配置 秒杀接口 ​结果分析 ​但是&#xff0c;实际企业中&#xff0c;这种压测方式根本不满足实际需求。下面…

Wpf 使用 Prism 实战开发Day02

一.设计首页导航条 导航条的样式&#xff0c;主要是从Material DesignThemes UI 拷贝过来修改的,项目用了这个UI组件库&#xff0c;就看自己需要什么&#xff0c;就去拷过来使用&#xff0c;界面布局或其他组件使用&#xff0c;不做介绍。 直接下载源码&#xff0c;编译运行就可…

AQS 为什么要使用双向链表?

双向链表 双向链表的特点是它有两个指针&#xff0c;一个指针指向前置节点&#xff0c;一个指针指向后继节点。所以&#xff0c;双向链表可以支持 常量 O(1) 时间复杂度的情况下找到前驱结点&#xff0c;基于这样的特点。双向链表在插入和删除操作的时候&#xff0c;要比单向链…

设置Ubuntu 20.04的静态IP地址(wifi模式下)

一、引言 自己家用的Ubuntu的&#xff0c;重启后ip地址经常会改变&#xff0c;这个时候就需要我们手动配置静态IP了。 二、优点 给Ubuntu设置一个静态IP地址有以下几个好处&#xff1a; 持久性&#xff1a;静态IP地址是固定不变的&#xff0c;与设备的MAC地址绑定。这意味着…

p5.js 视频播放指南

本文简介 在刚接触 p5.js 时我以为这只是一个艺术方向的 canvas 库&#xff0c;没想到它还支持视频文件和视频流的播放。 本文简单讲讲如何使用 P5.js 播放视频。 播放视频文件 p5.js 除了可以使用 video 元素播放视频外&#xff0c;还支持使用 image 控件播放视频。 方式1&…