C++ 全栈知识体系C++ 全栈知识体系
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
  • 编程语言与技术

    • Effective C++: 改善程序与设计的55个具体做法

      • 第2章 - 构造/析构/赋值运算(一)
      • 第2章 - 构造/析构/赋值运算(二)
      • 第2章 - 构造/析构/赋值运算(三)
      • 第3章 - 资源管理
      • 第4章 - 设计与声明(一)
      • 第4章 - 设计与声明(二)
      • 第5章 - 实现(一)
      • 第5章 - 实现(二)
      • 第6章 - 继承与面向对象设计
      • 第7章 - 模板与泛型编程
    • 深度探索C++对象模型

      • 第1章 - 关于对象
      • 第2章 - 构造函数语意学
      • 第3章 - Data 语意学
    • STL源码剖析

      • 第1章 - STL概论和版本简介
      • 第2章 - 空间配置器
      • 第3章 - 迭代器(iterators)概念与traits编程技法(一)
      • 第3章 - 迭代器(iterators)概念与traits编程技法(二)
      • 第4章 - 序列式容器 vector
      • 第4章 - 序列式容器 list
      • 第4章 - 序列式容器 deque
      • 第4章 - 序列式容器 stack和queue
      • 第4章 - 序列式容器 heap
      • 第4章 - 序列式容器 priority_queue
      • 第4章 - 序列式容器 slist
      • 第5章 - 关联式容器 RB-tree
      • 第5章 - 关联式容器 set和map
      • 第5章 - 关联式容器 hashtable
      • 第6章 - 算法
      • 第6章 - 算法之set
      • 第7章 - 仿函数
      • 第8章 - 配接器
  • 系统与架构

    • 深入理解计算机系统

      • 第1章 - 计算机系统漫游
      • 第2章 - 信息的表示和处理
      • 第3章 - 程序的机器级表示
      • 第5章 - 优化程序性能
      • 第6章 - 存储器层次结构
      • 第7章 - 链接
      • 第8章 - 异常控制流
      • 第9章 - 虚拟内存
      • 第10章 - 系统级I/O
      • 第11章 - 网络编程
      • 第12章 - 并发编程
    • 大型网站技术架构——核心原理与案例分析

      • 第1章 - 大型网站架构演化
      • 第2章 - 大型网站架构模式
      • 第3章 - 大型网站核心架构要素
      • 第4章 - 瞬时响应:网站的高性能架构
      • 第5章 - 万无一失:网站的高可用架构
      • 第6章 - 永无止境:网站的伸缩性架构
      • 第7章 - 随需应变:网站的可扩展架构
      • 第8章 - 固若金汤:网站的安全架构
    • 从零开始学架构

      • 架构基础
      • 架构设计原则
      • 高性能架构
      • 高可用架构
    • 程序员的自我修养————链接、装载与库

      • 第1章 - 简介
      • 第2章 - 静态链路
      • 第3章 - 目标文件里有什么
      • 第4章 - 静态链接
      • 第7章 - 动态链接
      • 第8章 - 共享库版本
      • 第10章 - 内存
      • 第11章 - 运行库
      • 第12章 - 系统调用与API
      • 第13章 - 运行库实现
  • 软件开发实践

    • 重构改善既有代码的设计

      • 第1章 - 重构,第一个示例
      • 第2章 - 重构的原则
      • 第3章 - 代码的坏味道
      • 第5章 - 重构列表
      • 第6章 - 重新组织函数
      • 第7章 - 在对象之间搬移特性
      • 第8章 - 重新组织数据
      • 第9章 - 简化条件表达式
      • 第10章 - 简化函数调用
      • 第11章 - 处理概括关系
      • 第12章 - 设计之大型重构
    • 代码大全2

      • 第1章 - 欢迎进入软件构建的世界
      • 第2章 - 用隐喻来更充分地理解软件开发
      • 第3章 - 三思而后行: 前期准备
      • 第4章 - 关键的构建决策
      • 第5章 - 软件构建中的设计
    • Linux多线程服务端编程——使用muduo C++ 网络库

      • Buffer类的设计
      • 设计与实现
      • 定时器与TimerQueue
      • Protobuf网络传输和Protobuf编解码器与消息分发器
      • EventLoop类剖析
      • EventLoopThread和EventLoopThreadPool剖析
      • TCP网络库和核心类
      • Connector剖析
      • TcpClient剖析
      • 学习总结
      • timing wheel
      • 消息广播服务
      • 线程安全的对象生命期管理
  • 数据处理与应用设计

    • 数据密集型应用系统设计

      • 第1章 - 可靠、可扩展与可维护的应用系统
      • 第2章 - 数据模型与查询语言
      • 第3章 - 数据存储与检索
      • 第4章 - 数据编码与演化
      • 第5章 - 数据复制
      • 第6章 - 数据分区
      • 第7章 - 事务

从零开始学架构 - 高性能架构

    存储高性能

    • 关系数据库

      • 读写分离:将访问压力分散到集群中的多个节点,但是并没有分散存储压力。

      • 分库分表:既可以分散访问压力,又可以分散存储压力。

        • 业务分库:分散存储和访问压力

            - 引入问题
          
            	- join操作问题
          
            		- 原本在同一数据库的表分散到不同数据库中,导致无法使用SQL的join查询。
          
            	- 事务问题
          
            		- 原本在同一数据库中不同的表可以在同一个事务中修改,业务分库后,表分散到不同的数据库中,无法通过事务统一修改。
          
            	- 成本问题
          
            		- 原来只需要1台服务器就能处理的事情,可能需要扩展为3台或者更多。
          
        • 分表

            - 垂直分表:适合将表中某些不常用且占了大量空间的列拆分出去。
          
            	- 引入问题
          
            		- 因为表信息被分散到多个表中,导致原来一次查询,现在可能需要2次或者更多。
          
            - 水平分表:适合表行数据特别大的表,例如单表行记录超过5000万条。
          
            	- 引入问题
          
            		- 路由:水平分表后,某条数据具体属于哪个切分后的子表,需要增加路由算法进行计算
          
            			- 范围路由
            			- Hash路由
            			- 配置路由
          
            		- count()操作
          
            			- 原始对表进行count()操作,切分后需要 表个数 * count(*) 
          
            		- 记录数表
          
            			- 新建一张表,记录每次插入或删除子表数据后,表的记录数。
          
      • 实现方法

        • 程序代码封装:在代码中抽象一个数据访问层来实现读写分离、分库分表

        • 中间件封装:独立一套系统出来,实现读写分离和分库分表操作

        • 实现复杂度:分库分表比读写分离要复杂的多。

            - 读写分离实现时,只需识别SQL操作是读操作还是写操作接口,即通过关键字SELECT、UPDATE、INSERT、DELETE就可以判断。
            - 分库分表除了要判断操作类型,还需要判断SQL中具体要操作的表、操作函数(count、order by、group by),然后根据不同的操作进行不同的处理。
          
      • 存在缺点

        • 关系数据库存储的是行记录,无法存储数据结构
        • 关系数据库的表结构schema扩展很不方便
        • 关系数据库在大数据场景下I/O较高
        • 关系数据库的全文搜索功能比较弱
    • NoSQL

      • 关系数据库

      • NoSQL的本质是牺牲ACID特性中的某个或某些特性,作为关系数据库的补偿。

      • 常用的NoSQL方案有如下4类

        • K-V存储:解决关系数据库无法存储数据结构的问题,以Redis为代表。

        • 文档数据库:解决关系数据库强schema约束的问题,以MongoDB为代表。 文档数据库最大特点是no-schema,可以存储和读取任意的数据,数据格式一般为JSON.

          优势:
          
          新增字段简单;
          
          历史数据不会出错;
          
          可以很容器存储复杂数据。
          
        • 列式数据库:解决关系数据库大数据场景下I/O问题,以HBase为代表。 例如,统一某城市超重人员的数量,只需读取体重这一列的数据即可。

        • 全文搜索引擎:解决关系数据库的全文搜索性能问题,以Elasticsearch为代表。

    • 缓存

      • 基本原理:将可能重复使用的数据放到内存中,一次生成,多次使用,避免每次使用都去访问存储系统。

      • 面临的问题

        • 缓存穿透:访问了缓存中不存在的数据,导致业务系统需要再次访问数据库,导致对数据库服务器造成压力。
        • 缓存击穿:单个高热数据过期的瞬间,数据访问量较大,未命中缓存后,发起了大量对同一数据的数据库访问,导致对数据库服务器造成压力
        • 缓存预热:系统启动前,提前将相关的缓存数据直接加载到缓存系统。
        • 缓存雪崩:由于大量的热数据设置了相同或接近的过期时间,导致缓存在某一时刻密集失效,大量请求全部转发到DB,导致存储系统受到巨大压力,最终导致系统崩溃

    计算高性能

    • 单服务器高性能

      • PPC(Process per Connection),每次有新的连接就新建一个进程专门处理这个连接的请求。

      • prefork:提前创建进程,便于后续直接使用

      • TPC(Thread per Connection),每次有新的连接就新建一个线程专门处理这个连接的请求。

      • prethread:提前创建线程,便于后续直接使用

      • Reactor(非阻塞同步网络模型):核心组件包括Reactor和处理资源池,其中Reactor负责监听和分配事件,处理资源池负责处理事件。

        • 1.父进程中mainReactor对象通过select监控连接建立事件,收到事件后通过Acceptor接收,将新的连接分配给某个子进程。
        • 2.子进程subReactor将mainReactor分配的连接加入连接队列进行监听,并创建一个Handler用于处理连接的各种事件。
        • 3.当有新的事件发生时,subReactor会调用连接对应的Handler来进行响应。
        • 4.Handler完成 read ——> 业务处理 ——> send的完整业务流程。
        • 图片
      • Proactor(异步网络模型):核心组件包括Proactor和异步操作处理器。

        • 1.Proactor Initiator 负责创建 Proactor 和 Handler,并将Proactor 和 Handler 都通过Asynchronous Operation Processor 注册到内核。
        • 2.Asynchronous Operation Processor 负责处理注册请求,并完成I/O操作。
        • 3.Asynchronous Operation Processor 完成I/O操作后通知Proactor。
        • 4.Proactor根据不同的事件类型回调不同的Handler进行业务处理。
        • 5.Handler完成业务处理,Handler也可以注册新的Handler到内核进程。
        • 图片
    • 集群高性能

      • 本质:通过增加更多的服务器来提升系统整体的计算能力

      • 复杂性:增加任务分配器,以及选择一个合适的任务分配算法。(任务分配器,更通俗的叫法是 负载均衡器)

      • 负责均衡分类

        • DNS负载均衡:实现地理级别的负载均衡。例如北方用户访问北京的机房;南方用户访问深圳的机房。
        • 硬件负载均衡:通过单独的硬件设备来实现集群级别的负载均衡。这类设备和路由器交换机类似,可以理解为一个用于负载均衡的基础网络设备。
        • 软件负载均衡:通过负载均衡软件实现机器级别的负载均衡。
      • 负载均衡架构

        • 实际使用的时候,可以灵活地使用上述三种负载均衡方法,首先通过DNS负载均衡找到最近城市的服务器ip,通过硬件负载均衡找到城市对应的集群组,最后通过软件负载均衡在集群组内找到所需的集群。
      • 负载均衡的算法

        • 任务平分类:轮询、加权轮询
        • 负载均衡类:负载最低优先
        • 性能最优类:响应时间最短优先
        • Hash类:根据任务的某些关键信息进行hash运算,从而映射到指定主机
    Last Updated:
    Contributors: klc407073648
    Prev
    架构设计原则
    Next
    高可用架构