redis集群搭建
redis集群默认最少3个主节点,每个主节点最少一个从节点
1.下载redis压缩包并解压,复制为6份
https://github.com/tporadowski/redis/releases

2.修改redis.windows.conf文件

删除#注释修改为以下内容
port 7001 #为每个redis指定不同的端口
cluster-enabled yes
cluster-config-file nodes-7001.conf #为每个redis指定cluster-config-file文件名
cluster-node-timeout 15000
replica-read-only no #主节点设置为no,从节点设置为yes
#requirepass,masterauth 要相同
requirepass 123456
masterauth 123456
集群配置详解
# yes 代表启用集群模式
cluster-enabled yes
# Redis 用于保存集群状态信息的文件,状态信息包括:所有节点的信息(IP和Port)、它们的状态(故障,在线)、哈希槽信息等
cluster-config-file nodes-6379.conf
# 如果一个节点在15000毫秒(15秒)内没有收到来自另一个节点的PONG响应(即对PING请求的回应),那么它会认为那个节点是不可达或失效的(处于主观下线状态)。
cluster-node-timeout 15000
# 这个配置项决定了一个从节点断开与主节点连接多久后,会被认为不能进行故障转移和晋升为主节点。默认是10s
cluster-replica-validity-factor 10
# 当一个主节点失效,为了晋升其下的从节点成为新的主节点,至少需要有多少个从节点在线,否则不会进行晋升过程。
cluster-migration-barrier 1
# 是否允许从节点在集群的不同主节点之间迁移。这有助于在负载不均的情况下平衡从节点。
cluster-allow-replica-migration yes
# 如果设置为 "yes",则集群要保证所有的哈希槽都必须有一个主节点来管理它,否则整个集群将停止服务。
cluster-require-full-coverage yes
# 这个配置选项决定了当主节点失效时,从节点是否可以自动升级为主节点。置为 "no" 允许从节点尝试变为新的主节点。设置为 "yes" 则不允许这种晋升。
cluster-replica-no-failover no
# 该配置项决定了在集群出现问题时,是否允许在从节点上进行读操作。设置为 "no" 时,从节点不允许读取。如果设置为 "yes",即使集群有问题,从节点还是可以读取。
cluster-allow-reads-when-down no
3添加启动文件

文件内容
title redis-7001 #我这里和端口保持一致可以自定义
redis-server.exe redis.windows.conf
4在父目录添加批量启动文件

调用3中的start文件一次启动6个redis
@echo off
setlocal
rem 获取脚本所在的目录作为父目录
set "parent_directory=%~dp0"
rem 遍历父目录下的每个子目录
for /d %%D in ("%parent_directory%*") do (
rem 检查子目录是否包含 start.bat 文件
if exist "%%~D\start.bat" (
rem 进入子目录并运行 start.bat
pushd "%%~D"
start start.bat
popd
)
)
endlocal
5启动redis
运行4中的批量启动文件启动6个redis,redis的黑窗口会显示:Ready to accept
connections

6启动集群模式
启动集群模式
redis-cli -a 123456 --cluster create --cluster-replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
–cluster-replicas 1 每个主节点分配1个从节点

设置为yes后redis变化如下

redis会默认的将前3个节点用作主节点。
此时redis集群启动完成,
7在cluster-config-file指定的文件查看节点关系


1744305617000所在字段表示节点状态更新时间,用于判断节点存活状态和故障恢复优先级。
此时在黑窗口用redis-cli链接从节点添加数据会提示未授权,链接主节点则会正常写入并同步到其他节点,使用rdm等工具则无影响。
8批量关闭节点

@echo off
set START_PORT=7001
set END_PORT=7006
echo Closing port %START_PORT%-%END_PORT%...
echo.
for /l %%i in (%START_PORT%, 1, %END_PORT%) do (
call :closeProgram %%i
)
echo.
echo Closing all
echo.
taskkill /f /fi "imagename eq cmd.exe"
echo.
echo All closed.
goto :eof
:closeProgram
set PORT=%1
echo Searching for programs using port %PORT%...
for /f "tokens=5" %%a in ('netstat -ano ^| findstr /i ":%PORT%"') do (
taskkill /f /pid %%a
echo Program with port %PORT% has been closed.
)
echo.
echo End of program list for port %PORT%.
goto :eof
9添加主节点
新增两个redis并设置端口为7007,7008,其他的和之前的设置一样

运行start文件能看到两个新节点是

10新节点加入集群
7007作为主节点加入集群
redis-cli.exe --cluster add-node 127.0.0.1:7007 127.0.0.1:7001 -a 123456
新加的节点127.0.0.1:7007;任意集群中现有节点127.0.0.1:7001;如有密码则用-a 123456

11为新增主节点分配哈希槽
redis-cli.exe --cluster reshard 127.0.0.1:7007
根据提示输入以下信息:
迁移的槽位数量(如1000)
目标节点ID(新节点的ID,可通过cluster nodes查看)
源节点ID(输入all表示从所有现有节点迁移槽位)
迁移的槽位数量

目标节点ID

源节点ID
我用的7001的槽位,7001当前槽位分配


输入完源节点id后输入“done”

选择yes继续执行

可以看到7007 的槽位

12为7007添加从节点
运行7008的start文件

redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7001 --cluster-slave --cluster-master-id 6685f6b1642c9c802282c7f9b73d216a2310f51a -a 123456
新节点127.0.0.1:7008
任意现有节点127.0.0.1:7001
主节点7007的id6685f6b1642c9c802282c7f9b73d216a2310f51a

添加完成


13删除一对主从节点
删除前先将主节点的哈希槽转移到其他主节点上,删除时要先删除从节点
删除从节点
redis-cli --cluster del-node 127.0.0.1:7008 4a3d20794c78d72f339b64049aa46fedd90a6579 #该节点的id

看一看到7008退出

查看主节点信息

7007有2000个槽,0个从节点
将7007的槽还给7001
redis-cli --cluster reshard 127.0.0.1:7007 --cluster-from 6685f6b1642c9c802282c7f9b73d216a2310f51a --cluster-to 97d9f617e25fb5dd182942a41888b72a3d81b576 --cluster-slots 2000 --cluster-yes

6685f6b1642c9c802282c7f9b73d216a2310f51a 7007的id
97d9f617e25fb5dd182942a41888b72a3d81b576 7001的id
2000 分给7001的槽数量,也能拆为两份,执行两次命令,将槽分给两个主节点
7001的哈希槽变化

删除主节点7007
redis-cli --cluster del-node 127.0.0.1:7007 6685f6b1642c9c802282c7f9b73d216a2310f51a -a 123456


7007从集群中移出
更多推荐



所有评论(0)