引言
一主多从可以做到读写分离,但是如果主库宕机, 服务也就终止了,那么如何解决呢,redis 提供了哨兵模式。
哨兵模式
在 redis 根目录新建 masterSlaveConfig 目录, 如下所示
在6381、6382、6383、6384 文件夹各自添加 redis.windows.conf 和 sentinel.conf 配置文件,redis.windows.conf 配置可以参考一主多从
假定 6381 为主库,6382、6383、6384 为从库,sentinel 端口分别为 26381、26382、26383、26384 ,在对应文件夹分别新增 sentinel.conf 文件,添加如下配置,
# sentinel实例运行的端口
port 26381
protected-mode no
bind 127.0.0.1
# 选项指定了 Sentinel 认为Redis实例已经失效所需的毫秒数。当实例超过该时间没有返回PING,或者直接返回错误, 那么 Sentinel 将这个实例标记为主观下线(subjectively down,简称 SDOWN )
# Default is 30 seconds.
sentinel monitor mymaster 127.0.0.1 6381 2
# 选项指定了 Sentinel 认为Redis实例已经失效所需的毫秒数。当实例超过该时间没有返回PING,或者直接返回错误, 那么 Sentinel 将这个实例标记为主观下线(subjectively down,简称 SDOWN )
# Default is 30 seconds.
sentinel down-after-milliseconds mymaster 5000
# 如果在该时间(ms)内未能完成failover操作,则认为该failover失败
#
# Default is 3 minutes.
sentinel failover-timeout mymaster 180000
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码,没有的话不用设置
#sentinel auth-pass mymaster 123456
新增 redis 服务端启动文件 startRedis6381.bat 、startRedis6382.bat、 startRedis6383.bat、startRedis6384.bat
@echo off
rem 使用前需在本机配置环境变量 REDIS_HOME
echo %REDIS_HOME%
%REDIS_HOME%/redis-server.exe %REDIS_HOME%/masterSlaveConfig/6381/redis.windows.conf
@pause
新增 redis 哨兵实例启动文件 startRedisSentinel6381.bat 、startRedisSentinel6382.bat、 startRedisSentinel6383.bat、startRedisSentinel6384.bat
@echo off
rem 使用前需在本机配置环境变量 REDIS_HOME
echo %REDIS_HOME%
%REDIS_HOME%/redis-server.exe %REDIS_HOME%/masterSlaveConfig/6381/sentinel.conf --sentinel
@pause
测试
依次启动 startRedis6381.bat 、startRedis6382.bat、 startRedis6383.bat、startRedis6384.bat 、 startRedisSentinel6381.bat 、startRedisSentinel6382.bat、 startRedisSentinel6383.bat、startRedisSentinel6384.bat, 连接服务端使用info replication
查看服务器状态
@echo off
set /p host=please enter you host:
set /p port=please enter you port:
echo %REDIS_HOME%/redis-cli.exe -h %host% -p %port%
%REDIS_HOME%/redis-cli.exe -h %host% -p %port%
@pause
主库宕机 ,哨兵会重新推举一个从库来做主库
快捷启动
如果手动启动哨兵服务,那么我们需要执行八个文件,过于繁琐,所以编写脚本启动是一个不错的选择。
@echo off
echo 启动redis哨兵模式
cd /d %REDIS_HOME%/masterSlaveConfig
start "" cmd /k call startRedisSentinel6381.bat
start "" cmd /k call startRedisSentinel6382.bat
start "" cmd /k call startRedisSentinel6383.bat
start "" cmd /k call startRedisSentinel6384.bat
start "" cmd /k call startRedis6381.bat
start "" cmd /k call startRedis6382.bat
start "" cmd /k call startRedis6383.bat
start "" cmd /k call startRedis6384.bat
echo 已启动
@pause
redis相关资料: