王海鱼 发表于 2024-12-29 06:36:57

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 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 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
[*]错误信息: Node 127.0.0.1:6001 is not configured as a cluster node.
[*]日志文件:redis-6001.log 中的内容如下:
14 Dec 16:59:47.610 # IP address for this node updated to 127.0.0.1
14 Dec 16:59:52.560 # Cluster state changed: ok
14 Dec 17:27:22.757 # New configEpoch set to 8
14 Dec 17:27:22.757 # configEpoch updated after importing slot 0
16 Dec 09:44:30.844 # Error registering fd event for the new client: No error (conn: fd=3296)
16 Dec 09:44:31.934 # Error registering fd event for the new client: No error (conn: fd=3296)
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
[*]错误日志:从节点的日志内容如下
19 Dec 09:55:49.652 # IP address for this node updated to 127.0.0.1
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.
19 Dec 09:55:52.635 * Connecting to MASTER 127.0.0.1:6002
19 Dec 09:55:52.635 * MASTER <-> REPLICA sync started
19 Dec 09:55:52.635 # Cluster state changed: ok
19 Dec 09:55:52.636 * Non blocking connect for SYNC fired the event.
19 Dec 09:55:52.636 * Master replied to PING, replication can continue...
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
[*]错误日志:主从节点的日志文件中,均报如下错误
19 Dec 10:11:49.361 # Redis is starting ......
19 Dec 10:11:49.361 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=19928, just started
19 Dec 10:11:49.361 # Configuration loaded
19 Dec 10:11:49.361 # Windows does not support daemonize. Start Redis as service
19 Dec 10:11:49.363 * No cluster configuration found, I'm 3a1b72f13db1dec7142b2a2d3bba91a5ea04c548
19 Dec 10:11:49.366 * Running mode=cluster, port=6001.
19 Dec 10:11:49.366 # Server initialized
19 Dec 10:11:49.366 * Ready to accept connections
19 Dec 10:12:00.879 # configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH
19 Dec 10:12:00.970 # IP address for this node updated to 127.0.0.1
19 Dec 10:12:02.893 * Replica 127.0.0.1:6004 asks for synchronization
19 Dec 10:12:02.893 * Partial resynchronization not accepted: Replication ID mismatch (Replica asked for '6566cfae42b7af906dd400dfa113ae1d5480dc7e', my replication IDs are 'f24a884312d35a426c86619816874cc9dde3466d' and '0000000000000000000000000000000000000000')
19 Dec 10:12:02.893 * Replication backlog created, my new replication IDs are '4fe250a0990a1dddb5b4b50f0ac9aef6bc843f14' and '0000000000000000000000000000000000000000'
19 Dec 10:12:02.893 * Starting BGSAVE for SYNC with target: disk
19 Dec 10:12:02.902 * Background saving started by pid 17572
19 Dec 10:12:03.052 # fork operation complete
19 Dec 10:12:03.071 * Background saving terminated with success
19 Dec 10:12:03.072 * Synchronization with replica 127.0.0.1:6004 succeeded
19 Dec 10:12:05.903 # Cluster state changed: ok


=== REDIS BUG REPORT START: Cut & paste starting from here ===
Redis version: 6.2.6
19 Dec 10:12:06.616 # --- EXCEPTION_ACCESS_VIOLATION
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)
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
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可办理

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Redis 安装部署[主从、哨兵、集群](windows版)