最近公司在做后端接口防重复提交,写了些案例,其中有的就是基于Redis分布式锁来做防重复提交。今天就来在Windows环境下配置Redis主从加哨兵模式的集群。
主从复制,是指将一台Redis服务器的数据复制到其他的Redis服务器。前者成为主节点(master),后者成为从节点(slave),数据的复制是单向的,只能由主节点到从几点。
顾名思义,Redis哨兵充当了Redis主从实例的守护者,是构成Redis高可用的一个重要组成部分。其主要作用如下:
Redis sentinel本身也是分布式的,作为一个哨兵集群去运行,互相协同工作。
由于哨兵本身也是可能失效的,所以一个哨兵不能保证Redis服务的高可用,为了保证Redis服务其中一个节点故障的,其他节点仍能够继续推选新的节点来代替当前故障节点继续对外提供服务,Redis通过仲裁算法来推选新的节点来代替当前故障节点。所以哨兵至少需要三个实例来完成高可用,才是一个健壮的哨兵系统
简单介绍了一下Redis的主从和哨兵,深入了解的话可以参考其他文献,这里重点是如何搭建。
下载Windows下的Redis安装包。
Redis-6379文件夹不用修改。
Redis-6380文件夹下的redis.windows.conf文件修改为:
Redis-6381文件夹下的redis.windows.conf文件修改为:
5.增加脚本
在对应的redis文件夹下面新建:
startRedisServer.bat
脚本内容为:
@echo off
redis-server.exe redis.windows.conf
@pause
依次将6380和6381都添加上。
在redis文件夹同级的目录下在新建:
start6379.cmd、start6380.cmd、start6381.cmd
脚本内容为:
start6379.cmd:
@echo off
cd Redis-6379
startRedisServer.bat
start6380.cmd:
@echo off
cd Redis-6380
startRedisServer.bat
start6381.cmd:
@echo off
cd Redis-6381
startRedisServer.bat
6.配置哨兵
在Redis-6379、Redis-6380、Redis-6381文件下新增一个名为sentinel.conf的文件,文件内容如下:
Redis-6379:
# 当前Sentinel服务运行的端口
port 26379
# 哨兵监听的主服务器
sentinel monitor mymaster 127.0.0.1 6380 2
# 3秒内mymaster没响应,则认为mymaster宕机
sentinel down-after-milliseconds mymaster 3000
# 如果10秒后,mymaster仍没启动过来,则启动failover
sentinel failover-timeout mymaster 10000
# 执行故障转移时,最多有1个从服务器同时对新的主服务器进行同步
sentinel config-epoch mymaster 6
# Generated by CONFIG REWRITE
dir "D:\\Redis\\Redis-6379"
sentinel leader-epoch mymaster 6
sentinel known-slave mymaster 127.0.0.1 6379
sentinel known-slave mymaster 127.0.0.1 6381
sentinel known-sentinel mymaster 127.0.0.1 26381 f468033601759ada7bf82f1b9fdc3d9630b2ebdc
sentinel known-sentinel mymaster 127.0.0.1 26380 f085798e0294383bc82c1405f34e0a6dcb136fd2
sentinel current-epoch 6
Redis-6380:
# 当前Sentinel服务运行的端口
port 26380
# 哨兵监听的主服务器
sentinel monitor mymaster 127.0.0.1 6380 2
# 3秒内mymaster没响应,则认为mymaster宕机
sentinel down-after-milliseconds mymaster 3000
# 如果10秒后,mymaster仍没启动过来,则启动failover
sentinel failover-timeout mymaster 10000
# 执行故障转移时,最多有1个从服务器同时对新的主服务器进行同步
sentinel config-epoch mymaster 6
# Generated by CONFIG REWRITE
dir "D:\\Redis\\Redis-6380"
sentinel leader-epoch mymaster 6
sentinel known-slave mymaster 127.0.0.1 6381
sentinel known-slave mymaster 127.0.0.1 6379
sentinel known-sentinel mymaster 127.0.0.1 26379 e30ff23c67f78acab2b5fec403c25c5f8f072cdb
sentinel known-sentinel mymaster 127.0.0.1 26381 f468033601759ada7bf82f1b9fdc3d9630b2ebdc
sentinel current-epoch 6
Redis-6381:
# 当前Sentinel服务运行的端口
port 26381
# 哨兵监听的主服务器
sentinel monitor mymaster 127.0.0.1 6380 2
# 3秒内mymaster没响应,则认为mymaster宕机
sentinel down-after-milliseconds mymaster 3000
# 如果10秒后,mymaster仍没启动过来,则启动failover
sentinel failover-timeout mymaster 10000
# 执行故障转移时,最多有1个从服务器同时对新的主服务器进行同步
sentinel config-epoch mymaster 6
# Generated by CONFIG REWRITE
dir "D:\\Redis\\Redis-6381"
sentinel leader-epoch mymaster 6
sentinel known-slave mymaster 127.0.0.1 6379
sentinel known-slave mymaster 127.0.0.1 6381
sentinel known-sentinel mymaster 127.0.0.1 26379 e30ff23c67f78acab2b5fec403c25c5f8f072cdb
sentinel known-sentinel mymaster 127.0.0.1 26380 f085798e0294383bc82c1405f34e0a6dcb136fd2
sentinel current-epoch 6
在Redis-6379、Redis-6380、Redis-6381文件下新增Redis-Sentinel启动脚本:startRedisSentinel.bat。
内容如下:
@echo off
redis-server.exe sentinel.conf --sentinel
@pause
配置启动startRedisSentinel.bat的脚本:startrRedisSentinel26379.cmd、startrRedisSentinel26380.cmd、startrRedisSentinel26381.cmd.
内容为:
startrRedisSentinel26379.cmd:
@echo off
cd Redis-6379
startRedisSentinel.bat
at
startrRedisSentinel26380.cmd:
@echo off
cd Redis-6380
startRedisSentinel.bat
at
startrRedisSentinel26381.cmd:
@echo off
cd Redis-6381
startRedisSentinel.bat
at
4.启动测试
启动规则:先启动主节点,然后再启动从节点。
依次双击启动脚本start6379.cmd、start6380.cmd、start6381.cmd启动主从节点。
双击启动startrRedisSentinel26379.cmd、startrRedisSentinel26380.cmd、startrRedisSentinel26381.cmd。启动三个哨兵实例。
查看主从节点状态
进入Redis-6379目录下,cmd进入。
使用如下命令,进入6379的客户端
redis-cli.exe -p 6379
使用如下命令查看详情
info replication
通过详情可以看到,6379端口为slave节点,master节点为6380
进入Redis-6380目录下,cmd进入。
使用如下命令,进入6380的客户端
redis-cli.exe -p 6380
使用如下命令查看详情
info replication
通过详情可以看到,6380为master节点,有两个slave节点:6379和6381
进入Redis-6381目录下,cmd进入。
使用如下命令,进入6381的客户端
redis-cli.exe -p 6381
使用如下命令查看详情
info replication
通过详情可以看到,8381为slave节点,主节点为6380。
三个哨兵实例全部启动成功,生成了各自的id。
5.制造异常情况,验证哨兵是否起到作用。
将master节点6380异常关闭,在不手动修改的情况下,验证哨兵机制是否起到效果。
1.异常关闭6380主节点服务
2.查看6379端口和6381端口
通过详情可以看出,6379现在为master节点,其slave节点只有一个6381端口。
通过详情看出,6381为slave节点,其master节点为6379。
可以看出,在不手动修改的情况下,当主节点宕机后,哨兵会监听主动将存活的节点升为主机点,达到了预想的效果。