【系统设计系列】 回顾可扩展性

系统设计系列初衷

System Design Primer: 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards.

中文版: https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md

初衷主要还是为了学习系统设计,但是这个中文版看起来就像机器翻译的一样,所以还是手动做一些简单的笔记,并且在难以理解的地方对照英文版,根据自己的理解在AI的帮助下进行翻译和知识扩展。

什么是系统设计

        系统设计是指在计算机系统构建和实现过程中,对计算机硬件、软件和外部设备等各个组成部分进行有计划、有目标的设计和组织。系统设计的目的是为了实现满足用户需求的高性能、可靠、易用、安全和可扩展的计算机系统。系统设计可以分为硬件设计和软件设计两个主要方面。
硬件设计主要关注计算机系统的物理实现,包括中央处理器(CPU)、内存、输入/输出设备、存储设备等关键部件的选择、组织和互连。硬件设计需要考虑性能、可靠性、功耗、成本等因素,同时确保系统的可扩展性和易维护性。
        软件设计则主要关注计算机系统的逻辑实现,包括操作系统、应用软件、编程语言、编译器等软件组件的设计和实现。软件设计需要考虑程序的可读性、可维护性、高效性、安全性等因素,同时确保软件的兼容性和易用性。
        总之,系统设计是一个涵盖硬件和软件的多方面、多层次的综合性工程,需要充分考虑用户需求、性能、可靠性、安全性、易用性等多种因素,以实现高效、可靠、易用、安全的计算机系统。

基础知识学习

首先,需要对一般性原则有一个基本的认识,知道它们是什么,怎样使用以及利弊。

回顾可扩展性(scalability)的视频讲座

(该视频为youtube视频,国内可能看不了,因此,我便文字概述) 

下面将分段介绍系统设计的基础知识,图片来源网络,侵权删~

哈佛大学可扩展性讲座

 

垂直扩展(Vertical scaling)

        垂直扩展 (Vertical scaling),也称为纵向扩展或垂直扩展,是一种扩展方法,通过增加单个服务器的资源来提高系统的性能和可扩展性。这种方法通常用于解决单个服务器的瓶颈问题,例如 CPU、内存或存储容量的限制。

        垂直扩展可以通过升级单个服务器的硬件配置来实现,例如增加 CPU 核心数量、增加内存容量、升级存储设备等。这种方法可以提高单个服务器的性能和容量,从而增加系统的吞吐量和可扩展性。

        垂直扩展的优点是可以提高单个服务器的性能和容量,从而减少服务器的数量和降低成本。此外,由于垂直扩展是在单个服务器上进行的,因此不需要进行复杂的架构调整和应用程序修改。

        然而,垂直扩展也有一些缺点。例如,增加单个服务器的资源可能会导致成本上升,并且增加过多的资源可能会导致浪费。此外,当单个服务器达到其性能极限时,垂直扩展可能无法继续提高系统的性能和可扩展性,这时就需要考虑其他扩展方法,例如水平扩展 (Horizontal scaling)。

 

水平扩展(Horizontal scaling)

        水平扩展(Horizontal scaling),又称水平扩展性,是一种通过增加多个服务器来提高系统性能和可扩展性的扩展方法。水平扩展将多个服务器从逻辑上看成一个实体,通过简单的聚类或负载平衡策略,可以有效地加快整个逻辑实体的运行速度和性能。与垂直扩展(Vertical scaling)不同,水平扩展是通过增加多个服务器来分散负载,而不是通过对单个服务器增加资源。

        水平扩展的优点包括:

        提高系统性能:通过增加多个服务器,水平扩展可以有效地提高系统的运算速度和性能,从而提高系统的吞吐量和响应能力。

        提高系统可用性:水平扩展可以通过冗余和服务器故障转移等手段提高系统的可用性,确保系统在面临硬件故障或网络故障时仍能正常运行。

        灵活性和可扩展性:水平扩展可以根据业务需求和负载情况灵活地添加或减少服务器,便于扩展和管理。

        然而,水平扩展也存在一些挑战和局限性:

        系统一致性:由于多个服务器构成了一个逻辑实体,需要保证这些服务器之间的数据一致性和同步。

        负载均衡:水平扩展需要实现负载均衡策略,确保每个服务器的负载均衡,避免某些服务器过载而其他服务器资源浪费。

        数据分区和分布式事务:在水平扩展的场景下,需要解决数据分区和分布式事务的问题,以保证数据的完整性和一致性。

        应用程序优化:水平扩展可能导致应用程序需要进行分布式设计和优化,以适应多服务器的环境。

        总之,水平扩展是一种通过增加多个服务器来提高系统性能和可扩展性的扩展方法,适用于需要提高系统性能、可用性和灵活性的场景。但同时,也需要克服一些技术挑战和局限性。

 

缓存

        缓存(Cache)是一种存储技术,它的主要目的是提高数据访问的速度和效率。通过在内存或硬盘等存储介质中临时存放经常访问的数据,以减少数据访问时间和带宽消耗。当需要使用这些数据时,可以优先从缓存中读取,而不是从原始数据源中获取,从而提高了系统的响应速度和性能。

        缓存的种类有很多,根据不同的应用场景和缓存策略,可以分为以下几类:

        CPU 缓存:位于 CPU 内部的高速缓存,用于存储和加速处理器访问的数据和指令。通常分为一级缓存(L1 Cache)和二级缓存(L2 Cache),它们的作用是在处理器访问数据时提供一个快速响应的缓存层级。

        内存缓存:位于内存中的缓存,通常用于存储操作系统、应用程序和用户数据。通过内存缓存,可以减少对硬盘的访问次数,提高数据读取速度。

        硬盘缓存:位于硬盘驱动器上的缓存,也称为磁盘缓存。主要用于存储从磁盘读取的数据,提高对磁盘数据的访问速度。

        网络缓存:主要应用于网络领域,例如 CDN(内容分发网络)中的节点会缓存热门内容,以提高用户访问速度。

        数据库缓存:用于存储数据库中的热点数据,提高查询效率。如 Hibernate 和 MyBatis 等数据库访问框架提供了不同级别的缓存策略。

        前端缓存:主要应用于 Web 前端领域,通过浏览器或代理服务器缓存常用的资源(如 CSS、JS、图片等),以提高网站加载速度。

        分布式缓存:用于分布式系统中,例如缓存服务器。它可以将多个节点上的缓存合并成一个统一的缓存层,提高数据访问速度和系统性能。

        综上所述,缓存是一种提高数据访问速度和系统性能的技术手段,广泛应用于计算机、网络、数据库和分布式系统等领域。通过合理配置和使用缓存,可以有效降低系统延迟,提高用户体验。

负载均衡

        负载均衡(Load Balancing)是一种计算机网络技术,用于在多个服务器或设备之间分配负载,提高系统的可靠性、可用性和性能。负载均衡可以有效解决单个服务器或设备性能瓶颈的问题,提高整体系统的处理能力,同时避免资源浪费。

        负载均衡的主要目标是在多个服务器或设备之间分配负载,确保每个服务器或设备都能在其最大负荷范围内运行。负载均衡可以应用于不同层次,包括网络层、应用层和数据库层。根据不同的应用场景,负载均衡可以采用不同的技术和策略,如轮询、最小连接数、源 IP 哈希等。

        负载均衡的优点包括:

        提高系统性能:通过将负载分配给多个服务器或设备,负载均衡可以提高整个系统的处理能力,从而提高系统性能。

        提高系统可用性:当某个服务器或设备发生故障时,负载均衡可以自动将其从负载分配中移除,确保其他服务器或设备继续提供服务,从而提高系统的可用性。

        提高系统可扩展性:通过增加服务器或设备,可以扩大系统的负载能力,从而提高系统的可扩展性。

        负载均衡可以避免单点故障,提高系统的稳定性。

        负载均衡的实现方式有很多,常见的负载均衡技术包括:

        DNS 轮询:通过配置 DNS 服务器,将域名解析到多个服务器的 IP 地址,当客户端请求时,DNS 服务器会轮询返回不同的 IP 地址。

        反向代理负载均衡:如 Nginx、HAProxy 等反向代理服务器可以实现负载均衡,将客户端请求分发到后端服务器。

        软件负载均衡:如 LVS(Linux Virtual Server)等软件负载均衡解决方案,可以在操作系统层面实现负载均衡。

        硬件负载均衡:如 F5、Citrix NetScaler 等硬件负载均衡设备,可以通过专用硬件实现负载均衡。

        云服务提供商的负载均衡服务:如 AWS ELB(Elastic Load Balancer)、阿里云负载均衡等,云服务提供商提供的负载均衡服务可以帮助用户在云环境中实现负载均衡。

        总之,负载均衡是一种提高系统性能、可用性和扩展性的关键技术,在计算机网络领域得到了广泛的应用。通过合理配置和使用负载均衡,可以有效提高系统性能,保证用户享受到更好的服务质量。

数据库复制

        数据库复制是指将一个数据库的数据同步到另一个数据库的过程,从而实现数据在不同数据库之间的一致性和同步更新。数据库复制技术在许多场景下具有重要意义,例如数据备份、数据同步、读写分离等。通过数据库复制,可以确保分布在不同地点的数据自动同步更新,从而保证数据的一致性。

        数据库复制的过程主要包括以下几个步骤:

        创建订阅:在源数据库中创建一个订阅,用于监听源数据库中的数据变化。当源数据库中的数据发生变化时,订阅会接收到这些变化的信息。

        数据变化捕获:订阅会捕获源数据库中的数据变化,如插入、更新和删除操作。这些数据变化会被记录在订阅中,等待同步到目标数据库。

        数据同步:通过将捕获到的数据变化从源数据库同步到目标数据库,实现数据在不同数据库之间的同步更新。数据同步可以通过多种方式进行,如批量同步、实时同步等。

        订阅管理:订阅可以分为多种类型,如事务订阅、合并订阅等。订阅管理用于管理和配置订阅,以满足不同场景下的需求。

        数据库复制技术可以应用于不同数据库系统之间,如 SQL Server、MySQL、Oracle 等。此外,还有许多开源的数据库复制软件,如 MySQL 的主从复制、SQL Server 的分布式事务等,可以帮助用户实现数据库复制功能。

        总之,数据库复制是一种重要的数据管理技术,可以确保数据在不同数据库之间的一致性和同步更新。通过使用数据库复制技术,企业可以提高数据的可用性、安全性和性能,从而为业务发展提供有力支持。

数据库分区

        数据库分区是一种物理数据库设计技术,它将一个大型数据库划分为多个较小的、独立的物理存储空间,以提高数据库的可管理性、性能和可用性。分区技术在许多大数据和数仓场景中得到广泛应用。

        数据库分区的主要目的是在保持数据完整性和一致性的前提下,将数据分散到多个物理存储设备上,从而提高查询速度和响应时间。分区可以有效地解决单个服务器或设备性能瓶颈的问题,提高整体系统的处理能力,同时避免资源浪费。

        常见的数据库分区方式包括:

        分区:将逻辑上的表划分为多个物理存储空间,这样查询数据时,不需要每次都扫描整个表。分区表由多个相关的底层表实现,这些底层表也是由句柄对象实现。

        分表:将一个大表按照一定的规则分解成多个小表,这些小表可以分布在同一块磁盘上,也可以分布在不同的机器上。应用程序在读写数据时,根据事先定义好的规则获取对应的子表名,然后操作相应的子表。

        数据库分区的优点包括:

        提高查询性能:通过将数据分散到多个物理存储设备上,可以显著提高查询速度和响应时间。

        提高系统可扩展性:通过增加物理存储设备,可以扩大数据库的存储容量,从而提高系统的可扩展性。

        负载均衡:将数据分散到多个物理设备上,可以实现负载均衡,提高整体系统的性能和可用性。

        便于管理:分区技术可以将大型数据库划分为多个较小的、独立的物理存储空间,从而提高数据库的可管理性。

        需要注意的是,数据库分区并非适用于所有场景。在实际应用中,需要根据具体的业务需求和数据特点来判断是否使用分区技术。此外,分区技术也有一些局限性,例如分区之间的数据迁移和同步等问题需要特别注意。

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

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

相关文章

SpringBoot实现发送邮件功能

平时注册或者登录一个网站时,可能收到过邮件用来发送验证码等,邮件在项目中经常会被用到,比如邮件发送通知,比如通过邮件注册,认证,找回密码,系统报警通知,报表信息等。 发送邮件用…

Vue组件之间传值

聊一聊vue里面组件之间的传值 首先总结一下vue里面传值的几种关系: 如上图所示, A与B、A与C、B与D、C与F组件之间是父子关系; B与C之间是兄弟关系;A与D、A与E之间是隔代关系; D与F是堂兄关系,针对以上关系 我们把组件…

每日一题——下一个排列

下一个排列 题目链接 读懂题目 要理解题目的意思,主要是要读懂这一句:整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。 我们来逐词分析: 其整数,即我们要将这个数组的数字构成一个十进制整数,例如数组…

Qt中布局管理使用总结

目录 1. 五大布局 1.1 QVBoxLayout垂直布局 1.2 QHBoxLayout水平布局 1.3 QGridLayout网格布局 1.4 QFormLayout表单布局 1.5 QStackedLayout分组布局 1.6 五大布局综合应用 2. 分割窗口 3. 滚动区域 4. 停靠区域 1. 五大布局 1.1 QVBoxLayout垂直布局 #include <…

软件测试/测试开发丨Web自动化测试 关键数据记录

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27105 记录关键数据的作用 内容作用日志1、记录代码执行情况&#xff0c;方便复现场景&#xff0c;也可以作为bug依据截图1、断言失败或成功的截图&#…

Yapi接口一键生成Java代码

Yapi上定义好接口之后,转换成Java代码时费时费力,都是重复劳动,毫无意义,所以有了这个工具把程序员从大量重复劳动中解放出来。 1:修改application.properties yapi.project.token=f1a0ea09031f41e1adfa18a 获取方法如下: yapi.api.interface.ids和yapi.api.cat.id只配置…

QT实现TCP通信(服务器与客户端搭建)

一、TCP通信框架 二、QT中的服务器操作 创建一个QTcpServer类对象&#xff0c;该类对象就是一个服务器调用listen函数将该对象设置为被动监听状态&#xff0c;监听时&#xff0c;可以监听指定的ip地址&#xff0c;也可以监听所有主机地址&#xff0c;可以通过指定端口号&#x…

mysql trace

optimizer_trace 它可以跟踪优化器做出的各种决策&#xff08;比如访问表的方法、各种开销计算、各种转换等&#xff09;&#xff0c;并将跟踪结果记录到 information_schema 数据库中的 optimizer_trace 表中。 mysql 默认是关闭 追踪的 开启、并设置格式为 josn,同时设置trac…

unity 之参数类型之引用类型

文章目录 引用类型引用类型与值类型的差异 引用类型 在Unity中&#xff0c;引用类型是指那些在内存中存储对象引用的数据类型。以下是在Unity中常见的引用类型的介绍&#xff1a; 节点&#xff08;GameObject&#xff09;&#xff1a; 在Unity中&#xff0c;游戏对象&#xff…

手写Mybatis:第20章-Mybatis 框架源码10种设计模式分析

文章目录 一、类型&#xff1a;创建型模式1.1 工厂模式1.2 单例模式1.3 建造者模式 二、类型&#xff1a;结构型模式2.1 适配器模式2.2 代理模式2.3 组合模式2.4 装饰器模式 三、类型&#xff1a;行为型模式3.1 模板模式3.2 策略模式3.3 迭代器模式 一、类型&#xff1a;创建型…

机器学习算法详解1:基础知识合集

机器学习算法详解1&#xff1a;基础知识合集 前言 ​ 本系列主要对机器学习上算法的原理进行解读&#xff0c;给大家分享一下我的观点和总结。 本篇前言 ​ 开一个新系列&#xff0c;另外现在开学了&#xff0c;忙起来了&#xff0c;所以更新会很慢。 目录结构 文章目录 机器学…

RS-485/RS-422收发器电路 DP3085 国产低成本替代MAX3085

DP3085是5V、半双工、15kV ESD 保护的 RS-485/RS-422 收发器电路&#xff0c;电路内部包含一路驱动器和一路接收器。 DP3085具有增强的摆率限制&#xff0c;助于降低输出 EMI 以及不匹配的终端连接引起的反射&#xff0c;实现 500kbps 的无误码数据传输。 DP3085芯片接收器输入…