• 上一篇: https://blog.csdn.net/LawssssCat/article/details/105131393
  • 下一篇:https://lawsssscat.blog.csdn.net/article/details/105157134

Redis 集群概述

单台 Redis 服务器可能遇到的问题

  • 单个 Redis 服务器会发生 单点故障, 并且一台服务器需要处理所有的请求负载,压力较大 (容错性差)
  • 从容量上,单个 Redis 服务器的内存容量有限,就算一台 Redis 服务器内容容量为 256G,也不能将所有内容作为 Redis 存储内容。
    一般来说,单台Redis最大使用内容不应该超过 20G

基本描述

  • 高可用 (High Availability):通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高可用。
  • 高并发(High Concurrency):通过设计保证系统能够同时并行处理很多请求

    通常指标有:

    • 响应时间(Response Time)
    • 吞吐量(Throught)
    • 每秒查询率 QPS (Query Per Second)
    • 并发用户数

响应来说,牺牲了 一致性

提升系统的并发能力

提升系统并发能力的方式,主要有两种:垂直扩展(Scale Up)与水平扩展(Scale Out)。

# 垂直扩展(升硬件)

垂直扩展:提升单机处理能力。垂直扩展的方式只有两种

  • 增强单机硬件性能,如:
    添加 CPU 核数如 32 核,升级更好的网卡如万兆,升级根号的硬盘如SSD,扩充硬盘容量如 2T,扩充系统内存如 128G

  • 提升单机架构性能,如:
    使用 Cache 来减少 IO 次数,使用异步来增加单服务吞吐量,使用无锁数据结构来减少响应时间

如果预算不是问题,单机扩展往往最自接,快捷

但有一个致命的不足,单机性能总是有限的。

所以分布式架构设计高并发终极解决方案还是水平扩展

# 水平扩展(分压力)

水平扩展:只要增加服务器数量,就能线性扩充系统性能。

水平扩展对系统架构设计是有要求的,难点在于:如何在架构各层进行可水平扩展 的设计

Redis 主从复制

简介

一个 Redis 服务可以有多个该服务的复制品,这个 Redis 服务成为 Master

其他复制称为 Slaves

如图:我们将一个 Redis 服务器作为主库(master),其他三台作为从库(Slave),主库只负责写数据,每次有数据库更新的数据同步到它所有的从库,而从库只负责读数据。

两个好处:

  • 读写分离:提高服务器的负载能力,可根据读请求的规模自由增加或减少从库的数量
  • 可用性:数据被复制成好几份,一台机器故障,可以快速从其他机器获取数据并回复。

在 Redis 主从模式中,一台主库可以拥有多个从库 ,但是一个从库只能隶属于一个主库。

工作流程

# 建立连接阶段 slaveof(或 replicaof)


启动从服务器

设置 master 的 地址和端口,保存 master 信息

# --port 6380 指定从库服务的 端口号
# --slaveof 127.0.0.1 6379 指定主服务器/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf --port 6380 --slaveof 127.0.0.1 6379

加上 slaveof 参数启动另一个 Redis 实例作为从库,并且监听 6380 端口


登录从服务器

/usr/local/redis/bin/redis-cli -p 6380 -a root

主从变换

# 不是任何的从
slaveof no one # 指定从属的主服务器
slaveof ip地址 端口号

# 数据同步阶段 psync

数据同步阶段 master 说明

  1. 如果master 数据量大,同步阶段应该避免高峰期,避免master 阻塞,影响业务正常执行
  2. 复制缓冲区大小设定不合理,会导致数据溢出。
    如果进行全量复制时,部分复制的缓存区被被填满,会出现指令丢失情况
    这种情况下,在进行完成复制后,会进行第二次全量复制(如果部分复制的缓存区一直被填满,一直出现指令丢失,会导致slave陷入死循环状态)

    避免这种情况,需要修改主服务器配置:repl-backlog-size 1mb ,来调整复制缓存区的大小。
    改多少合理?
    计算机性能决定
    master 单机内存占用主机内存的哔哩不应过大,建议使用50%~70%的内存,留下30%~50%内存用于执行 bgsave命令和创建复制缓冲区

数据同步阶段 slave 说明

  • 为了避免 slave 进行全量复制、部分复制时,服务器响应阻塞或数据不同步,建议关闭此期间的对外服务
    slave-server-stale-data yes|no

  • 数据同步阶段,master发送给slave信息可以理解为 master 是 slave的一个客户端,主动向 slave 发送命令

  • 多个 slave 同时对 master 请求数据同步,master 发送的 RDB 文件增多,会对宽带造成巨大冲击。如果master带宽不足,数据同步需要错峰
    (后面会讲技术方面的解决方案)

  • slave 过多时,建议调整拓扑结构时,由一主多从结构变成树状结构,中间的节点即是master,也是slave。

    注意,使用树状结构时,由于层级深度,导致深度越高的 slave 与 最顶层的 master 间数据同步延迟较大,数据一致性差,应谨慎选择

问题解决

  1. PSYNC 失败:-NOMASTERLINK Can’t SYNC while not connected with my master

    127.0.0.1:6380> PSYNC
    Entering replica output mode...  (press Ctrl-C to quit)
    SYNC with master failed: -NOMASTERLINK Can't SYNC while not connected with my master
    

    这个问题,有两个可能性

    • 你的主服务器自定义了密码
      那么从服务器在连接时要指定主服务器的密码
    1. 主服务器设置成了 slave 模式(从服务器)
      登录客户端,用 slaveof no one 命令改回来

  2. master_link_status:down
    同步不成功,并且在info里面发现,master_link_status:down
    要么是上面的情况,要么是防火墙没开
    打开防火墙端口命令

    # 端口看你自己情况
    firewall-cmd --zone=public --add-port=3679/tcp --permanent
    firewall-cmd --reload
    

# 命令传播阶段

这个阶段就一句话:保证实时数据同步

  • 当 master 数据库状态被修改后,导致主从服务器数据状态不一致,此时需要让主从数据同步到一致的状态,同步的动作成为 命令传播
  • master 将接收到的 数据变更命令 发送给 slave,slave 接收 命令 后执行 命令

部分复制(的细节)

  • 命令传播阶段出现了断网现象和处理

    • 网络闪断:忽略
    • 短时间网络中断:部分复制
    • 长时间网络中断:全量复制
  • 部分复制的三个核心要输(下面一个个说)

    1. 服务器的运行 id (run id)
    2. 主服务器的复制积压缓冲区 (也就是前面简称的:复制缓冲区)
    3. 主主从服务器的复制偏移量

1. 服务器运行ID(runid)