Springboot 集成 Redis —— 配置 Windows 环境的主从哨兵模式

在《Springboot 集成 Redis —— 单机形式》一文中介绍了最简单的 Redis 的使用方式,但是,这种使用 Redis 的模式,很难在日常的开发中简单,实际意义小于测试意义.。Redis 有持久化功能,这可以使 Redis 在服务器重启的情况下也不会丢失(或少量丢失)数据,持久化会把内存中数据保存到硬盘上,重启会从硬盘上加载数据。但是由于数据是存储在一台服务器上的,如果这台服务器出现硬盘故障等问题,也会导致数据丢失。

Redis 还提供主从模式、哨兵模式和 Cluster 集群

为了避免前述的单点故障,通常会将数据库复制多个副本部署在不同的服务器上,这样即使有一台服务器出现故障,其他服务器依然可以继续提供服务。主从模式下,数据库分为两类,一类是主数据库(master),另一类是从数据库(slave)。主数据库可以进行读写操作,当写操作导致数据变化时会自动将数据同步给从数据库。而从数据库一般是只读的,并接受主数据库同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。

在主从模式下,当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,会造成一段时间内的服务不可用。哨兵模式可以很好的避免这种问题,Redis 提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待 Redis 服务器响应,从而监控运行的多个 Redis 实例。当哨兵监测到主服务器宕机时,会自动将从服务器切换成主服务器,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主服务器。然而一个哨兵进程对 Redis 服务器进行监控,也可能会出现问题,所以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。

配置 Redis 的主从模式

在《Windows 搭建 Redis 环境》中讲到了启动 Redis 服务依赖的配置,在主从模式下,需要为主服务和从服务分别配置
在这里插入图片描述
如上图所示主服务使用的 redis6379.conf,从服务分别使用 redis6380.confredis6381.conf
redis6379.conf 是复制 redis.windows.conf 的,没有改动,主要修改从服务的配置

redis6380.conf 修改如下的参数

    bind 127.0.0.1
    port 6380
    slaveof 127.0.0.1 6379  #设置该从服务的主服务器的 ip 和端口

redis6381.conf 修改如下的参数

    bind 127.0.0.1
    port 6381
    slaveof 127.0.0.1 6379  #设置该从服务的主服务器的 ip 和端口

服务配置好后,启动所有的主从服务即可,为了启动简单,写了一个启动脚本
在这里插入图片描述在这里插入图片描述
截图部分命令如下

start redis-server.exe redis6379.conf
start redis-server.exe redis6380.conf
start redis-server.exe redis6381.conf

直接运行 start.bat 脚本
在这里插入图片描述
在这里插入图片描述
红色标记的是主服务,黄色标记的是从服务,同时也表示主从模式正常启动。

配置哨兵模式

前面也讲到了,哨兵模式是依赖主从模式的表现,在现有主从模式的基础上配置哨兵,为了使结构清晰增加了 sentinel 文件夹,哨兵的配置文件都放在这个路径之下
在这里插入图片描述
增加多个哨兵的配置
在这里插入图片描述
sentinel26379.conf 配置内容如下

# 当前 Sentinel 服务运行的端口
port 26379
# 去监视一个名为 redisMaster 的主 Redis 实例,这个主实例的 IP 地址为本机地址 127.0.0.1,端口号为 6379,
# 而将这个主实例判断为失效至少需要 2 个 Sentinel 进程的同意,只要同意 Sentinel 的数量不达标,自动 failover 就不会执行
# 指定了 Sentinel 认为 Redis 实例已经失效所需的毫秒数。当实例超过该时间没有返回 PING,或者直接返回错误,那么 Sentinel 将这个实例标记为主观下线。
# 只有一个 Sentinel 进程将实例标记为主观下线并不一定会引起实例的自动故障迁移:只有在足够数量的 Sentinel 都将一个实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行
sentinel monitor redisMaster 127.0.0.1 6379 2
# 指定了在执行故障转移时,最多可以有多少个从 Redis 实例在同步新的主实例,在从 Redis 实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长
sentinel down-after-milliseconds redisMaster 5000
# 如果在该时间(ms)内未能完成 failover 操作,则认为该 failover 失败
sentinel failover-timeout redisMaster 15000

sentinel26381.conf 配置内容如下

port 26381
sentinel monitor redisMaster 127.0.0.1 6379 2
sentinel down-after-milliseconds redisMaster 5000
sentinel failover-timeout redisMaster 15000

sentinel26380.conf 配置内容如下

port 26380
sentinel monitor redisMaster 127.0.0.1 6379 2
sentinel down-after-milliseconds redisMaster 5000
sentinel failover-timeout redisMaster 15000

同样为了启动简单,使用启动脚本,将之前的脚本修改一下
在这里插入图片描述
增加的内容如下

start redis-server.exe sentinel/sentinel26379.conf --sentinel
start redis-server.exe sentinel/sentinel26380.conf --sentinel
start redis-server.exe sentinel/sentinel26381.conf --sentinel

使用完整的启动脚本,运行 start.bat 启动 Redis 服务
在这里插入图片描述
如上图所示,表示 Redis 的主从哨兵模式的已经启动成功,当前的主服务 IP 是 127.0.0.1 端口是 6379。

验证主从哨兵模式下主服务的自动切换

为了验证主服务的自动切换,需要关闭原来的主服务,可以使用 netstat -aon|findstr (端口号) 查看对应端口号的进程 ID(Pid)
在这里插入图片描述
可以发现本次启动起来的主服务进程 ID(Pid)是 61804,使用命令 taskkill -F /pid (进程 ID) 手动杀死 Pid 是 61804 的服务进程
在这里插入图片描述
原来主服务已经被杀死,会有一个从服务提升为主服务,其他从服务重新从属新的主服务,使用《Windows 搭建 Redis 环境》介绍的 Another.Redis.Desktop.Manager 客户端查看当前的主服务,发现主服务的端口已经是 6381 了,不是之前的 6379
在这里插入图片描述
再看看 6381 端口对应服务的角色,发现已经变成了 master
在这里插入图片描述

发布了24 篇原创文章 · 获赞 23 · 访问量 7376

猜你喜欢

转载自blog.csdn.net/qq_19154605/article/details/104042382