[Redis#1] 前言 | 再谈服务端高并发分布式结构的演进

目录

电子商务应用架构演进

概述

常见概念

架构演进

总结

总结

[应用(Application)/ 系统(System)](#应用(Application)/ 系统(System))

[模块(Module)/ 组件(Component)](#模块(Module)/ 组件(Component))

分布式(Distributed)

集群(Cluster)

[主(Master)/ 从(Slave)](#主(Master)/ 从(Slave))

中间件(Middleware)

可用性(Availability)

[响应时长(Response Time RT)](#响应时长(Response Time RT))

[吞吐(Throughput)vs 并发(Concurrent)](#吞吐(Throughput)vs 并发(Concurrent))

分布式系统小结


在 docker 中我们有提到 [Docker#1] 专栏前言 | 亿级高并发架构演进之路

在讲解 redis 之前,我们再对架构 进行进一步的了解,对于 redis 的讲解,难免离不开分布式~


电子商务应用架构演进

概述

本文以"电子商务"应用为例,介绍从一百个到千万级并发情况下服务端的架构演进过程。目的:帮助读者建立对架构演进的整体认知,便于深入学习后续知识。

常见概念
  • 应用(Application)/ 系统(System):完成一系列服务的程序或程序群。
  • 模块(Module)/ 组件(Component):负责特定功能的内聚单元。
  • 分布式(Distributed) :系统组件部署在不同服务器上,通过网络通信协作。(物理上
  • 集群(Cluster) :多个组件部署在多台服务器上,共同实现特定目标。(逻辑上
  • 主(Master)/ 从(Slave):集群中承担主要或辅助职责的组件。例如: 一个写,多个同步读的模式
  • 中间件(Middleware):不同应用程序间通信的桥梁。与业务无关的更通用的服务(eg. sql,cache,消息队列...

评价指标

  • 可用性(Availability) :系统正常提供服务/一年总时长 的时间比例。

例如:平时我们常说的++4个9即系统可以提供99.99%的可用性,5个9是99.999%的可用性,++以此类推。我们平时只是用高可用(High Availability, HA)这个非量化目标简要表达我们系统的追求。

  • 响应时长(Response Time RT) :用户输入到系统响应的时间。
  • 吞吐(Throughput)vs 并发(Concurrent) :单位时间内处理的请求数量 vs 同时支持的最大请求数量。

响应时长 和 吞吐 并发 都是衡量服务器性能的标准

架构演进

1 单机架构

  • 适用场景:早期用户访问量少,系统简单,无需专业运维团队。
  • 架构描述:用户请求通过DNS解析到单机服务器,服务器同时提供应用服务和数据库服务。
  • 相关软件 :Web服务器(Tomcat、Netty、Nginx、Apache等)、数据库(MySQL、Oracle、PostgreSQL、SQL Server等)。

2 应用数据分离架构

  • 适用场景:系统访问量增加,硬件资源接近极限。
  • 架构描述:应用服务和数据库服务分离部署,应用服务通过网络访问数据库。
  • 优势:最小代价提升系统承载能力。

3 应用服务集群架构

  • 适用场景:单台应用服务器无法满足需求。--引入负载均衡
  • 方案选择
    • 垂直扩展(Scale Up):购买更高性能的服务器,成本高且提升有限。
    • 水平扩展(Scale Out):增加应用服务器数量,成本相对较低,提升空间大。
  • 引入组件 :负载均衡(Nginx、HAProxy、LVS、F5等)。
  • 流量调度算法
    • Round-Robin:公平地将请求分发给不同服务器。
    • Weight-Round-Robin:按权重分配请求。
    • 一致哈希散列算法:确保同一用户的请求分发到同一服务器。

4 读写分离 / 主从分离架构

  • 适用场景:数据库成为系统瓶颈。
  • 运用:我们采用的解决办法是这样的,保留一个主要的数据库作为写入数据库,其他的数据库作为从属数据库。从库的所有数据全部来自主库的数据,经过同步后,从库可以维护着与主库一致的数据。
  • 优点:然后为了分担数据库的压力,我们可以将写数据请求全部交给主库处理,但读请求分散到各个从库中。由于大部分的系统中,读写请求都是不成比例的,例如++100次读1次写,所以只要将读请求由各个从库分担之后,数据库的压力就没有那么大了。++
  • 问题:当然这个过程不是无代价的,主库到从库的数据同步其实是有时间成本的,但这个问题我们暂时不做进一步探讨。
  • 解决方案:保留一个主数据库用于写入,其他从数据库用于读取,通过数据同步保持一致性。
  • 相关软件 :数据库中间件(MyCat、TDDL、Amoeba、Cobar等)。

5 引入缓存 - 冷热分离架构

  • 随着访问量继续增加,发现业务中⼀些数据的读取频率远⼤于其他数据的读取频率。我们把这部 分数据称为热点数据,与之相对应的是冷数据。
  • 适用场景:读取频率高的热点数据增加。读取频率高的热点数据增加。
  • 解决方案 :使用本地缓存和分布式缓存(Memcached、Redis)减少数据库压力。
  • 面临问题:缓存一致性、缓存穿透/击穿、缓存雪崩、热点数据集中失效等。

6 垂直分库

随着业务的数据量增大,大量数据存储在同一个库中已经显得有些力不从心了,所以可以按照业务,将数据分别存储。

  • 例如针对评论数据 ,可按照商品ID进行hash,路由到对应的表中存储;
  • 针对支付记录 ,可按照小时创建表,每个小时表继续拆分为小表,使用用户ID或记录编号来路由数据。

只要实时操作的表数据量足够小,请求能够均匀地分发到多台服务器上的小表,数据库就能通过水平扩展的方式来提高性能。

  • 其中前面提到的Mycat也支持在大表拆分为小表情况下的访问控制。
  • 这种做法显著增加了数据库运维的难度,对DBA的要求较高。
  • 数据库设计到这种结构时,已经可以称为分布式数据库。

但是这只是⼀个逻辑的数据库整体,数据库⾥不同的组成部分是由不同的组件单独来实现的

  1. 如分库分表的管理和请求分发,由Mycat实现
  2. SQL的解析由单机的数据库实现
  3. 读写分离可 能由⽹关和消息队列来实现
  4. 查询结果的汇总可能由数据库接口层来实现等等

这种架构其实是MPP (⼤规模并行处理)架构的⼀类实现。

适用场景:数据量增大,单库难以支撑。

  • 解决方案:按业务将数据分库存储,使用Mycat等工具管理分库分表。
  • 相关软件 :分布式数据库(Greenplum、TiDB、Postgresql XC、HAWQ等)。

7 业务拆分 - 微服务

  • 随着⼈员增加,业务发展,我们将业务分给不同的开发团队去维护,每个团队独⽴实现⾃⼰的微服务,然后互相之间对数据的直接访问进⾏隔离

适用场景:业务复杂度增加,团队扩大。

  • 解决方案 :将业务拆分为独立的微服务,通过Gateway、消息总线等技术实现服务间的调用。
  • 公共服务:安全中心、监控预警中心等。
总结
  • 架构演进顺序:实际场景中可能同时存在多个问题,需根据具体情况灵活解决。
  • 扩展接口:预留扩展接口以应对未来需求。
  • 大数据架构 :涉及数据采集、存储、分析、服务等多个环节,提供分布式存储、计算等能力。

突然回忆到了,博主之间对结构的一篇文章:【Linux详解】冯诺依曼架构 | 操作系统设计 | 斯坦福经典项目Pintos,重点摘要如下 :

• 底层硬件:遵顼冯诺依曼体系系结构,通过内存为枢纽的数据数据交换,实现了降本增效,使得计算机走入百姓家中

• 驱动程序:操作系统管理系统管理硬键的重要手段,操作系统通过驱动程序获取硬件的信息,进而而实行管理

• 操作系统:计算机体系中的管理者,管理各种各样的软硬件资源,遵循先描述,再组织的重要思想,使得操作系统可以批量管理众多软硬件

• 系统调用接口:为了保证操作系统提供的服 务是安全可靠的,通过系统调用接口来帮助 用户访问问计算机,同时保护了操作系统内部的数据

• 用户操作接口:直接通过系统调用接口访 问计算机会比较麻烦,于是通过用户操作接口以更加便捷的方式提供服务,并且提供了跨平台的特性,使得计算机的访问方便快捷


总结

应用(Application)/ 系统(System)
  • 一个应用, 就是一个/组服务器程序
模块(Module)/ 组件(Component)
  • 一个应用, 里面有很多个功能。每个独立的功能, 就可以称为是一个模块/组件
分布式(Distributed)
  • 引入多个主机/服务器, 协同配合完成一系列的工作。(物理上
集群(Cluster)
  • 引入多个主机/服务器, 协同配合完成一系列的工作。(逻辑上
主(Master)/ 从(Slave)
  • 分布式系统中一种比较典型的结构~ ~
  • 多个服务器节点, 其中一个是主, 另外的是从。从节点的数据要从主节点这里同步过来~ ~
中间件(Middleware)

和业务无关的服务(功能更通用的服务)

  1. 数据库
  2. 缓存
  3. 消息队列
  4. ...
可用性(Availability)
  • 系统整体可用的时间 / 总的时间
  • 360 / 365 => 可用性~ ~
  • 4 个9即系统可以提供99.99% 的可用性,5 个9 是99.999%
响应时长(Response Time RT)
  • 衡量服务器的性能
  • 越小越好~ ~
吞吐(Throughput)vs 并发(Concurrent)
  • 衡量系统的处理请求的能力。衡量性能的一种方式

分布式系统小结

1.单机架构 (应用程序 + 数据库服务器)

2.数据库和应用分离

  • 应用程序和数据库服务器分别放到不同主机上部署了.

3.引入负载均衡, 应用服务器 => 集群

  • 通过负载均衡器, 把请求比较均匀的分发给集群中的每个应用服务器.
  • 当集群中的某个主机挂了, 其他的主机仍然可以承担服务.
  • 提高了整个系统的可用性~ ~

4.引入读写分离, 数据库主从结构

  • 一个数据库节点作为主节点, 其他N个数据库节点作为从节点.
  • 主节点负责写数据, 从节点负责读数据.
  • 主节点需要把修改过的数据同步给从节点~

上述四点,都是为了 高效的处理更多的数据


5.引入缓存, 冷热数据分离

  • Redis 在一个分布式系统中, 通常就扮演着缓存这样的角色~ ~
  • 引入的问题: 数据库和缓存的数据一致性问题~ ~

6.引入分库分表, 数据库能够进一步扩展存储空间

7.引入微服务, 从业务上进一步拆分应用服务器

  • 从业务功能的角度, 把应用服务器, 拆分成更多的功能更单一, 更简单, 更小的服务器.

上述这样的几个演化的步骤, 只是一个粗略的过程.

实际上一个商业项目, 真实的演化过程, 都是和他的业务发展密切相关的.
业务是更重要的, 技术是给业务提供支持的.

所谓的分布式系统, 就是想办法引入更多的硬件资源!!

相关推荐
陈鋆3 分钟前
MySQL深入:B+树的演化、索引和索引结构
数据库·b树·mysql
小天博客5 分钟前
PgSQL汇总
数据库·postgresql·pgsql
jun7788957 分钟前
SpringBoot整合ELK使用详解
spring boot·后端·elk
大保安DBA13 分钟前
力扣2298. 周末任务计数
数据库·算法·leetcode
Ljw...15 分钟前
网络基础Linux
linux·网络·网络协议
冰箱里的金鱼21 分钟前
Redis 内存管理
数据库·redis·缓存
有被蠢哭到26 分钟前
Python连接Mysql、Postgre、ClickHouse、Redis常用库及封装方法
redis·python·mysql·clickhouse·postgresql
SlothLu29 分钟前
Debezium-MySqlConnectorTask
java·大数据·数据库·多线程·数据库开发·debezium·数据迁移
LuckyRich139 分钟前
【贪心算法】贪心算法三
redis·算法·贪心算法
莳花微语42 分钟前
Linux云平台Oracle 12c安装与数据迁移
linux·阿里云·oracle·数据迁移