【系统设计系列】 回顾可扩展性
系统设计系列初衷
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 的分布式事务等,可以帮助用户实现数据库复制功能。
总之,数据库复制是一种重要的数据管理技术,可以确保数据在不同数据库之间的一致性和同步更新。通过使用数据库复制技术,企业可以提高数据的可用性、安全性和性能,从而为业务发展提供有力支持。
数据库分区
数据库分区是一种物理数据库设计技术,它将一个大型数据库划分为多个较小的、独立的物理存储空间,以提高数据库的可管理性、性能和可用性。分区技术在许多大数据和数仓场景中得到广泛应用。
数据库分区的主要目的是在保持数据完整性和一致性的前提下,将数据分散到多个物理存储设备上,从而提高查询速度和响应时间。分区可以有效地解决单个服务器或设备性能瓶颈的问题,提高整体系统的处理能力,同时避免资源浪费。
常见的数据库分区方式包括:
分区:将逻辑上的表划分为多个物理存储空间,这样查询数据时,不需要每次都扫描整个表。分区表由多个相关的底层表实现,这些底层表也是由句柄对象实现。
分表:将一个大表按照一定的规则分解成多个小表,这些小表可以分布在同一块磁盘上,也可以分布在不同的机器上。应用程序在读写数据时,根据事先定义好的规则获取对应的子表名,然后操作相应的子表。
数据库分区的优点包括:
提高查询性能:通过将数据分散到多个物理存储设备上,可以显著提高查询速度和响应时间。
提高系统可扩展性:通过增加物理存储设备,可以扩大数据库的存储容量,从而提高系统的可扩展性。
负载均衡:将数据分散到多个物理设备上,可以实现负载均衡,提高整体系统的性能和可用性。
便于管理:分区技术可以将大型数据库划分为多个较小的、独立的物理存储空间,从而提高数据库的可管理性。
需要注意的是,数据库分区并非适用于所有场景。在实际应用中,需要根据具体的业务需求和数据特点来判断是否使用分区技术。此外,分区技术也有一些局限性,例如分区之间的数据迁移和同步等问题需要特别注意。
相关文章:

【系统设计系列】 回顾可扩展性
系统设计系列初衷 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/donnemart…...
科兴未来 |轨道交通专业赛 第十二届中国创新创业大赛
一、大赛主题 产业赋能 创享未来 二、参赛方向 1.自主可控的关键核心技术。面向“一带一路”国际市场、国内区域/市域轨道交通一体化需求,征集不同轨制、供电制式、通信信号、交通方式、载运工具等跨标准体系的适配关键应用技术,包括但不限于:列车自动…...

leetcode 42. 接雨水
2023.8.29 本题可以用双指针做,求出每一列能盛的雨水,再相加即可。不过暴力法会超时,需要优化。 双指针(暴力): class Solution { public:int trap(vector<int>& height) {int ans 0;for(int …...

【Lychee图床】本地电脑搭建私人图床,公网远程访问
文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站,可以看做是云存储的一部分,既可…...

【MySQL系列】-ORDER BY……HAVING详解及limit
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...
浅析Keil MDK下串行Flash的下载算法设计
浅析Keil MDK下串行Flash的下载算法设计-电子发烧友网 今天给大家介绍的是 Keil MDK 工具下 i.MXRT 的串行 NOR Flash 下载算法设计。 在 i.MXRT 硬件那些事系列之《在串行 NOR Flash XIP 调试原理》一文中,痞子衡简单提了一下串行 NOR Flash 下载算法的概念&…...

springboot自动装配原理,手写一个starter。
文章目录 springboot自动装配原理手写starter手写starter总结: springboot自动装配原理 口述: springboot自动装配的话它其实就是只需要我们添加一个starter起步依赖,它就能完成这个依赖组件相关Bean的自动注入,其实就是自动的将…...

革命性的电子元件:RAD继电器 | 百能云芯
在现代电子和通信系统中,RAD继电器是一种关键的电子元件,它在各种应用中发挥着重要作用。RAD继电器(Reed-relay Actuated Device)是一种基于磁性原理的电子开关,其特点是极其高速、可靠、低功耗和长寿命。下面云芯将为…...

文献阅读:Deep Learning Enabled Semantic Communication Systems
目录 论文简介关于文章内容的总结引申出不理解的问题 论文简介 作者 Huiqiang Xie Zhijin Qin Geoffrey Ye Li Biing-Hwang Juang 发表期刊or会议 《IEEE TRANSACTIONS ON SIGNAL PROCESSING》 发表时间 2021.4 这篇论文由《Deep Learning based Semantic Communications: A…...

巨人互动|游戏出海游戏出海效果怎样?
游戏出海是指将原本面向国内市场的游戏产品进行调整和优化,以适应海外市场的需求,并进行推广和销售。下面小编讲讲关于游戏出海对于游戏效果的影响的一些讨论点。 1、市场扩大 通过游戏出海,可以将游戏产品的目标受众从国内扩展到全球范围内…...
二、GoLang输出HelloWorld、变量定义、数据类型的转换
一、输入Hello World go语言中,想要输出内容到控制台,package必须是main,包括方法名也必须是main, go语言输出的语法是 fmt 库。 package mainimport "fmt"func main() {// go语言中 输出内容 使用的库是 fmt库fmt.Pr…...

Mars3d图层树//图层管理加载时设置默认折叠的状态
问题:Mars3d图层树//图层管理加载时设置默认折叠的状态。 设置参考: 有个参数 open:false,写在对应的图层配置下,比如某个节点不展示,就对这个节点配置下。 如果全局,可以搜下这个widget内的代码ÿ…...
区块链技术|DApp与传统应用程序的关键区别
在数字时代,应用程序已经成为我们生活的一部分,无论是社交媒体、金融服务还是娱乐媒体,应用程序几乎无处不在。然而,随着区块链技术的崭露头角,一种新型应用程序——去中心化应用程序(DApp)正在…...
Python 加密解密技巧大揭秘:让你的数据安全无忧
建议食用原文链接效果更佳 Python 加密解密技巧大揭秘:让你的数据安全无忧 今天我们将探讨在 Python 中常见的加密解密算法,并通过代码案例来帮助大家更好地理解它们的实现。 在开始之前,请确保您已经安装了 pycryptodome 这个库。您可以使用…...
C#判断字符是否为utf16编码
unity截取显示微信昵称后,出现异常Error: UTF-16 to UTF-8 conversion failed because the input string is invalid,原因是截取字符串刚好截到了表情后面,解决思路是从截取到的索引向前遍历,找第一个不是utf16编码的字符…...

centos7上hive3.1.3安装及配置
1、安装背景; hive是基于hadoop的数据仓库软件,部署运行在linux系统之上,安装之前必须保证hadoop环境运行正常,hive本身不是分布式软件,它的分布式主要是借助hadoop实现,存储是hdfs,计算是mapr…...

Redis面试题(笔记)
目录 1.缓存穿透 2.缓存击穿 3.缓存雪崩 小结 4.缓存-双写一致性 5.缓存-持久性 6.缓存-数据过期策略 7.缓存-数据淘汰策略 数据淘汰策略-使用建议 数据淘汰策略总结 8.redis分布式锁 setnx redission 主从一致性 9.主从复制、主从同步 10.哨兵模式 服务状态监…...

iPhone 15 Pro展示设计:7项全新变化呈现
我们不应该再等iPhone 15 Pro在苹果9月12日的“Wonderlust”活动上发布了,而且可能会有很多升级。有传言称,iPhone 15 Pro将是自iPhone X以来最大的飞跃,这要归功于大量的新变化,从带有更薄边框的新钛框架到顶级A17仿生芯片和动作…...
【六袆 - Windows】PL/SQL instantclient安装包下载;PL/SQL双击登录配置
安装 PL/SQL 15 OMIT Oracle Instant Client Downloads for Microsoft Windows (x64) 64-bit https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html 配置 # tnsnames.ora Network Configuration File:E:\oracle\product\10.2.0\db_1\ne…...

Springboot+mybatis-plus+dynamic-datasource 切换数据源失败问题总结
Springbootmybatis-plusdynamic-datasourceDruid 多数据源 切换数据源失败总结 文章目录 Springbootmybatis-plusdynamic-datasourceDruid 多数据源 切换数据源失败总结0.前言1. dynamic-datasource 切换数据源失败场景总结1. spring-batch整合情况下切换数据源异常解决办法&am…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...