当前位置: 首页 > article >正文

Redis 安装部署[主从、哨兵、集群](windows版)

说明:该方式建议仅用于自己研究,不建议用于生产

linux 版本见:Redis 安装部署[主从、哨兵、集群](linux版)


一、Redis 下载安装

下载

  • 下载地址:https://github.com/zkteco-home/redis-windows/releases?page=1
  • 选择版本:redis-windows-7.4.0
  • 安装包名称:redis-windows-7.4.0.zip
  • 说明:以下内容基于redis-windows-7.4.0版本,且均已验证通过。特别注意,redis-windows-6.2.6.4版本存在问题,集群场景的搭建没有验证通过。

安装

  • 目录:创建目录 D:\software\redis
  • 解压:将 redis-windows-7.4.0.zip 解压到目录 D:\software\redis\
  • 安装:
    • 添加环境变量:REDIS_HOME=D:\software\redis\redis-windows-7.4.0
    • 添加到path中: 将 %REDIS_HOME% 添加到path环境变量中

二、Redis 主从复制 搭建

  • 主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。

  • 主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。

  • 缺陷:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制。

  • 以下方案模拟所有节点在同一台服务器上,以端口号进行区分:

  • 1个主节点端口号:6379

  • 2个从节点端口号:6380/6381

1、创建配置目录

# 创建配置目录(下面的脚本都放到该目录,具体目录可自定义)
mkdir D:\software\redis\redis-master-slave

cd D:\software\redis\redis-master-slave

2、创建模板配置文件 redis.conf.template

  • 模板配置文件中的占位符:
    • custom_port 自定义端口占位符
    • master_pwd 主节点密码
    • replicaof_master_ip_port 从节点同步主节点占位符
  • 作为模板,用于快速生成集群模式下节点的配置文件: redis-port.conf
  • 说明:
    • 若有参数需调整,可先修改该模板配置文件的内容,再执行后面的脚本。
    • 重点注意 requirepass 和 maxmemory的配置。
# 修改监听地址
bind 0.0.0.0

# 关闭保护模式,默认yes,让redis支持远程连接
protected-mode no

# redis监听端口,默认6379
port custom_port

# 开启守护进程,以独立进程启动,默认no
daemonize yes

# 设置pidfile,默认redis.pid
pidfile redis_custom_port.pid

# 日志文件,默认redis.log
logfile "redis_custom_port.log"

# 禁用save命令,同步执行有性能问题,推荐使用bgsave
save ""

# 设置快照文件名称,默认dump.rdb
dbfilename dump_custom_port.rdb

# 设置数据目录,默认./
dir ./

# 连接主节点的密码,配置在从节点,默认12345
masterauth 'master_pwd'

# 连接Redis服务的redis密码,配置在主节点,默认''
requirepass 'master_pwd' 

# 设置最大内存,单位kb/mb/gb
maxmemory 256mb

# 设置内存淘汰策略,默认noeviction不淘汰数据
# volatile-lru 按照LRU算法逐出原有数据,但仅逐出设置了过期时间的数据
maxmemory-policy volatile-lru

# 开启AOF持久化,默认no
appendonly yes

# AOF持久化文件名称,默认appendonly.aof
appendfilename "appendonly_custom_port.aof"


# 从节点配置 -----------------------------
# 指定要同步的Master节点IP和端口
# replicaof 127.0.0.1 6379
#replicaof_master_ip_port

3、创建生成配置脚本 redis-conf-create.bat

  • 批量复制配置文件并替换占位符的脚本:redis-conf-create.bat
  • 一键批量生成redis集群配置文件,无需手动修改配置文件中的内容,简化操作
rem --------------------------------------------------------------
rem 第一步:基于redis模板配置文件,一键批量生成redis主从节点配置文件
rem --------------------------------------------------------------

@echo off

rem 设置窗口标题
title redis-conf-create

rem 让for循环中的本地变量生效
setlocal enabledelayedexpansion

rem master ip和port
set master_ip=127.0.0.1
set master_port=6379
set master_pwd=123456

rem 从节点端口列表
set slave_ports=6380 6381


rem redis模板配置文件
set redis_conf_tempalte=redis.conf.template

rem redis模板配置文件中的占位符
set old_char=custom_port
set old_master_pwd=master_pwd


rem 针对从节点配置,做特殊处理
set old_replicaof=#replicaof_master_ip_port
set new_replicaof=replicaof %master_ip% %master_port%


rem 第一步:主节点配置文件生成
echo 生成master节点配置文件============
set master_dest_filename=%master_port%\redis-%master_port%.conf
if not exist %master_port% (
    mkdir %master_port%
    echo Folder created successfully: %master_port%
)

if exist "%master_dest_filename%" (
    echo 配置文件已存在 %master_dest_filename%
)
if not exist "%master_dest_filename%" (
    echo 复制配置文件 %master_dest_filename%
    echo -f | xcopy "%redis_conf_tempalte%" "%master_dest_filename%" /I

    rem 替换redis配置文件中的占位符
    echo 替换配置文件中的占位符 %master_dest_filename%
    powershell -Command "(Get-Content '%master_dest_filename%') -replace '%old_char%', '%master_port%' | Set-Content '%master_dest_filename%'"
    powershell -Command "(Get-Content '%master_dest_filename%') -replace '%old_master_pwd%', '%master_pwd%' | Set-Content '%master_dest_filename%'"
)
echo 生成master节点配置文件============
echo.


rem 第二步:从节点配置文件生成
echo 生成slave节点配置文件============
for %%i in (%slave_ports%) do (
    set new_char=%%i
    set dest_filename=!new_char!\redis-!new_char!.conf
    
    if not exist !new_char! (
        mkdir !new_char!
        echo Folder created successfully: !new_char!
    )

    if exist "!dest_filename!" (
        echo 配置文件已存在 !dest_filename!
    )
    if not exist "!dest_filename!" (
        echo 复制配置文件 !dest_filename!
        echo -f | xcopy "%redis_conf_tempalte%" "!dest_filename!" /I

        rem 替换redis配置文件中的占位符
        echo 替换配置文件中的占位符 !dest_filename!
        powershell -Command "(Get-Content '!dest_filename!') -replace '%old_char%', '!new_char!' | Set-Content '!dest_filename!'"
        powershell -Command "(Get-Content '!dest_filename!') -replace '%old_master_pwd%', '%master_pwd%' | Set-Content '!dest_filename!'"
        powershell -Command "(Get-Content '!dest_filename!') -replace '%old_replicaof%', '!new_replicaof!' | Set-Content '!dest_filename!'"
    )
    echo.
)
echo 生成slave节点配置文件============

endlocal
pause>nul

4、创建启动节点脚本 redis-node-start.bat

执行如下脚本前,请先设置redis环境变量,以便下面的命令可正常执行。

rem --------------------------------------------------------------
rem 第二步:批量启动redis所有节点
rem --------------------------------------------------------------

@echo off

rem 设置窗口标题
title redis-node-start

rem 让for循环中的本地变量生效
setlocal enabledelayedexpansion

set curr_path=%CD%

rem 主节点端口
set master_port=6379

rem 从节点端口列表
set slave_ports=6380 6381


rem 第一步:启动master节点
echo redis-%master_port% start

cd %curr_path%\%master_port%
start "redis-%master_port%" redis-server redis-%master_port%.conf

echo redis-%master_port% end
echo.


rem 第二步:启动slave节点
for %%i in (%slave_ports%) do (
    set new_char=%%i
    echo redis-!new_char! start

    cd %curr_path%\!new_char!
    rem 异步执行
    start "redis-!new_char!" redis-server redis-!new_char!.conf
    
    echo redis-!new_char! end
    echo.
)

pause>nul

5、执行控制脚本

  • 按顺序执行如下命令,搭建Redis 主从
# 1、批量生成redis配置文件
redis-conf-create.bat

# 2、批量启动redis节点
redis-node-start.bat

6、测试命令

# 查看主从复制信息
redis-cli -h 127.0.0.1 -p 6379 -a 123456 info replication

# 验证主从复制

# 登录主节点
redis-cli -h 127.0.0.1 -p 6379 -a 123456

keys *

set name 123

get name


# 登录从节点
redis-cli -h 127.0.0.1 -p 6380 -a 123456

keys *


三、Redis Sentinel 搭建

注意: 新版本redis自带哨兵,不需要单独安装

  • 在上面主从复制模式的基础上,新增sentinel哨兵的能力。
  • Redis Sentinel是Redis官方提供的高可用性解决方案,主要用于监控和管理Redis服务器,确保在主服务器发生故障时能够自动进行故障转移,从而保证服务的连续性和高可用性。

1、创建配置目录

# 创建配置目录(下面的脚本都放到该目录,具体目录可自定义)
mkdir /home/middleware/redis/redis-sentinel

cd /home/middleware/redis/redis-sentinel


2、创建模板配置文件 sentinel.conf.template

  • 模板配置文件中的占位符:
    • custom_port 自定义端口占位符
# 关闭保护模式,让redis支持远程连接
protected-mode no

# 端口,默认26379
port custom_port

# 指定sentinel为后台启动
daemonize yes

# 设置pidfile,默认redis-sentinel.pid
pidfile sentinel_custom_port.pid

# 日志存放路径
logfile "sentinel_custom_port.log"

# 指定数据存放路径
dir ./

# 配置监听主服务器
# mymaster:自定义redis主节点名称,在一个sentinel网络中,一个redis主节点只能有一个名称
# 172.19.223.161:表示主节点ip
# 6379:表示主节点port
# 2:表示至少需要2个哨兵认为主节点不可⽤时,才会进⾏failover操作
sentinel monitor mymaster master_ip master_port 2

# 配置服务密码
# mymaster:redis主节点名称(与上一致);
# 123456:redis主节点和从节点的密码
sentinel auth-pass mymaster master_pwd

# 判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel down-after-milliseconds mymaster 30000

# 故障转移的最大超时时间为180000(180秒)
sentinel failover-timeout mymaster 180000


3、创建生成配置脚本 redis-sentinel-conf-create.bat

rem --------------------------------------------------------------
rem  第一步:生成sentinel配置文件
rem  注意:每个sentinel节点所在机器都需要执行一次
rem --------------------------------------------------------------

@echo off

rem 设置窗口标题
title redis-sentinel-conf-create

rem 让for循环中的本地变量生效
setlocal enabledelayedexpansion

rem master ip和port
set master_ip=127.0.0.1
set master_port=6379
set master_pwd=123456

rem 一台机器上启动的sentinel的端口列表
set sentinel_ports=26379 26380 26381


rem 模板配置文件
set sentinel_conf_tempalte=sentinel.conf.template

rem 模板配置文件中的占位符
set old_char=custom_port

rem 主节点占位符
set old_master_ip="master_ip"
set old_master_port="master_port"
set old_master_pwd="master_pwd"


for %%i in (%sentinel_ports%) do (
    set new_char=%%i
    set dest_filename=!new_char!\sentinel-!new_char!.conf
    
    if not exist !new_char! (
        mkdir !new_char!
        echo Folder created successfully: !new_char!
    )

    if exist "!dest_filename!" (
        echo 配置文件已存在 !dest_filename!
    )
    if not exist "!dest_filename!" (
        echo 复制配置文件 !dest_filename!
        echo -f | xcopy "%sentinel_conf_tempalte%" "!dest_filename!" /I

        rem 替换redis配置文件中的占位符
        echo 替换配置文件中的占位符 !dest_filename!
        powershell -Command "(Get-Content '!dest_filename!') -replace '%old_char%', '!new_char!' | Set-Content '!dest_filename!'"
        powershell -Command "(Get-Content '!dest_filename!') -replace '%old_master_ip%', '%master_ip%' | Set-Content '!dest_filename!'"
        powershell -Command "(Get-Content '!dest_filename!') -replace '%old_master_port%', '%master_port%' | Set-Content '!dest_filename!'"
        powershell -Command "(Get-Content '!dest_filename!') -replace '%old_master_pwd%', '%master_pwd%' | Set-Content '!dest_filename!'"
    )
    echo.
)


endlocal
pause>nul

3、创建启动节点脚本 redis-sentinel-node-start.bat

rem --------------------------------------------------------------
rem 第二步:启动sentinel节点
rem 注意:每个sentinel节点所在机器都需要执行一次
rem --------------------------------------------------------------

@echo off

rem 设置窗口标题
title redis-sentinel-node-start

rem 让for循环中的本地变量生效
setlocal enabledelayedexpansion

set curr_path=%CD%

rem 一台机器上启动的sentinel的端口列表
set sentinel_ports=26379 26380 26381


rem 启动sentinel节点
for %%i in (%sentinel_ports%) do (
    set new_char=%%i
    echo sentinel-!new_char! start

    cd %curr_path%\!new_char!
    rem 异步执行
    start "sentinel-!new_char!" redis-server sentinel-!new_char!.conf --sentinel
    
    echo sentinel-!new_char! end
    echo.
)

pause>nul

4、执行控制脚本

# 1、生成sentinel配置文件
redis-sentinel-conf-create.bat

# 2、启动sentinel节点
redis-sentinel-node-start.bat


5、测试命令

# 第一步:查看:sentinel 信息(主节点为6379)
C:\Users\xxx>redis-cli -h 127.0.0.1 -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_tilt_since_seconds:-1
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3

# 第二步:模拟:杀掉主节点 6379(手动关闭窗口)



# 第三步:查看:sentinel 信息(主节点为6380,说明已自动切换主节点)
C:\Users\xxx>redis-cli -h 127.0.0.1 -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_tilt_since_seconds:-1
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6380,slaves=2,sentinels=3


# 第四步:查看主从复制信息(6380变为主节点,且只有一个6381的从节点)
C:\Users\xxx>redis-cli -h 127.0.0.1 -p 6380 -a 123456 info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=40503,lag=0
master_failover_state:no-failover
master_replid:7b8267077d407b42af2c8babf1f922fd82f4da8c
master_replid2:7bc6481a52f106bf6bba1b7988871cd54fded59d
master_repl_offset:40503
second_repl_offset:24157
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:40489


四、Redis Cluster 搭建

  • Redis Cluster模式解决了写操作无法负载均衡,以及单机存储限制的问题,实现了较为完善的高可用方案。

  • Redis Cluster模式中集群节点最小配置6个节点(3主3从),其中主节点提供读写操作,从节点作为备用节点,不提供请求,只作为故障转移使用。

  • 以下方案模拟所有节点在同一台服务器上,以端口号进行区分:

  • 3个主节点端口号:6001/6002/6003

  • 3个从节点端口号:6004/6005/6006


1、创建配置目录

# 创建集群配置目录(下面的脚本都放到该目录,具体目录可自定义)
mkdir D:\software\redis\redis-cluster

cd D:\software\redis\redis-cluster

2、创建模板配置文件 redis.cluster.conf.template

  • 模板配置文件中的占位符:custom_port
  • 作为模板,用于快速生成集群模式下节点的配置文件: redis-port.conf
  • 说明:
    • 若有参数需调整,可先修改该模板配置文件的内容,再执行后面的脚本。
    • 重点注意 requirepass 和 maxmemory的配置。
# 注释掉 bind 项,默认监听所有网卡
# bind 127.0.0.1
bind 0.0.0.0

# 关闭保护模式,默认yes,让redis支持远程连接
protected-mode no

# redis监听端口,默认6379
port custom_port

# 开启守护进程,以独立进程启动,默认no
daemonize yes

# 设置pidfile,默认redis.pid
pidfile redis_custom_port.pid

# 日志文件,默认redis.log
logfile "redis_custom_port.log"

# 禁用save命令,同步执行有性能问题,推荐使用bgsave
save ""

# 默认yes【设置为no解决window11启动报错EXCEPTION_ACCESS_VIOLATION的问题】
stop-writes-on-bgsave-error no

# 设置快照文件名称,默认dump.rdb
dbfilename dump_custom_port.rdb

# 设置数据目录,默认./
dir ./

# 从节点重新规划周期,默认10
repl-ping-slave-period 10

# 连接主节点的密码,配置在从节点,默认12345
masterauth '123456'

# 连接Redis服务的redis密码,配置在主节点,默认''
# 集群版建议将各个节点的masterauth和requirepass设置为相同的密码,因为从节点也可能升级为主节点
requirepass '123456'

# 设置最大内存,单位kb/mb/gb
maxmemory 256mb

# 设置内存淘汰策略,默认noeviction不淘汰数据
# volatile-lru 按照LRU算法逐出原有数据,但仅逐出设置了过期时间的数据
maxmemory-policy allkeys-lru

# 开启AOF持久化,默认no
appendonly yes

# AOF持久化文件名称,默认appendonly.aof
appendfilename "appendonly_custom_port.aof"

# 开启群集功能,默认no
cluster-enabled yes

# 群集节点名称文件设置,默认nodes-6379.conf
cluster-config-file nodes_custom_port.conf

# 设置群集节点超时时间,默认15000
# 集群中每个节点都会定期向其他节点发送ping消息,接收节点回复pong消息作为响应。
# 如果在cluster-node-timeout时间内通信一直失败,则发送节点会认为接收节点存在故障,把接收节点标记为主观下线(pfail)状态。默认15000,即15s。
cluster-node-timeout 15000

# 从节点有效因子,提高集群故障转移能力,默认10
# 每个从节点都要检查最后与主节点断线时间,判断其是否有资格替换故障的主节点。
# 如果从节点与主节点断线时间超过 (cluster-node-timeout * cluster-slave-validity-factor) + repl-ping-slave-period,则当前从节点不具备故障转移资格。
# 例如,如果节点超时时间为30秒,从节点有效因子为10,从节点重新规划周期为10秒,如果从节点与主节点断线时间超过310秒,则当前从节点不会尝试故障转移。
cluster-slave-validity-factor 10

# 迁移屏障,提高集群抵抗故障的能力,默认1
# 迁移屏障为1,表示只有当主节点至少保留一个从节点时,从节点才会迁移
# 要禁用迁移,只需将其设置为一个非常大的值。
cluster-migration-barrier 1

# 设置集群可用性,默认为yes
# yes 表示所有slot都正常工作,才能对外提供服务
# no  表示部分slot出现问题,其他正常的slot仍然可以继续提供服务
cluster-require-full-coverage yes


3、创建生成配置脚本 redis-cluster-conf-create.bat

  • 批量复制配置文件并替换占位符的脚本:redis-cluster-conf-create.bat
  • 一键批量生成redis集群配置文件,无需手动修改配置文件中的内容,简化操作
rem --------------------------------------------------------------
rem 第一步:基于redis模板配置文件,一键批量生成redis集群中的节点配置文件
rem 作用:无需手动修改redis配置文件中的内容,可简化操作
rem --------------------------------------------------------------

@echo off

rem 设置窗口标题
title redis-cluster-conf-create

rem 让for循环中的本地变量生效
setlocal enabledelayedexpansion


rem redis模板配置文件
set redis_conf_tempalte=redis.cluster.conf.template
rem redis模板配置文件中的占位符
set old_char=custom_port


rem 遍历1到6,集群节点数
rem 当扩容时,可以增加该遍历值,即可快速生成新节点的redis配置文件
for /L %%i in (1,1,6) do (
    set new_char=600%%i
    set dest_filename=!new_char!\redis-!new_char!.conf
    
    if not exist !new_char! (
        mkdir !new_char!
        echo Folder created successfully: !new_char!
    )

    if exist "!dest_filename!" (
        echo 配置文件已存在 !dest_filename!
    )
    if not exist "!dest_filename!" (
        rem 复制redis配置文件到指定目录(不覆盖)
        echo 复制配置文件 !dest_filename!
        echo -f | xcopy "%redis_conf_tempalte%" "!dest_filename!" /I

        rem 替换redis配置文件中的占位符
        rem 使用PowerShell替换文件中的字符串
        echo 替换配置文件中的占位符 !dest_filename!
        powershell -Command "(Get-Content '!dest_filename!') -replace '%old_char%', '!new_char!' | Set-Content '!dest_filename!'"
    )
    echo.
)

endlocal
pause>nul

复制后的配置文件列表如下:

redis-6001.conf
redis-6002.conf
redis-6003.conf
redis-6004.conf
redis-6005.conf
redis-6006.conf

4、创建启动节点脚本 redis-cluster-node-start.bat

执行如下脚本前,请先设置redis环境变量,以便下面的命令可正常执行。

rem --------------------------------------------------------------
rem 第二步:批量启动redis集群的所有节点
rem --------------------------------------------------------------

@echo off

rem 设置窗口标题
title redis-cluster-node-start

rem 让for循环中的本地变量生效
setlocal enabledelayedexpansion

set curr_path=%CD%

rem 遍历1到6,启动集群节点
for /L %%i in (1,1,6) do (
    set new_char=600%%i
    echo redis-!new_char! start
    echo %curr_path%\!new_char!

    cd %curr_path%\!new_char!
    rem 异步执行
    start "redis-!new_char!" redis-server redis-!new_char!.conf
    
    echo redis-!new_char! end
    echo.
)

pause>nul

5、创建集群脚本 redis-cluster-create.bat

rem --------------------------------------------------------------
rem 第三步:创建redis集群
rem --------------------------------------------------------------

rem 设置窗口标题
title redis-cluster-create

rem 启动集群
rem  --cluster create创建集群
rem  --replicas 1 表示每个主节点有1个从节点,这里随机分配主从关系。如果需要定制,则可以不加该参数,使用add-node来定制。
rem 密码 -a 123456
echo yes | redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1 -a 123456


pause

检查端口占用:netstat -ano | findstr 6379


6、执行控制脚本

  • 按顺序执行脚本搭建集群
# 1、批量生成redis配置文件
redis-cluster-conf-create.bat

# 2、批量启动redis集群节点
redis-cluster-node-start.bat

# 3、创建redis集群
redis-cluster-create.bat


7、测试命令

  • 输入如下命令,进行测试
# 测试集群

# -c 表示-c(cluster),连接集群时使用,可防止moved和ask异常
# -a 表示-a(auth),redis密码,无需手动auth命令
redis-cli -h 127.0.0.1 -p 6001 -c -a 123456

# 查看节点的哈希槽编号范围
cluster slots

# 设置name键的值
set name abcd
-> Redirected to slot [5798] located at 127.0.0.1:6002【说明:重定向到了6002】

# 查看name键的槽编号(6002)
cluster keyslot name

# 查看节点6002上name建是否存在(存在)
redis-cli -h 127.0.0.1 -p 6002 -c -a 123456
keys *

# 查看节点6003上name建是否存在(不存在)
redis-cli -h 127.0.0.1 -p 6003 -c -a 123456
keys *

# 在节点6003上获取name键的值
get name
-> Redirected to slot [5798] located at 127.0.0.1:6002【说明:重定向到了6002】
"abcd"


# 手动关闭节点
redis-cli -h 127.0.0.1 -p 6001 -a 123456 shutdown

# 查看redis节点信息
redis-cli -h 127.0.0.1 -p 6001 -a 123456 info

# 每1秒打印一次info的过滤信息
# -r 表示将命令循环多少次
# -i 表示每隔几秒执行一次命令
redis-cli -h 127.0.0.1 -p 6001 -a 123456 -r 10 -i 1 info | grep used_memory_human

8、集群操作

  • 集群操作的内容,见:Redis 安装部署[主从、哨兵、集群](linux版)

五、常见错误

问题1:win11 锁屏一段时间后,发现redis集群连接不上

  • redis版本:redis-windows-6.2.6.4
  • 执行命令:redis-cli --cluster info 127.0.0.1:6001 -a 123456
  • 错误信息:[ERR] Node 127.0.0.1:6001 is not configured as a cluster node.
  • 日志文件:redis-6001.log 中的内容如下:
[22196] 14 Dec 16:59:47.610 # IP address for this node updated to 127.0.0.1
[22196] 14 Dec 16:59:52.560 # Cluster state changed: ok
[22196] 14 Dec 17:27:22.757 # New configEpoch set to 8
[22196] 14 Dec 17:27:22.757 # configEpoch updated after importing slot 0
[22196] 16 Dec 09:44:30.844 # Error registering fd event for the new client: No error (conn: fd=3296)
[22196] 16 Dec 09:44:31.934 # Error registering fd event for the new client: No error (conn: fd=3296)
[22196] 16 Dec 09:44:33.013 # Error registering fd event for the new client: No error (conn: fd=3296)
  • 原因分析:
    • 猜测:Redis windows版本,不支持daemonize yes开启守护进程,以独立进程启动。
    • 验证:测试下来是 redis-windows-6.2.6.4 这个版本的问题,升级为 redis-windows-7.4.0 后正常。
  • 解决方案:
    • 临时解决,重启redis节点即可(该版本暂未找到其他好的方式来解决该问题)
    • 长期解决,升级redis到7可解决

问题2:win11 redis集群搭建,从节点replica主节点时,auth授权失败

  • redis版本:redis-windows-6.2.6.4
  • 执行命令:redis-cli --cluster create ip:6001 ip:6002 ip:6003 ip:6004 ip:6005 ip:6006 --cluster-replicas 1
  • 错误日志:从节点的日志内容如下
[24876] 19 Dec 09:55:49.652 # IP address for this node updated to 127.0.0.1
[24876] 19 Dec 09:55:52.635 * Before turning into a replica, using my own master parameters to synthesize a cached master: I may be able to synchronize with the new master with just a partial transfer.
[24876] 19 Dec 09:55:52.635 * Connecting to MASTER 127.0.0.1:6002
[24876] 19 Dec 09:55:52.635 * MASTER <-> REPLICA sync started
[24876] 19 Dec 09:55:52.635 # Cluster state changed: ok
[24876] 19 Dec 09:55:52.636 * Non blocking connect for SYNC fired the event.
[24876] 19 Dec 09:55:52.636 * Master replied to PING, replication can continue...
[24876] 19 Dec 09:55:52.636 # Unable to AUTH to MASTER: -ERR AUTH <password> called without any password configured for the default user. Are you sure your configuration is correct?
  • 原因分析:未设置requirepass密码
  • 解决方案:
    • 设置主库requirepass密码,且设置从库masterauth。Redis集群版本中,从节点可能会升级为主节点,因此将requirepass和masterauth设置为一致。
    • 若不一致,则从节点会报如下错误: Unable to AUTH to MASTER: -WRONGPASS invalid username-password pair or user is disabled.

问题3:win11 redis集群搭建,设置requirepass密码后,主从节点直接挂掉

  • redis版本:redis-windows-6.2.6.4
  • 执行命令:redis-cli --cluster create ip:6001 ip:6002 ip:6003 ip:6004 ip:6005 ip:6006 --cluster-replicas 1 -a 123456
  • 错误日志:主从节点的日志文件中,均报如下错误
[19928] 19 Dec 10:11:49.361 # Redis is starting ......
[19928] 19 Dec 10:11:49.361 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=19928, just started
[19928] 19 Dec 10:11:49.361 # Configuration loaded
[19928] 19 Dec 10:11:49.361 # Windows does not support daemonize. Start Redis as service
[19928] 19 Dec 10:11:49.363 * No cluster configuration found, I'm 3a1b72f13db1dec7142b2a2d3bba91a5ea04c548
[19928] 19 Dec 10:11:49.366 * Running mode=cluster, port=6001.
[19928] 19 Dec 10:11:49.366 # Server initialized
[19928] 19 Dec 10:11:49.366 * Ready to accept connections
[19928] 19 Dec 10:12:00.879 # configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH
[19928] 19 Dec 10:12:00.970 # IP address for this node updated to 127.0.0.1
[19928] 19 Dec 10:12:02.893 * Replica 127.0.0.1:6004 asks for synchronization
[19928] 19 Dec 10:12:02.893 * Partial resynchronization not accepted: Replication ID mismatch (Replica asked for '6566cfae42b7af906dd400dfa113ae1d5480dc7e', my replication IDs are 'f24a884312d35a426c86619816874cc9dde3466d' and '0000000000000000000000000000000000000000')
[19928] 19 Dec 10:12:02.893 * Replication backlog created, my new replication IDs are '4fe250a0990a1dddb5b4b50f0ac9aef6bc843f14' and '0000000000000000000000000000000000000000'
[19928] 19 Dec 10:12:02.893 * Starting BGSAVE for SYNC with target: disk
[19928] 19 Dec 10:12:02.902 * Background saving started by pid 17572
[19928] 19 Dec 10:12:03.052 # fork operation complete
[19928] 19 Dec 10:12:03.071 * Background saving terminated with success
[19928] 19 Dec 10:12:03.072 * Synchronization with replica 127.0.0.1:6004 succeeded
[19928] 19 Dec 10:12:05.903 # Cluster state changed: ok


=== REDIS BUG REPORT START: Cut & paste starting from here ===
Redis version: 6.2.6
[19928] 19 Dec 10:12:06.616 # --- EXCEPTION_ACCESS_VIOLATION
[19928] 19 Dec 10:12:06.617 # --- STACK TRACE
redis-server.exe!((null):0)(0x1401B7F30, 0x0014FF60, 0x00000001, 0x0014EBC0)
redis-server.exe!((null):0)(0x0014EBC0, 0x00000001, 0x00000000, 0x00000000)
KERNELBASE.dll!UnhandledExceptionFilter((null):0)(0x0005AF59, 0x7FFB75832BC8, 0x00000000, 0x7FFB756F0F7A)
ntdll.dll!memcpy((null):0)(0x0014EC90, 0x00000000, 0x0014EC48, 0x0014F230)
ntdll.dll!_C_specific_handler((null):0)(0x00000000, 0x0014F190, 0x0014F870, 0x0014F870)
ntdll.dll!_chkstk((null):0)(0x0014F870, 0x7FFB756D0000, 0x7FFB7572AF38, 0x7FFB7585EBF8)
ntdll.dll!RtlFindCharInUnicodeString((null):0)(0x00000000, 0x00000000, 0x7FA60BC001C0, 0x00000000)
ntdll.dll!KiUserExceptionDispatcher((null):0)(0x14004A60B, 0x00499490, 0x00497B60, 0x0000001B)
redis-server.exe!KiUserExceptionDispatcher((null):0)(0x00499490, 0x00497B60, 0x0000001B, 0x00000000)
redis-server.exe!KiUserExceptionDispatcher((null):0)(0x00000001, 0x00000001, 0x00000002, 0x7FA500000001)
redis-server.exe!KiUserExceptionDispatcher((null):0)(0x00000002, 0x0000001B, 0x00000001, 0x00000000)
redis-server.exe!KiUserExceptionDispatcher((null):0)(0x00004DD8, 0x1401B1720, 0x7FA60F400480, 0x00000010)
redis-server.exe!KiUserExceptionDispatcher((null):0)(0x00497B60, 0x00497B60, 0x00499490, 0x00497B60)
redis-server.exe!KiUserExceptionDispatcher((null):0)(0x00000000, 0x00000000, 0x00497B60, 0x00000000)
redis-server.exe!KiUserExceptionDispatcher((null):0)(0x00000000, 0x00000000, 0x00000000, 0x00000000)
KERNEL32.DLL!BaseThreadInitThunk((null):0)(0x00000000, 0x00000000, 0x00000000, 0x00000000)
ntdll.dll!RtlUserThreadStart((null):0)(0x00000000, 0x00000000, 0x00000000, 0x00000000)
ntdll.dll!RtlUserThreadStart((null):0)(0x00000000, 0x00000000, 0x00000000, 0x00000000)
[19928] 19 Dec 10:12:06.617 # --- INFO OUTPUT
# Server
redis_version:6.2.6
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:164b73bbc4ccd2e9
redis_mode:cluster
os:Windows  
arch_bits:64
multiplexing_api:WinSock_IOCP
atomicvar_api:pthread-mutex
gcc_version:0.0.0
process_id:19928
process_supervised:no
run_id:f956b182ee3d2cd81581e5a10e898e336631026f
tcp_port:6001
server_time_usec:1734574326539367
uptime_in_seconds:17
uptime_in_days:0
hz:10
configured_hz:10
lru_clock:6521078
executable:D:\software\redis\redis-cluster\6001\redis-server
config_file:D:\software\redis\redis-cluster\6001\redis-6001.conf
io_threads_active:0

# Clients
connected_clients:0
cluster_connections:10
maxclients:3168
client_recent_max_input_buffer:32
client_recent_max_output_buffer:0
blocked_clients:0
tracking_clients:0
clients_in_timeout_table:0

# Memory
# ... ...

# Persistence
# ... ...

# Stats
# ... ...

# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6004,state=online,offset=0,lag=3
master_failover_state:no-failover
master_replid:4fe250a0990a1dddb5b4b50f0ac9aef6bc843f14
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:0

# CPU
used_cpu_sys:0.015625
used_cpu_user:0.000000
used_cpu_sys_children:0.000000
used_cpu_user_children:0.000000

# Modules

# Commandstats
# ... ...

# Errorstats
errorstat_NOAUTH:count=1

# Cluster
cluster_enabled:1

# Keyspace
[19928] 19 Dec 10:12:06.617 # 
=== REDIS BUG REPORT END. Make sure to include from START to END. ===

       Please report this bug by following the instructions at:

     https://github.com/zkteco-home/redis-windows/wiki/Submitting-an-Issue

    Suspect RAM error? Use redis-server --test-memory to verify it.

  • 原因分析:测试下来是 redis-windows-6.2.6.4 这个版本的问题,升级为 redis-windows-7.4.0 后正常。
  • 解决方案:升级redis到7可解决

http://www.kler.cn/a/459571.html

相关文章:

  • 对一个双向链表,从尾部遍历找到第一个值为x的点,将node p插入这个点之前,如果找不到,则插在末尾。使用C语言实现
  • Excel重新踩坑5:二级下拉列表制作;★数据透视表;
  • 后端java开发路由接口并部署服务器(四)
  • 大数据系列之:深入理解学习使用腾讯COS和COS Ranger权限体系解决方案,从hdfs同步数据到cos
  • vip与haproxy构建nginx高可用集群传递客户端真实ip
  • 米哈游可切换角色背景动态壁纸
  • 爆改RagFlow
  • 【UE5】UnrealEngine源码构建3:启动UE5工程
  • 二、AI知识(神经网络)
  • 210.xxl-job定时任务:架构,可视化,GLUE模式,负载均衡,分片
  • Springboot(五十六)SpringBoot3集成SkyWalking
  • K8S-LLM:用自然语言轻松操作 Kubernetes
  • GPU 进阶笔记(四):NVIDIA GH200 芯片、服务器及集群组网
  • SpringSecurity 3.0.2.2版本
  • PostgreSQL的一主两从集群搭建部署 (两同步)
  • linux-headers-generic 依赖于 linux-headers-6.8.0-51-generic;然而:
  • Web安全 - “Referrer Policy“ Security 头值不安全
  • open_cv小练习
  • html+css+js网页设计 美食 美食4个页面带js
  • CentOS7 初始化模板
  • Matlab环形柱状图
  • 【基础篇】一、MySQL数据库基础知识
  • 学习路之VScode--自定义按键写注释(插件)
  • 【开发心得】SpringBoot对接Stripe支付
  • 国产数据库TiDB从入门到放弃教程
  • python -【es】基本使用