Redis集群详解

系列文章目录

(一)Redis(windows+Linux)安装及入门教程 - 掘金 (juejin.cn)

(二)Redis中的五大数据类型 - 掘金 (juejin.cn)

(三)Redis中的三种特殊类型 - 掘金 (juejin.cn)

(四)Redis实现乐观锁 - 掘金 (juejin.cn)

(五)SpringBoot整合Redis详细教程 - 掘金 (juejin.cn)

(六)Redis配置文件详解以及持久化和订阅发布 - 掘金 (juejin.cn)


前言

本文记录了Redis集群搭建,主从配置,哨兵模式等内容的讲解,后续还会介绍Redis的缓存问题,缓存雪崩,穿透,击穿等问题,如果觉得本文对你有帮助的话可以🌯🌮🥪点赞+收藏+关注。


一、Redis主从复制🍟

概念

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower); 数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave 以读为主。

默认情况下,每台Redis服务器都是主节点,且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

主从复制的作用主要包括 :

  1. 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

  2. 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余.

  3. 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连按主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

  4. 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础

一般来说工程项目中不会只使用一台Redis服务器:

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

电商网站上,一般都是一次上传,多次浏览,就是多读少写

二、环境配置🥓

查看主从复制信息,只需要配置从节点,不需要配置主节点

bash 复制代码
127.0.0.1:6379> info replication
# Replication
role:master #主节点
connected_slaves:0 #连接的从机数量
master_failover_state:no-failover
master_replid:e7b2db100ed8d3d998f62b9f79265a52bd9de132
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

创建从节点配置文件

shell 复制代码
[root@hecs-66133 selfconfig]# cp redis.conf redis79.conf 
[root@hecs-66133 selfconfig]# cp redis.conf redis80.conf 
[root@hecs-66133 selfconfig]# cp redis.conf redis81.conf 
[root@hecs-66133 selfconfig]# ls
redis79.conf  redis80.conf  redis81.conf  redis.conf

需要修改的地方:

  1. port
  2. pidfile
  3. logfile
  4. dbfilename

通过不同的配置文件分别启动三个redis服务

**

三、主从配置🥗

******默认情况下,每台Redis服务器都是主节点;所以配置从机即可

配置一主(6379)二从(6380,6381)

从机80

bash 复制代码
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379 #设置主机
OK
127.0.0.1:6380> info replication #查看主从复制信息
# Replication
role:slave #角色以及变为从机
master_host:127.0.0.1 #主机的信息
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_read_repl_offset:17
slave_repl_offset:17
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:19283b9c29f633c4636cc1a5a321ff50436b80c5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:17
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:18
repl_backlog_histlen:0

从机81

bash 复制代码
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6381> info replication
# Replication
role:slave #角色以及变为从机
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_read_repl_offset:409
slave_repl_offset:409
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:19283b9c29f633c4636cc1a5a321ff50436b80c5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:409
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:396
repl_backlog_histlen:14

主机79

bash 复制代码
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2 #从机连接数量
#从机相关信息
slave0:ip=127.0.0.1,port=6380,state=online,offset=423,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=423,lag=1
master_failover_state:no-failover
master_replid:19283b9c29f633c4636cc1a5a321ff50436b80c5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:423
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:4
repl_backlog_histlen:420

真实的主从配置都是在配置文件中配置的,使用命令配置只是展示的,配置文件中配置才是永久的

配置文件中配置过后,默认就为从机。

细节

  1. 主机可以写,从机不能写只能读!主机中的所有信息和数据,都会被从机保存

    主机写:

    从机读:

  2. 主机下线,从机依旧连接到主机,但是没有写操作,如果此时主机重新上线,从机依旧可以直接获取主机写的信息。

    主机下线:

    bash 复制代码
    127.0.0.1:6379> SHUTDOWN
    not connected> exit

    从机查看主从复制信息:

    bash 复制代码
    127.0.0.1:6380> info replication
    # Replication
    role:slave
    master_host:127.0.0.1
    master_port:6379
    master_link_status:down #显示主机已经下线
    master_last_io_seconds_ago:-1
    master_sync_in_progress:0
    slave_read_repl_offset:1981
    slave_repl_offset:1981
    master_link_down_since_seconds:28
    slave_priority:100
    slave_read_only:1
    replica_announced:1
    connected_slaves:0
    master_failover_state:no-failover
    master_replid:19283b9c29f633c4636cc1a5a321ff50436b80c5
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:1981
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:18
    repl_backlog_histlen:1964
    127.0.0.1:6380> get key1 #值还是可以获取
    "123"
    127.0.0.1:6380> get key2 #此时读一个还未向主机中写入的值
    (nil)

    主机重新上线,并写入一个值

    bash 复制代码
    [root@hecs-66133 bin]# redis-server selfconfig/redis79.conf
    [root@hecs-66133 bin]# redis-cli
    127.0.0.1:6379> set key2 456
    OK

    从机再次读,获取到值

    bash 复制代码
    127.0.0.1:6380> get key2
    "456"

此处还未开启哨兵模式,真正的情况是一个主机下线后,从其余的从机中再次选举一个主机

如果使用的命令行配置的主从,如果重启了,就会变回主机,只要再次指定主机,立马就会从主机中获取值

主从复制原理

Slave 启动成功连接到 master 后会发送一个sync同步命令,Master 接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,并完成一次完全同步全量复制 :而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中 增量复制:Master 继续将新的所有收集到的修改命令依次传给slave,完成同步 但是只要是重新连接master,一次完全同步( 全量复制) 将被自动执行,数据一定可以在从机中看到 !

链路模型

上一个主节点连接下一个从节点

graph LR M79-->SM80-->s81

中间的节点仍然为从节点

自举主节点

在没有哨兵模式时,一个主节点下线后,从节点可以自己选举自己为主节点

bash 复制代码
127.0.0.1:6380> SLAVEOF no one
OK
127.0.0.1:6380> info replication
# Replication
role:master #角色变换为主节点
connected_slaves:0
master_failover_state:no-failover
master_replid:798627c122eb1112b62d532e04cee6ce80c13611
master_replid2:9e35ba690be480d1feb8498c89eade0b958dc167
master_repl_offset:98353
second_repl_offset:98354
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:98339

四、哨兵模式🥫

概述

主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式

哨兵模式是通过将哨兵程序部署在一个独立的节点上,对 Redis 实例进行监控和管理。哨兵程序会周期性地向 Redis 实例发送心跳消息,确认 Redis 实例是否正常运行。如果 Redis 主服务器故障,哨兵程序会自动选举其中一台从服务器作为新的主服务器,同时通知其他哨兵和客户端更新主服务器信息,从而保持 Redis 服务的可用性。

首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

这里的哨兵有两个作用

  • 通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
  • 当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。

然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式

假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线 。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover(故障转移)操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线

测试

配置哨兵模式配置文件sentinel.conf

shell 复制代码
#sentinel monitor 被监控的名称 host  port
sentinel monitor myredis 127.0.0.1 6379 1

数字1代表当有多少个 sentinel 认为主服务器宕机时,它才算真正的宕机掉,通常数量为半数或半数以上数量设置。

启动哨兵

shell 复制代码
redis-sentinel selfconfig/sentinel.conf

如果Master节点断开,这个时候就会从从机中随机选取一个服务器出来(其中有一个投票算法)

主机下线,开始选举

主机79

bash 复制代码
127.0.0.1:6379> SHUTDOWN
not connected> 

哨兵选举

主机81

bash 复制代码
127.0.0.1:6381> info replication
# Replication
role:master #已选举为主机
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=60664,lag=1
master_failover_state:no-failover
master_replid:63d8f44e25d469bfba14af80dbc549a5f4796c8d
master_replid2:b90695a968da21dd93e1d4e378ee505b9171c26d
master_repl_offset:60664
second_repl_offset:49316
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:60664

如果主机此时回来了,只能归并到新的主机下,当做从机,这就是哨兵模式的规则!

哨兵集群的优缺点

优点:

  1. 自动化:哨兵模式能够自动监测Redis节点的健康状况,并在必要时进行自动切换,不需要人工干预。
  2. 高可用性:当主节点出现故障时,哨兵模式可以快速切换到备份节点,从而保持服务的高可用性和持久性。
  3. 可扩展性:通过增加更多的哨兵节点,可以轻松地扩展Redis集群的容量和性能。
  4. 故障转移:哨兵模式可以在主节点发生故障时自动进行故障转移,将从节点提升为主节点,避免因主节点失效而导致整个系统的崩溃。

缺点:

  1. 延迟问题:由于哨兵需要进行频繁的状态检查和转移操作,可能会对系统带来一定的延迟。
  2. 复杂性增加:引入哨兵模式后,需要对集群进行额外的配置和管理,增加了系统的复杂性。
  3. 配置繁琐:哨兵模式的配置相对繁琐,需要对多个哨兵节点进行正确的配置和管理。
  4. 在线扩容困难:Redis的哨兵模式不支持在线扩容,当集群容量达到上限时,在线扩容会变得非常困难。

哨兵模式全部配置

bash 复制代码
# Example sentinel.conf
 
# 哨兵sentinel实例运行的端口 默认26379

port 26379
 
# 哨兵sentinel的工作目录

dir /tmp
 
# 哨兵sentinel监控的redis主节点的 ip port 
# master-name  可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组成。
# quorum 当这些quorum个数sentinel哨兵认为master主节点失联 那么这时 客观上认为主节点失联了
# sentinel monitor <master-name> <ip> <redis-port> <quorum>

sentinel monitor mymaster 127.0.0.1 6379 2

# 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供密码
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码
# sentinel auth-pass <master-name> <password>

sentinel auth-pass mymaster MySUPER--secret-0123passw0rd

# 指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒
# sentinel down-after-milliseconds <master-name> <milliseconds>

sentinel down-after-milliseconds mymaster 30000

# 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,
这个数字越小,完成failover所需的时间就越长,
但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。
可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
# sentinel parallel-syncs <master-name> <numslaves>

sentinel parallel-syncs mymaster 1

# 故障转移的超时时间 failover-timeout 可以用在以下这些方面: 
#1. 同一个sentinel对同一个master两次failover之间的间隔时间。
#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
#3.当想要取消一个正在进行的failover所需要的时间。  
#4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了
# 默认三分钟
# sentinel failover-timeout <master-name> <milliseconds>

sentinel failover-timeout mymaster 180000
 
# SCRIPTS EXECUTION
#配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知相关人员。
#对于脚本的运行结果有以下规则:
#若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10
#若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。
#如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。
#一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。
 
#通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,
#这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,
#一个是事件的类型,
#一个是事件的描述。
#如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。
#通知脚本
# sentinel notification-script <master-name> <script-path>

sentinel notification-script mymaster /var/redis/notify.sh
 
# 客户端重新配置主节点参数脚本
# 当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。
# 以下参数将会在调用脚本时传给脚本:
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
# 目前<state>总是"failover",
# <role>是"leader"或者"observer"中的一个。 
# 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的
# 这个脚本应该是通用的,能被多次调用,不是针对性的。
# sentinel client-reconfig-script <master-name> <script-path>

sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

参考资料

狂神说JavaRedis最新超详细版教程通俗易懂_哔哩哔哩_bilibili

Redis哨兵模式_Tang World的博客-CSDN博客

Redis从入门到放弃(8):哨兵模式 - 知乎 (zhihu.com)

redis哨兵机制--配置文件sentinel.conf详解 - heroinss - 博客园 (cnblogs.com)

相关推荐
wdxylb1 小时前
云原生俱乐部-shell知识点归纳(1)
linux·云原生
飞雪20072 小时前
Alibaba Cloud Linux 3 在 Apple M 芯片 Mac 的 VMware Fusion 上部署的完整密码重置教程(二)
linux·macos·阿里云·vmware·虚拟机·aliyun·alibaba cloud
路溪非溪2 小时前
关于Linux内核中头文件问题相关总结
linux
Lovyk5 小时前
Linux 正则表达式
linux·运维
Fireworkitte6 小时前
Ubuntu、CentOS、AlmaLinux 9.5的 rc.local实现 开机启动
linux·ubuntu·centos
sword devil9006 小时前
ubuntu常见问题汇总
linux·ubuntu
ac.char6 小时前
在CentOS系统中查询已删除但仍占用磁盘空间的文件
linux·运维·centos
.Shu.7 小时前
Redis Reactor 模型详解【基本架构、事件循环机制、结合源码详细追踪读写请求从客户端连接到命令执行的完整流程】
数据库·redis·架构
淮北也生橘128 小时前
Linux的ALSA音频框架学习笔记
linux·笔记·学习
华强笔记11 小时前
Linux内存管理系统性总结
linux·运维·网络