深入Node.js集群:原理、优势与搭建实战,如何应对高并发

文章目录

  • 一、Node.js 集群简介
  • 二、Node.js 集群原理剖析
    • 2.1 主从模型
    • 2.2 负载均衡机制
    • 2.3 进程间通信(IPC)
  • 三、Node.js 集群优势详解
    • 3.1 性能提升
    • 3.2 高可用性
    • 3.3 资源利用率优化
  • 四、Node.js 集群搭建实战
    • 4.1 准备工作
    • 4.2 创建主控制节点
    • 4.3 工作节点配置
    • 4.4 监听与管理
  • 五、Node.js 集群应用场景
    • 5.1 高并发场景
    • 5.2 CPU 密集型任务
  • 六、总结与展望

一、Node.js 集群简介

在这里插入图片描述

Node.js 作为一个基于 Chrome V8 引擎的 JavaScript 运行环境,以其事件驱动、非阻塞 I/O 的特性,在构建高性能网络应用方面展现出强大的优势。然而,Node.js 默认采用单线程运行模式,这意味着在多核 CPU 的服务器环境中,它只能利用其中一个核心 ,导致其他核心资源闲置,无法充分发挥多核 CPU 的并行计算能力。对于需要处理大量并发请求或执行复杂计算任务的应用程序来说,这种单线程模式可能会成为性能瓶颈。
为了解决这一问题,Node.js 引入了集群(Cluster)模块。该模块允许我们创建一个主进程(Master Process)和多个工作进程(Worker Process),这些工作进程可以共享同一个服务器端口,从而实现对多核 CPU 的充分利用。主进程负责管理和调度工作进程,监听端口并将接收到的请求分发给各个工作进程进行处理。而每个工作进程都是一个独立的 Node.js 实例,拥有自己的 V8 引擎、事件循环和内存空间,能够独立处理请求。通过这种方式,Node.js 集群能够将负载均衡地分配到多个 CPU 核心上,显著提升应用程序的性能和吞吐量。

二、Node.js 集群原理剖析

在这里插入图片描述

2.1 主从模型

在 Node.js 集群中,主从模型是其核心架构。主进程(Master Process)犹如整个集群的指挥官,负责统筹全局。它主要承担着管理子进程的重任,包括创建、监控和维护子进程的生命周期。当系统启动时,主进程会根据服务器的 CPU 核心数量或用户的配置,通过cluster.fork()方法创建多个子进程。这些子进程就如同辛勤的工人,专注于具体的任务处理。
主进程会持续监听子进程的状态,一旦发现某个子进程出现异常或退出,它会立即采取措施,比如重新创建一个新的子进程来替代,以确保整个集群的稳定性和可靠性。而子进程则全身心投入到实际的业务逻辑处理中,例如处理网络请求、执行数据库操作等。它们通过与主进程建立的进程间通信(IPC)通道,接收主进程分配的任务,并将处理结果反馈给主进程 。

2.2 负载均衡机制

为了充分发挥多核 CPU 的优势,Node.js 集群采用了两种主要的负载均衡机制:循环模式(Round - Robin)和主进程监听套接字模式。

循环模式是一种简单而有效的负载分配方式。在这种模式下,主进程会按照顺序依次将接收到的网络请求分发给各个子进程。例如,假设有三个子进程 A、B、C,主进程在接收到第一个请求时,会将其分配给子进程 A;第二个请求分配给子进程 B;第三个请求分配给子进程 C;第四个请求又重新分配给子进程 A,以此类推。这种方式的优点是实现简单,能够在一定程度上均匀地分配负载。然而,它的缺点也很明显,由于没有考虑到各个子进程的实际负载情况,可能会导致某些子进程负载过高,而另一些子进程则处于空闲状态。

主进程监听套接字模式则相对更为智能。在这种模式下,主进程会监听服务器端口,并创建一个或多个套接字(Socket)。当有新的网络请求到达时,主进程会根据各个子进程的当前负载情况、资源使用情况等因素,选择一个最合适的子进程来处理该请求。例如,主进程可以通过与子进程之间的 IPC 通信,实时获取子进程的 CPU 使用率、内存占用率等信息,然后根据这些信息进行动态的任务分配。这种方式能够更合理地利用系统资源,提高集群的整体性能,但实现起来相对复杂,需要更多的系统开销。

2.3 进程间通信(IPC)

进程间通信(IPC,Inter - Process Communication)是 Node.js 集群中主进程与子进程之间进行数据交互和协调工作的关键机制。在 Node.js 中,IPC 主要通过管道(Pipe)来实现。

主进程在创建子进程时,会同时创建一条用于父子进程通信的管道。子进程启动后,会自动连接到这条管道上。通过这条管道,主进程和子进程可以相互发送和接收消息。例如,主进程可以向子进程发送任务指令、配置信息等;子进程则可以向主进程反馈任务执行结果、状态信息等。

在实际应用中,进程间通信的一个常见场景是主进程将接收到的网络请求转发给子进程处理。主进程在接收到请求后,会将请求相关的信息(如请求头、请求体等)通过 IPC 通道发送给子进程。子进程处理完请求后,再将响应结果通过 IPC 通道返回给主进程,主进程最后将响应发送给客户端。

这种通信方式不仅高效可靠,而且能够很好地满足集群环境下不同进程之间的协作需求。通过 IPC,主进程和子进程能够紧密配合,共同完成复杂的业务逻辑,实现高性能的网络应用。

三、Node.js 集群优势详解

在这里插入图片描述

3.1 性能提升

Node.js 集群最显著的优势之一就是性能的大幅提升。在传统的单线程 Node.js 应用中,由于只能利用一个 CPU 核心,当面对大量并发请求时,很容易出现性能瓶颈。而通过集群模式,我们可以将多个工作进程分配到不同的 CPU 核心上,实现并行处理请求,从而显著提高应用的吞吐量。
为了更直观地展示集群在性能提升方面的效果,我们可以进行一个简单的实验。假设我们有一个 Node.js 应用,它的主要任务是处理一些计算密集型的任务,例如对大量数据进行排序。我们分别在单线程模式和集群模式下运行这个应用,并使用性能测试工具来测量它们的处理速度。
在单线程模式下,我们启动应用后,使用loadtest工具发送 10000 个请求,记录下平均响应时间和每秒处理的请求数。结果发现,平均响应时间较长,每秒处理的请求数也相对较低。这是因为单线程在处理大量计算任务时,无法同时处理其他请求,导致请求排队等待,响应时间延长。
而在集群模式下,我们根据服务器的 CPU 核心数量创建多个工作进程,然后再次使用loadtest工具发送相同数量的请求。这次,我们惊喜地发现,平均响应时间明显缩短,每秒处理的请求数大幅增加。这是因为集群模式下,多个工作进程可以并行处理请求,充分利用了多核 CPU 的优势,从而显著提升了应用的性能。

3.2 高可用性

在生产环境中,应用的高可用性至关重要。Node.js 集群通过主进程对工作进程的监控和自动重启机制,为应用提供了强大的容错能力,确保应用能够持续稳定地运行。
主进程在集群中扮演着 “守护者” 的角色,它会时刻关注着每个工作进程的状态。一旦发现某个工作进程因为各种原因(如内存泄漏、未捕获的异常等)出现故障或退出,主进程会立即采取行动,重新创建一个新的工作进程来替代它。这个过程对用户来说是透明的,用户几乎不会察觉到应用出现了短暂的故障。
例如,假设我们的 Node.js 应用运行在一个集群环境中,其中一个工作进程由于内存泄漏导致崩溃。主进程会在第一时间检测到这个异常情况,并迅速启动一个新的工作进程。新的工作进程会继承原工作进程的所有配置和状态,继续处理来自客户端的请求。通过这种方式,集群有效地保证了应用的高可用性,避免了因单个进程故障而导致整个应用不可用的情况发生。

3.3 资源利用率优化

在单线程的 Node.js 应用中,由于无法充分利用多核 CPU 的资源,很容易造成资源的浪费。而 Node.js 集群通过合理地分配工作进程到各个 CPU 核心上,实现了对系统资源的高效利用,提升了系统的整体效率。

当我们启动一个 Node.js 集群时,主进程会根据服务器的 CPU 核心数量创建相应数量的工作进程。每个工作进程都会被分配到一个独立的 CPU 核心上,这样每个核心都能得到充分的利用,避免了资源的闲置。同时,由于工作进程之间相互独立,一个工作进程的故障不会影响其他工作进程的正常运行,从而保证了系统资源的有效利用。

此外,集群模式还可以根据系统的负载情况动态调整工作进程的数量。当系统负载较低时,我们可以适当减少工作进程的数量,以降低系统的资源消耗;当系统负载较高时,我们可以增加工作进程的数量,以提高系统的处理能力。通过这种动态调整机制,Node.js 集群能够更好地适应不同的工作负载,进一步优化资源利用率。

四、Node.js 集群搭建实战

在这里插入图片描述

4.1 准备工作

在开始搭建 Node.js 集群之前,我们需要确保开发环境中已经安装了 Node.js。你可以通过 Node.js 官方网站(https://nodejs.org/ )下载并安装适合你操作系统的最新稳定版本。安装完成后,打开命令行工具,输入node -v,如果能正确输出版本号,说明 Node.js 已经安装成功。
此外,为了更好地理解和运用 Node.js 集群,建议你对 JavaScript 语言有一定的掌握,熟悉 Node.js 的基本概念和语法,如模块系统、异步编程等。同时,了解一些操作系统的基础知识,如进程管理、网络通信等,将有助于你更好地理解集群的工作原理和运行机制。

4.2 创建主控制节点

在 Node.js 中,我们可以使用内置的cluster模块来创建集群。首先,创建一个新的 JavaScript 文件,例如master.js,作为主控制节点的入口文件。在该文件中,引入cluster模块和os模块,os模块用于获取服务器的 CPU 核心数量 。

const cluster = require('cluster');
const os = require('os');

接着,通过cluster.isMaster属性来判断当前进程是否为主进程。如果是主进程,我们可以根据 CPU 核心数量来创建多个工作进程。

if (cluster.isMaster) {const numCPUs = os.cpus().length;for (let i = 0; i < numCPUs; i++) {cluster.fork();}// 监听工作进程退出事件cluster.on('exit', (worker, code, signal) => {console.log(`worker ${worker.process.pid} died`);// 自动重启工作进程cluster.fork();});
}

在上述代码中,cluster.fork()方法用于创建一个新的工作进程。主进程会循环调用该方法,根据 CPU 核心数量创建相应数量的工作进程。同时,主进程通过监听exit事件,当某个工作进程意外退出时,能够及时创建一个新的工作进程来替代它,从而保证集群的稳定性。

4.3 工作节点配置

每个工作节点都需要运行一个独立的 Node.js 应用程序实例。在实际项目中,这个应用程序可以是一个 Web 服务器、一个后台任务处理程序或者其他类型的 Node.js 服务。
为了简单起见,我们创建一个基本的 HTTP 服务器作为工作节点的应用程序。创建一个新的文件,例如worker.js,在其中编写如下代码:

const http = require('http');const server = http.createServer((req, res) => {res.writeHead(200, { 'Content-Type': 'text/plain' });res.end('Hello, World! from worker'+ process.pid);
});server.listen(3000, () => {console.log('Worker started, listening on port 3000');
});

这段代码创建了一个简单的 HTTP 服务器,当客户端访问时,服务器会返回一条包含当前工作进程 ID 的响应信息。每个工作进程都会独立运行这个 HTTP 服务器,并且共享同一个端口(这里是 3000 端口)。通过cluster模块的内部机制,主进程会负责将请求合理地分配到各个工作进程的服务器实例上进行处理。

4.4 监听与管理

在主控制节点中,我们已经监听了工作进程的exit事件,以实现工作进程的自动重启。除此之外,cluster模块还提供了其他一些有用的事件,例如online事件、listening事件等,我们可以根据实际需求进行监听和处理。

if (cluster.isMaster) {const numCPUs = os.cpus().length;for (let i = 0; i < numCPUs; i++) {cluster.fork();}// 监听工作进程退出事件cluster.on('exit', (worker, code, signal) => {console.log(`worker ${worker.process.pid} died`);// 自动重启工作进程cluster.fork();});// 监听工作进程上线事件cluster.on('online', (worker) => {console.log(`worker ${worker.process.pid} is online`);});// 监听工作进程开始监听端口事件cluster.on('listening', (worker, address) => {console.log(`worker ${worker.process.pid} is listening on ${address.address}:${address.port}`);});
}

通过监听这些事件,我们可以实时了解工作进程的状态变化,及时做出相应的处理。例如,当一个工作进程上线时,我们可以记录相关信息,或者进行一些初始化操作;当工作进程开始监听端口时,我们可以确认服务器已经准备好接收请求。
此外,在实际生产环境中,我们还需要考虑对集群的监控和管理。可以使用一些第三方工具,如 PM2(https://pm2.keymetrics.io/ ),它不仅可以帮助我们管理 Node.js 进程,还提供了丰富的监控功能,如 CPU 使用率、内存占用率、请求响应时间等指标的实时监控,方便我们及时发现和解决集群中可能出现的问题。

五、Node.js 集群应用场景

在这里插入图片描述

5.1 高并发场景

在当今互联网时代,高并发场景无处不在,如电商平台的促销活动、在线直播、社交媒体的热门话题讨论等。以电商平台的 “双 11” 购物狂欢节为例,在活动期间,大量用户会同时访问网站进行商品浏览、下单、支付等操作,这对服务器的并发处理能力提出了极高的要求。
假设我们有一个基于 Node.js 的电商应用,在未使用集群模式时,单线程的 Node.js 应用在面对每秒数千甚至上万的并发请求时,很快就会出现响应缓慢、请求超时等问题,导致用户体验极差。而通过 Node.js 集群,我们可以根据服务器的 CPU 核心数量创建多个工作进程,每个工作进程都可以独立处理一部分请求。这样,当大量用户请求到达时,集群能够将请求快速分配到各个工作进程上进行并行处理,大大提高了应用的并发处理能力。
例如,我们使用autocannon工具对一个简单的 Node.js HTTP 服务器进行压力测试。在单线程模式下,服务器在面对每秒 100 个并发请求时,平均响应时间已经达到了几百毫秒,并且部分请求开始出现超时的情况。而当我们将服务器改造成集群模式,根据 CPU 核心数量创建了 4 个工作进程后,再次使用autocannon进行相同的压力测试,发现服务器在面对每秒 500 个并发请求时,平均响应时间仍然保持在几十毫秒,并且没有出现请求超时的情况,吞吐量得到了显著提升。

5.2 CPU 密集型任务

CPU 密集型任务通常涉及大量的计算操作,如数据分析、加密解密、图像处理等。这些任务需要消耗大量的 CPU 资源,如果在单线程的 Node.js 应用中执行,会导致事件循环被长时间占用,无法及时处理其他请求,从而影响整个应用的性能。
例如,在一个数据分析项目中,我们需要对大量的销售数据进行统计分析,包括计算销售额总和、平均值、最大值、最小值等。这些计算操作非常消耗 CPU 资源,如果使用单线程的 Node.js 应用来处理,可能需要花费很长时间才能完成,并且在处理过程中,应用无法响应其他用户的请求。
通过 Node.js 集群,我们可以将这些 CPU 密集型任务分配到多个工作进程中并行执行。每个工作进程都可以独立地对一部分数据进行分析计算,最后将结果汇总返回。这样,利用多核 CPU 的并行计算能力,大大缩短了任务的执行时间,提高了应用的整体效率。例如,在处理一个包含 100 万条数据的销售记录分析任务时,单线程模式下可能需要 10 分钟才能完成,而在集群模式下,通过合理分配工作进程,可能只需要 2 - 3 分钟就能完成同样的任务,极大地提高了数据分析的效率。

六、总结与展望

在这里插入图片描述

Node.js 集群作为一种强大的技术方案,为我们充分利用多核 CPU 资源、提升应用性能提供了有效的途径。通过深入理解其原理,如主从模型、负载均衡机制和进程间通信方式,我们能够更好地驾驭这一技术。在实际应用中,Node.js 集群在高并发场景和 CPU 密集型任务处理中展现出了显著的优势,能够为用户提供更高效、更稳定的服务。
展望未来,随着硬件技术的不断发展,多核 CPU 将越来越普及,Node.js 集群的应用前景也将更加广阔。同时,随着 Node.js 生态系统的不断完善,我们有理由相信,未来会出现更多更强大的工具和框架,与 Node.js 集群相结合,进一步简化开发流程,提升开发效率。例如,可能会出现更加智能的负载均衡算法,能够根据实时的系统状态和请求类型,动态地分配任务,实现更加精准的负载均衡;或者出现更便捷的集群管理工具,能够一站式地完成集群的部署、监控和维护工作 。
作为开发者,我们应紧跟技术发展的步伐,不断探索和实践 Node.js 集群的应用,为构建更加高效、可靠的应用程序贡献自己的力量。

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

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

相关文章

数字普惠金融对新质生产力的影响研究(2015-2023年)

基于2015—2023年中国制造业上市公司数据&#xff0c;探讨了数字普惠金融对制造业企业新质生产力的影响及作用机理。研究发现&#xff0c;数字普惠金融有助于促进制造业企业新质生产力的发展&#xff0c;尤其是在数字普惠金融的使用深度较大的情况下&#xff0c;其对新质生产力…

数据仓库基础常见面试题

1.数据仓库是什么 ‌数据仓库&#xff08;Data Warehouse&#xff09;是一个面向主题的、集成的、非易失的、随时间变化的数据集合&#xff0c;用于支持企业的管理决策‌。它不同于传统的操作型数据库&#xff0c;后者主要用于处理日常业务交易和实时查询&#xff0c;而数据仓库…

记一次OpenEuler Linux磁盘分区表损坏的数据恢复

问题复现 原本有一台GIS地图服务器存放大量数据&#xff0c;突然有一天磁盘满了&#xff0c;于是运维人员照常进行磁盘扩容。但由于误操作&#xff0c;导致使用fdisk的时候把分区表损坏了&#xff0c;表现如下&#xff1a; 这里可以看到启动时能看到xvda被分为了xvda1和xvda2…

分布式数据存储基础与HDFS操作实践(副本)

以下为作者本人撰写的报告&#xff0c;步骤略有繁琐&#xff0c;不建议作为参考内容&#xff0c;可以适当浏览&#xff0c;进一步理解。 一、实验目的 1、理解分布式文件系统的基本概念和工作原理。 2、掌握Hadoop分布式文件系统&#xff08;HDFS&#xff09;的基本操作。 …

【数据结构学习笔记】19:跳表(Skip List)

介绍 跳表是一个能在 O ( n l o g n ) O(nlogn) O(nlogn)时间完成查找、插入、删除的数据结构&#xff0c;相比于树形结构优点就是很好写&#xff08;所以也用于实现Redis ZSet&#xff09;。其核心思想就是维护一个元素有序的&#xff0c;能随机提升索引层数的链表。最下面一…

如何使用 PHP 操作亚马逊 S3 对象云存储

以下是使用PHP与亚马逊S3对象云存储&#xff08;也有其他支持S3协议的云存储服务&#xff0c;原理类似&#xff09;进行交互的常见文档接口使用示例&#xff0c;涵盖了基本的操作如上传文件、下载文件、删除文件、列举文件等内容。 ### 前提条件 1. 首先&#xff0c;你需要获取…

APP推荐:全新TV端来了,8K原画电视版

▌ 软件介绍 B站都不陌生吧&#xff0c;一个能追番、学习、娱乐的多元平台&#xff0c;之前也分享过几款第三方TV端&#xff0c;其中的BV最近更新了全新版本。 使用了全新的UI界面&#xff0c;由之前的顶部菜单栏改成了侧边布局&#xff0c;已解锁限制&…

Pcl联合Qt显示点云

基于vs2022 勾选opengl&#xff0c;openglwidgets&#xff0c;并将widget控件提示为QVTKOpenGLNativeWidget Qt_Pcls.h #pragma once #include <QtWidgets/QMainWindow> #include "ui_Qt_Pcls.h" #include <vtkGenericOpenGLRenderWindow.h> #include &…

pip install transformers教程

直接pip install transformers会报错&#xff0c;报错内容如下&#xff1a; Collecting safetensors>0.3.1 (from transformers)Using cached safetensors-0.5.2.tar.gz (66 kB)Installing build dependencies ... doneGetting requirements to build wheel ... donePrepar…

【数据结构】基础知识

目录 1.1 什么是数据结构 1.2数据 1.3 逻辑结构 1.4 存储结构 1.4.1 顺序存储 1.4.2 链式存储 1.4.3 索引存储 1.4.4 散列存储 1.5 操作 1.1 什么是数据结构 数据的逻辑结构以及存储操作 数据结构没有那么复杂&#xff0c;它就教会你一件事&#xff1a;如何更有效的…

【Rust】变量与可变性

目录 思维导图 1. 变量与可变性 1.1 不可变性 1.2 可变性 2. 常量 2.1 定义与特性 3. 变量遮蔽&#xff08;shadowing) 3.1 影子机制 3.2 遮蔽与可变性的区别 4.示例 4.1 变量和可变性示例 4.2 可变变量示例&#xff1a; 4.3 常量示例&#xff1a; 4.4 遮蔽示例&a…

第27章 汇编语言--- 设备驱动开发基础

汇编语言是低级编程语言的一种&#xff0c;它与特定的计算机架构紧密相关。在设备驱动开发中&#xff0c;汇编语言有时用于编写性能关键的部分或直接操作硬件&#xff0c;因为它是接近机器语言的代码&#xff0c;可以提供对硬件寄存器和指令集的直接访问。 要展开源代码详细叙…

Mycat读写分离搭建及配置超详细!!!

目录 一、Mycat产生背景二、Mycat介绍三、Mycat安装四、Mycat搭建读写分离1、 搭建MySQL数据库主从复制2、 基于mysql主从复制搭建MyCat读写分离 五、Mycat启动常见错误处理1、Caused by: io.mycat.config.util.ConfigException: SelfCheck### schema TESTDB refered by user u…

【6】Word:海名公司文秘❗

目录 题目 List.docx Word.docx List.docx和Word.docx 题目 List.docx 选中1/4全角空格复制→选中全部文本→开始→替换&#xff1a;粘贴将1/4全角空格 替换成 空格选中全部文本→插入→表格→将文本转化成表格→勾选和布局→自动调整→勾选 选中第一列&#xff0c;单机右键…

【Rust】引用与借用

目录 思维导图 1. 引用与借用的基本概念 1.1. 引用示例 2. 借用的规则 2.1. 可变借用示例 2.2. 借用的限制 3. 引用的生命周期 思维导图 1. 引用与借用的基本概念 引用的定义&#xff1a;引用是一种指向数据的指针&#xff0c;但与裸指针不同&#xff0c;Rust的引用在编…

贪心算法详细讲解(沉淀中)

文章目录 1. 什么是贪心算法&#xff1f;&#xff08;贪婪鼠目寸光&#xff09;经典例题1.1.1 找零问题1.1.2最小路径和1.1.3 背包问题 2.贪心算法的特点2.1 证明例1 3.学习贪心的方向心得体会 1. 什么是贪心算法&#xff1f;&#xff08;贪婪鼠目寸光&#xff09; 贪心策略&a…

【专题】2025年节日营销趋势洞察报告汇总PDF洞察(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p38813 在当今复杂多变且竞争激烈的消费市场环境下&#xff0c;节日营销已成为企业获取市场份额、提升品牌影响力的关键战略时机。我们深知深入洞察节日营销趋势对于企业决策的重要性。 本报告汇总基于对 2024 年多个关键消费节点及…

51c自动驾驶~合集46

我自己的原文哦~ https://blog.51cto.com/whaosoft/13050104 #世界模型会是L3自动驾驶的唯一解吗 三维空间占有率&#xff08;3D Occupancy&#xff09;预测的目的是预测三维空间中的每个体素是否被占有&#xff0c;如果被占有&#xff0c;则对应的体素将被标记。3D Semant…

Linux-----线程操作(创建)

目录 创建线程 示例&#xff1a; 创建线程 #include <pthread.h>/*** 创建一个新线程* * pthread_t *thread: 指向线程标识符的指针,线程创建成功时,用于存储新创建线程的线程标识符* const pthread_attr_t *attr: pthead_attr_t结构体,这个参数可以用来设置线程的属性…

华三S6520交换机配置console和ssh

目录 一、实验目的 二、实验设备 三、实验拓扑图 四、实验步骤 1、console用户名和密码 2、ssh用户名和密码 3.配置系统时间 一、实验目的 实现对华三 S6520 交换机的 console 本地登录和 ssh 远程登录配置,确保能够通过 console 线在本地进行管理,并使用 SSH 协议进…