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

系统设计系列初衷

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.rhkb.cn/news/125403.html

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

相关文章

后端/DFT/ATPG/PCB/SignOff设计常用工具/操作/流程及一些文件类型

目录 1.PD/DFT常用工具及流程 1.1 FC和ICC2 1.2 LC (Library compiler) 1.3 PrimeTime 1.4 Redhawk与PA 1.5 Calibre和物理验证PV 1.6 芯片设计流程 2.后端、DFT、ATPG的一些常见文件 2.1 LEF和DEF 2.2 ATPG的CTL和STIL 2.3 BSDL 2.4 IPXCT 3.PCB设计的一些工作和工…

RabbitMQ: Routing结构

生产者 package com.qf.mq2302.routing;import com.qf.mq2302.utils.MQUtils; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection;public class EmitLog {public static final String EXCHANGE_NAME"emitlogs";public static void main(…

OpenCV 03(数据结构--Mat)

一、Mat介绍 Mat是OpenCV在C语言中用来表示图像数据的一种数据结构.在python中转化为numpy的ndarray. Mat由header和data组成, header中记录了图片的维数, 大小, 数据类型等数据. 1.1 Mat拷贝 - Mat共享数据 在python中Mat数据对应numpy的ndarray, 使用numpy提供的深浅拷贝方…

NIFI实现数据库数据增量同步

说明 nifi版本:1.23.2(docker镜像) 需求背景 将数据库中的数据同步到另一个数据库中,要求对于新增的数据和历史有修改的数据进行增量同步 模拟数据 建表语句 源数据库和目标数据库结构要保持一致,这样可以避免后…

【美团3.18校招真题1】

大厂笔试真题网址:https://codefun2000.com/ 塔子哥刷题网站博客:https://blog.codefun2000.com/ 小美剪彩带 提交网址:https://codefun2000.com/p/P1088 题意:找出区间内不超过k种数字子数组的最大长度 使用双指针的方式&…

基于SSM的学校运动会信息管理系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

Paimon+StarRocks 湖仓一体数据分析方案

本文整理自阿里云高级开发工程师曾庆栋(曦乐)在 Streaming Lakehouse Meetup 分享的内容,深入探讨了传统数据仓库分析、PaimonStarRocks湖仓一体数据分析、StarRocks 与 Paimon 的协同使用方法与实现原理,以及StarRocks 社区湖仓分…

Android高通 8.1 老化apk打开摄像头花屏问题

1、最近由于公司VR 3D系统要做双Camera老化测试apk,同时老化4小时需要轮询切换二个摄像头,保证后面camera标定精度数据更准确。 2、一开始我尝试用之前方案移植过去然后同时打开双摄像头 突然发现花屏 如下图所示 3、于是一第一时间想到是不是分辨率不兼…

揭秘iPhone 15 Pro Max:苹果如何战胜三星

三星Galaxy S23 Ultra在我们的最佳拍照手机排行榜上名列前茅有几个原因,但iPhone 15 Pro Max正在努力夺回榜首——假设它有一个特定的功能。别误会我的意思,苹果一直在追赶三星,因为它的iPhone 14 Pro和14 Pro Max都表现强劲。尽管如此&#…

如何把Android Framework学彻底?一条龙学习

Framework通俗易懂 平时学习 Android 开发的第一步就是去学习各种各样的 API,如 Activity,Service,Notification 等。其实这些都是 Framework 提供给我们的。Framework 层为开发应用程序提供了非常多的API,我们通过调用这些 API …

Java虚拟机反射机制

1 什么是Java虚拟机反射机制? 虚拟机在运行期间,对于任何一个类,我们都能知道其内部信息,包括属性,方法,构造函数,实现接口;对于任何一个对象,我们都能获取其字段值、调…

【Redis】Redis 的学习教程(七)之 SpringBoot 集成 Redis

在前几篇文章中,我们详细介绍了 Redis 的一些功能特性以及主流的 java 客户端 api 使用方法。 在当前流行的微服务以及分布式集群环境下,Redis 的使用场景可以说非常的广泛,能解决集群环境下系统中遇到的不少技术问题,在此列举几…

软件测试面试:app闪退的原因(超详细~)

APP闪退的原因是软件测试面试中常见的问题,遇到这个问题时我们应该如何回答呢?实际的测试过程遇到APP闪退的问题应该排查呢? 今天这篇文章就来告诉你答案。 同时,我也为大家准备了一份软件测试视频教程(含面试、接口…

Vue2进阶篇学习笔记

文章目录 Vue2进阶学习笔记前言1、Vue脚手架学习1.1 Vue脚手架概述1.2 Vue脚手架安装1.3 常用属性1.4 插件 2、组件基本概述3、非单文件组件3.1 非单文件组件的基本使用3.2 组件的嵌套 4、单文件组件4.1 快速体验4.2 Todo案例 5、浏览器本地存储6、组件的自定义事件6.1 使用自定…

计算机毕业设计 基于SSM的问卷调查管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

OpenCV(三十二):轮廓检测

1.轮廓概念介绍 在计算机视觉和图像处理领域中,轮廓是指在图像中表示对象边界的连续曲线。它是由一系列相邻的点构成的,这些点在边界上连接起来形成一个封闭的路径。 轮廓层级: 轮廓层级(Contour Hierarchy)是指在包含…

826. 安排工作以达到最大收益;2257. 统计网格图中没有被保卫的格子数;816. 模糊坐标

826. 安排工作以达到最大收益 核心思想:排序维护最大利润。首先我们需要对工人按照能力排序,前面工人满足的最大利润后面的工人肯定是满足的,所以我们只需要用一个tmp来维护小于等于当前工人的最大利润,然后如何得到tmp&#xff…

2023国赛A题保姆级思路代码:定日镜场的优化设计

A题是一套传统的机理分析加规划求解题,首先我们要根据每个月21号的特定时间点建立一个太阳角度框架,根据题目所给出的公式计算效率,还有输出的热功率,然后根据月份求解各种效率,再把年份进行汇总,二三题都是…

功能定义-紧急制动系统

功能简介 紧急制动系统的触发过程如上图所示: 安全距离报警:当两车距离较近时,会给予驾驶员相应提示 预报警:当两车存在碰撞风险但风险较低【Danger Level1】时,会给予驾驶员提示【提示相比之前更为明显】 制动预填充&…

vue前后端端口不一致解决方案

在config index.js文件中 引入如下代码即可 const path require(path) const devEnv require(./dev.env) module.exports {dev: {// PathsassetsSubDirectory: static,assetsPublicPath: /,proxyTable: devEnv.OPEN_PROXY false ? {} : {/api: {target: http://localhos…