当前位置: 首页 > news >正文

单机、集群和分布式

目录

1.概述

2.单机服务器

单机版的服务器的性能,设计上的瓶颈?

3.集群

解决瓶颈1:

没有解决瓶颈2:

没有解决瓶颈3:

集群的优点?

集群的缺点?

4.分布式

分布式的优点?

分布式面临的问题

​编辑1、大系统的软件模块该怎么划分?

2、各模块之间该怎么访问?


1.概述

集群:每一台服务器独立运行一个工程的所有模块。

分布式:一个工程拆分了很多模块,每一个模块独立部署运行在一个服务器主机上,所有服务器协同工 作共同提供服务,每一台服务器称作分布式的一个节点,根据节点的并发要求,对一个节点可以再做节 点模块集群部署。

以服务聊天器为例,来讲解单机,集群,分布式

2.单机服务器

我们把这个单机聊天服务器取名为server。
把用户管理,好友管理,群组管理,消息管理,后台管理等模块构成我们的聊天服务器。每个模块都包含了很多特定的业务。特定的业务:用户管理模块有用户登录,用户注册,用户注销,用户退出等功能业务。好友管理有添加好友,删除好友等功能业务。群组管理有添加群,创建群,解散群,群里踢人等功能业务。消息管理有离线消息,一对一的消息,群组消息等和功能业务。后台管理有广播消息,公告消息,活动消息等功能业务。这些功能业务都对应了一个或多个完成这些业务的相关的函数。

单机版的服务器的性能,设计上的瓶颈?

1、受限于硬件资源。因为我们只有一台服务器,聊天服务器所能承受的用户的并发量是有限的。假设我们使用32位linux操作系统做一个聊天服务器,给一个进程把资源开满,最多支持2万多人的在线。用户量上不去了。硬件资源不够,socket资源不够,客户端无法与服务器建立连接,不可能给更多的客户端提供服务。
2、任意模块的修改都会导致整个项目代码重新编译,部署。假设这个服务聊天器有5个模块,每个模块有几十上百个功能业务,这一套项目编译得花2个小时,部署得花3个小时。现在如果我们突然发现用户管理模块有个注销的业务里面有bug,但是改起来特别简单,就几行代码。但是这是一整套系统,得把整个项目的所有代码全部重新编译!这样又得花2个小时编译,运维部署3个小时!成本较大,耗时。理想状态是,某个模块的代码出问题了,修改后只把这个模块编译一下就行。
3、系统中有些模块是属于CPU密集型(计算量大的),有些模块是属于I/O密集型的(这些模块会接触输入输出,网络I/O),造成各模块对硬件资源的需求是不一样。 有些模块是CPU密集型的,这些模块应该部署在CPU资源非常好的机器上,有些模块是I/O密集型的,应该部署在内存大,带宽好的机器上,不需要太强的CPU资源。不同模块属于不同的密集型(CPU密集型、IO密集型等),对硬件的需求不一样,把它们都打包在一套机器上,只能综合所有模块,提出平衡的供给需求,没办法针对性部署硬件资源。

3.集群


前端需要一个负载均衡器,直接扩充机器数量。每一台服务器独立运行一个工程的所有模块。

解决瓶颈1:

我们扩充了硬件资源。在水平方向上直接扩充成3台机器。每个机器独立运行着一台聊天服务器程序。

没有解决瓶颈2:

但是每一台机器都还是独立运行着一套聊天服务器系统程序,现在对任意模块的修改,得把整套代码重新编译,因为模块根本没有分开去部署,都是在一个项目中部署,运行在一个服务器进程中。
编译一套代码,做多次部署。因为我们扩充成3台机器了!更加头疼

没有解决瓶颈3:

集群只是水平的去扩展了硬件的机器,每一台机器还是运行着一台独立的聊天服务器程序。假如server2出问题,不影响聊天,因为server1和server3还可以独立地提供聊天服务,因为是独立的服务器。

集群的优点?

1、操作简单,在一台机器上部署和在多台机器上部署的方式是一样的,再加一个负载均衡器就行。

性能提升了,用户的并发量提升了,因为水平扩充了硬件资源。

集群的缺点?

1、项目代码还是需要整体重新编译,而且需要进行多次部署。

2、并不是说机器多,并发量就上来,性能就高。像后台管理模块,这个模块使用的用户是不多的,能在聊天系统上发布公告,只有管理员,像学校的校长才能发布公告,而且后台管理员根本不需要高并发,但是把这个模块部署在3台服务器上,就太浪费了!,像这些不常用的模块只需要部署在一台机器上就好啦。

4.分布式


分布式:把这些管理模块抽出来,单独部署在不同的机器上。

从集群上看的话,server2挂掉,还有完整的聊天服务器系统server1,server3。

但是在下图的分布式上,对于红色圈,3台机器上分别运行着不同的模块,少了这3台机器的任意台,聊天系统就缺失了相应的业务了!所有机器共同构成一个聊天服务器系统。这就是分布式。


一个工程拆分了很多模块,每一个模块独立部署运行在一个服务器主机上,所有服务器协同工作共同提供服务,每一台服务器称作分布式的一个节点,根据节点的并发要求,对一个节点可以再做节点模块集群部署。

集群:每一台服务器都运行了一个独立的系统。

分布式:所有的机器共同构成了一套系统,一套系统被分成了不同的模块,不同的模块根据具体的需求被部署在不同的机器上。

分布式的优点?

解决瓶颈1
用户登录成功,为了支持登录的并发量,我们可以把分布式节点1集群,扩充机器来部署运维用户管理,消息管理。

比如说后台管理这个模块不需要高并发,一台机器足以!

甚至我觉得用户管理模块(登录,退出)需要更多的并发量,没有人整天加好友删好友,建群,解散群。登录,退出,聊天应该做的是最多的,我们可以在server2节点上再部署用户管理,消息管理这2个业务功能。
在server2中,当好友管理和群组管理无法使用完server2的网络I/O资源的时候,用户管理和消息管理可以再享受多余的server2的网络I/O资源提供给更多的客户端进行登录登出的聊天服务。

解决瓶颈2

2、因为分布式将模块从总体的进程中,拆分出来了,每一个模块编译成了独立部署,独立运行的一个小的服务,假设后台管理模块出问题,只需要将后台管理模块重新编译就行了,我只需要把server3这台机器的后台模块重新更新就可以了,其他模块不需要更新。

由此可知,模块拆分出来了,解决瓶颈3
3、把CPU密集型的模块部署在CPU资源好的机器上。把I/O密集型的模块部署在CPU不是很好的机器上。

解决集群缺点2
有的模块要求并发能力高,可以进行多机器集群部署。有的模块并发能力小,部署在一台机器就足以。

配置着高可用,容灾的主备服务器,不用担心就一套系统挂掉了怎么办。

分布式面临的问题


1、大系统的软件模块该怎么划分?

各模块可能实现大量重复的代码!
模块和模块之间的界线不清晰(有的模块里面的函数调动另一个模块的函数代码)。
处理不好,造成大量重复代码。而且你改你的,我改我的,重复的公共代码就出问题了,变成不可控制了。

2、各模块之间该怎么访问?

因为现在各模块可能运行不在一个机器上,或者不在一个进程上。

如果用户登录成功了,想展示好友列表,但是用户管理模块只负责用户的登录,退出,注册、修改密码等业务功能,它并不知道好友列表,负责管理好友的是好友管理模块。通过传入用户id,得出好友列表。在单机或者集群中,这些模块是运行在一个服务器进程当中,相当于自己调用自己。但是在分布式中,用户管理和好友管理部署在不同的进程中,用户管理进程如何调用另一个模块上的业务呢?

机器1上的模块怎么调用机器2上的模块的一个业务方法呢?(软件设计师通过经验来解决)
机器1上的一个模块进程1怎么调用机器1上的模块进程2里面的一个业务方法呢?

涉及网络传输,携带区分函数的标识,包括函数的参数,函数命名等一些数据,全部通过网络发送过来,另一台机器便知道有别的机器想要调用我的方法,将传递过来的参数等数据代入执行,执行之后将返回值通过网络返回。
通过网络! 处理网络请求。网络是否有问题?如何告诉调用者网络的情况?

我们这个项目要做的就是把这些封装成一个分布式的通信框架,然后把这套框架给到用户,用户如果想要进行一个模块分布式的部署,在不同的分布式节点1,想要调用分布式节点2的代码,对于用户来说,他调用远程的方法就跟调用自己本机的方法一样简单方便,不用去关注一些具体的细节

相关文章:

单机、集群和分布式

目录 1.概述 2.单机服务器 单机版的服务器的性能,设计上的瓶颈? 3.集群 解决瓶颈1: 没有解决瓶颈2: 没有解决瓶颈3: 集群的优点? 集群的缺点? 4.分布式 分布式的优点? 分…...

qt开发-10_LineEdit

QLineEdit 小部件是一个单行文本编辑器。行编辑允许用户使用一组有用的编辑函数输入和 编辑一行纯文本。包括撤消和重做、剪切和粘贴以及拖放。通过更改行编辑的 echoMode(),它 还可以用作“只写”字段,用于输入如密码等. 创建好项目后,进入 …...

福昕PDF编辑器快速去除PDF水印方法

在福昕PDF编辑器软件中打开一个带有水印的PDF文件,点击如图下所示的页面管理->水印,点击全部移除 点击 是 水印消除(注:部分类型的水印可以消除,但是有些类型的水印无法通过此方法消除)...

Cloudflare 常用操作

一、域名托管到cloudflare 登录cloudflare->添加站点->填写域名(例如阿里云)->继续选择free套餐->继续->保存cloudflare分配的DNS地址->进入阿里云域名管理->进入DNS管理/DNS修改把DNS地址修改为cloudflare分配的两个DNS->保存->回到cloudflare->…...

elementUI的table使用展开功能( type=“expand“ ),展开时合起上一次展开的内容,始终保持展开内容为一个,并且再次点击合起自身

直接上代码了没什么可讲的,主要是用到 row-key"id" :expand-row-keys"expands row-click"handleRowClick" <template><div class"ele-body"><el-card shadow"never"><!-- 数据表格 --><ele-pro-t…...

【金】?Y? python网页前端streamlit

1、如何从 Google Colab Notebook 启动 streamit参考-How to Launch Streamlit App from Google Colab Notebook !streamlit run web.py & npx localtunnel --port 8501 & curl ipv4.icanhazip.com...

数据仓库之Lambda架构

Lambda架构是一种设计大规模数据处理系统的架构模式&#xff0c;它结合了批处理和实时处理的优点&#xff0c;以应对大数据的多样性、速度和规模问题。该架构主要由三个层次组成&#xff1a;批处理层&#xff08;Batch Layer&#xff09;、速度层&#xff08;Speed Layer&#…...

Apriori 处理ALLElectronics事务数据

通过Apriori算法挖掘以下事务集合的频繁项集&#xff1a; 流程图 代码 # 导入必要的库 from itertools import combinations# 定义Apriori算法函数 def apriori(transactions, min_support, min_confidence):# 遍历数据&#xff0c;统计每个项的支持度 item_support {}for tr…...

Content Provider:深入解析Android数据共享的核心组件

在Android开发中&#xff0c;Content Provider是一个重要的组件&#xff0c;它允许应用程序之间共享数据。它扮演着“数据访问中间层”的角色&#xff0c;为不同应用程序提供了一个统一的数据访问接口。以下将从技术难点、面试官关注点、回答吸引力以及代码举例四个方面&#x…...

069、Python 函数的递归调用

函数可以自己调用自己吗&#xff1f;&#xff1f;&#xff1f; 这就涉及函数的递归的用法了。 递归的概念&#xff1a; 函数递归是指函数在其定义中直接或间接调用自身的过程。 递归是一种强有力的编程技术&#xff0c;通常用于解决可以被分解为相同问题的子问题的情况&…...

数仓开发那些事_番外

一位神州的正式员工&#xff08;没错&#xff0c;就是之前文章中出现的实习生&#xff09;&#xff1a;一闪&#xff0c;你今年涨工资了吗&#xff1f; 一闪&#xff1a;mad&#xff0c;一年辛苦到头只涨了500米 神州员工&#xff1a;你去年绩效不是优秀吗&#xff0c;怎么就涨…...

Vue3+TypeScript项目实战——打造雨雪交加的智慧城市

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…...

经典游戏案例:植物大战僵尸

学习目标&#xff1a;植物大战僵尸核心玩法实现 游戏画面 项目结构目录 部分核心代码 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using Random UnityEngine.Random;public enum Z…...

Go 与 Java 字符编码选择:UTF-8 与 UTF-16 的较量

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

vscode+picgo+gitee实现Markdown图床

vscode中编辑Markdown文件&#xff0c;复制的图片默认是保存在本地的。当文档上传csdn时&#xff0c;会提示图片无法识别 可以在gitee上创建图床仓库&#xff0c;使用picgo工具上传图片&#xff0c;在Markdown中插入gitee链接的方式来解决该问题。 一、 安装picgo工具 1.1 v…...

【thinkphp问题栏】tp5.0分页技巧

一、调用内置方法paginate thinkphp内置了一个paginate方法支持分页功能 该方法位于library\think\db\Query.php内 /*** 分页查询* param int|array $listRows 每页数量 数组表示配置参数* param int|bool $simple 是否简洁模式或者总记录数* param array $config 配…...

获取时间戳是使用System.currentTimeMillis()还是使用new Date().getTime()(阿里开发规范)?

1.阿里规范 在阿里的Java开发手册中强制要求使用System.currentTimeMillis() 2.为什么(源码详解) new Date().getTime()它实际上也是调用的System.currentTimeMillis()&#xff0c;源码分析。 这个fastTime是它的成员变量&#xff0c;在new Date()的时候就被赋值了。 扩展一…...

仿饿了么加入购物车旋转控件 - 自带闪转腾挪动画 的按钮

, mWidth - mCircleWidth, mHeight - mCircleWidth); canvas.drawRoundRect(rectF, mHintBgRoundValue, mHintBgRoundValue, mHintPaint); //前景文字 mHintPaint.setColor(mHintFgColor); // 计算Baseline绘制的起点X轴坐标 int baseX (int) (mWidth / 2 - mHintPaint.m…...

Docker部署nacos集群

docker拉取nacos镜像&#xff0c;本文使用nacos2.0.3 三台服务器都要执行以下命令 docker pull nacos/nacos-server:v2.2.0准备挂载的日志目录和配置文件目录 日志&#xff1a;mkdir /usr/local/software/nacos/logs 配置文件&#xff1a;/usr/local/software/nacos/conf在配…...

centos查找文件 及 操作写入的进程

du -sh * 查看目录空间占用、发现大文件&#xff0c;确定进程&#xff0c;结束 yum install lsof 安装lsof 查看文件写入的 进程 2. lsof /root/.influxdbv2/engine/data/bab49411e5f7cbce/autogen/1/000000036-000000002.tsm COMMAND PID USER FD TYPE …...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

Linux安全加固:从攻防视角构建系统免疫

Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...