Redis—分布式系统

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
传统型负载均衡 CLB,每月750个小时 15LCU
简介: Redis—分布式系统

🔎理解分布式


一台主机的硬件资源是有限的

包括但不限于:

  1. CPU
  2. 内存
  3. 硬盘
  4. 主板
  5. 网络适配器

服务器每收到一个请求, 都需要消耗上述的一些资源

如果同一时刻处理的请求过多, 可能导致某个硬件资源的性能陷入瓶颈

如果遇到这种场景, 应对方式有 2 种

  1. 开源(针对硬件 → 增加更多的硬件资源)
  2. 节流(针对软件 → 对软件进行优化, 通过性能测试找到性能瓶颈)

对于开源的具体解释🍭

一台主机上所能增加的硬件资源是有限的(取决于主板的扩展能力), 当一台主机扩展到极限时, 资源还是不够, 就需要引入多台主机

引入多台主机之后, 系统就可以称为是分布式系统(此时响应的代码也需要做出调整)

题外话🍭

引入分布式, 相对于程序员, 并不是一件好事

这是因为分布式的引入, 所带来的复杂程度大大提高 → 从而导致出 BUG 的概率提高 → 年终奖丢失的概率与加班的概率大大提高

🔎分布式—应用服务与数据库服务分离


单机服务器 → 应用服务与数据库服务未分离

应用服务器 + 数据库服务器 → 应用服务与数据库服务分离(分布式)

针对不同服务器涉及的不同场景, 分配不同但更合理的硬件资源

对于应用服务器, 可能包含更多的业务操作. CPU, 内存的利用率更高 → 于是选择较好的 CPU, 内存

对于数据库服务器, 可能需要更多的硬盘空间, 更快的访问速度 → 于是选择更大的固态硬盘

引入更多的应用服务节点


应用服务可能会消耗较多的 CPU 和内存, 如果 CPU 和内存耗光, 此时的应用服务器就会宕机

为了解决上述问题, 于是引入更多的应用服务器

通过负载均衡, 合理的分配应用服务器的工作

理解负载均衡


假设有 1 万个请求, 有 4 台应用服务器

此时按照负载均衡的方式, 就可以让每台服务器承担 2.5k 的访问量

举个栗子🌰

将负载均衡器看作是一个小组的领导, 应用服务器看作是小组的组员

领导(负载均衡器)分配工作, 组员(应用服务器)执行工作

其中负载均衡器的承担能力要远远大于应用服务器

你可以将其理解为领导负责分配工作, 而不是执行工作. 分配工作要比执行工作轻松

如果出现请求量过多, 从而导致负载均衡器宕机, 怎么办?

引入更多的负载均衡器

引入更多的数据库服务节点


当应用服务器过多时, 确实能够处理更高的请求量, 但是随之数据库服务器要承担的请求量也就更多了

针对上述情况, 解决办法是引入更多的数据库服务器

在实际应用场景中, 向数据库中读取数据的频率 > 向数据库中写入数据

主服务器一般是一个, 从服务器有多个(一主多从)

主(Master) / 从(Slave)

通常向主数据库中写入数据, 向从数据库中读取数据

主从数据库之间会进行周期性的数据同步

缓存


数据库的响应速度较慢(从硬盘中读取数据)

于是有了 “冷热” 数据的区别

将热点数据放入至缓存中, 缓存的响应速度 > 数据库的响应速度

根据二八原则, 20% 的数据能够支持 80% 的访问(实际场景的不同会有所差异), 即缓存中的热点数据能够支持绝大多数的访问场景

从数据库依旧存储全部数据

(读取数据时先去访问缓存, 如果缓存中不存在, 再去访问从数据库 → 提升了响应速度)

Redis 在分布式系统中通常作为缓存

分库分表


分布式系统的引入, 不仅要求能够处理更高的请求量, 还要求能应对更大的数据量

虽然一台服务器存储的数据可以达到几十个 TB, 但即便如此也可能会出现存不下的情况

当一台服务器存不下时, 就需要多台服务器进行存储, 即针对数据库进行拆分(分库)

分库, 将一台数据库服务器上的多个数据库拆分. 变成多台数据库服务器存储一个或一部分数据库

如果数据库中的某个表特别大, 一台主机存不下, 也可以针对数据表进行拆分(分表)

微服务


一个应用服务器程序可能包含很多的业务, 从而导致服务器的代码变的越来越复杂

为了便于代码的维护, 就将这样的复杂服务器拆分成更多的, 功能更单一, 但是更小的服务器(微服务)

微服务 → 增加了服务器的种类和数量

微服务的本质是解决 “人” 的问题🍂

当应用服务器变的复杂, 就需要更多的人来进行维护. 当人变的多了, 就需要增加配套的管理, 将这些人组织好

按照功能拆分成多组微服务, 有利于人员的组织结构划分

引入微服务的代价🍂

  1. 系统的性能下降
    拆分出更多的服务, 多个功能之间依靠网络进行通信, 网络通信的速度较慢
    (想要保证性能下降不至于太多, 解决办法是引入更多的硬件资源)
  2. 系统的复杂程度增加了, 可用性受到影响
    服务器更多, 也就意味着出现问题的概率更大

引入微服务的优势🍂

  1. 解决了 “人” 的问题
  2. 使用微服务的方式, 更方便功能的复用
  3. 可以针对不同的服务进行不同的部署
    (针对访问量, 功能配置不同的硬件资源)

🔎常见概念


应用(Application) / 系统(System)


一个应用 / 系统, 就是一个 / 一组服务器程序

模块(Module) / 组件(Component)


一个应用中有很多的功能, 每个独立的功能就是一个模块 / 组件

分布式(Distributed)


引入多台主机 / 服务器, 协同配合完成一系列的工作(物理上的多台主机)

集群(Cluster)


引入多台主机 / 服务器, 协同配合完成一系列的工作(逻辑上的多台主机)

主(Master) / 从(Slave)


分布式系统中的一种典型结构

多台服务器节点, 其中一个是主, 另外的是从. 从节点的数据依据主节点的数据进行同步

中间件(Middleware)


功能更通用的服务, 包括:

  1. 数据库
  2. 缓存
  3. 消息队列

可用性(Availability)


系统整体的可用时间 / 总时间

例如整体可用时间为 360 天, 总时间为 365 天

则可用性为 360 / 365

响应时长(Response Time RT)


衡量服务器的性能指标

响应时长: 处理请求到完成响应的时间

吞吐(Throughput) / 并发(Concurrent)


衡量系统处理请求的能力. 衡量性能的一种方式

🌸🌸🌸完结撒花🌸🌸🌸

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
|
8天前
|
NoSQL Redis
Redis分布式锁如何实现 ?
Redis分布式锁通过SETNX指令实现,确保仅在键不存在时设置值。此机制用于控制多个线程对共享资源的访问,避免并发冲突。然而,实际应用中需解决死锁、锁超时、归一化、可重入及阻塞等问题,以确保系统的稳定性和可靠性。解决方案包括设置锁超时、引入Watch Dog机制、使用ThreadLocal绑定加解锁操作、实现计数器支持可重入锁以及采用自旋锁思想处理阻塞请求。
41 16
|
1月前
|
缓存 NoSQL Java
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
59 3
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
|
1月前
|
NoSQL Redis 数据库
计数器 分布式锁 redis实现
【10月更文挑战第5天】
47 1
|
1月前
|
NoSQL 算法 关系型数据库
Redis分布式锁
【10月更文挑战第1天】分布式锁用于在多进程环境中保护共享资源,防止并发冲突。通常借助外部系统如Redis或Zookeeper实现。通过`SETNX`命令加锁,并设置过期时间防止死锁。为避免误删他人锁,加锁时附带唯一标识,解锁前验证。面对锁提前过期的问题,可使用守护线程自动续期。在Redis集群中,需考虑主从同步延迟导致的锁丢失问题,Redlock算法可提高锁的可靠性。
74 4
|
1月前
|
存储 缓存 NoSQL
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
61 4
|
1月前
|
缓存 NoSQL Ubuntu
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
55 3
|
1月前
|
存储 NoSQL 关系型数据库
【redis】认识redis和分布式系统
【redis】认识redis和分布式系统
29 1
|
1月前
|
缓存 NoSQL 算法
面试题:Redis如何实现分布式锁!
面试题:Redis如何实现分布式锁!
|
2月前
|
NoSQL 安全 关系型数据库
20)用 Redis 实现分布式锁
20)用 Redis 实现分布式锁
34 0