redis揭秘-redis01-redis单例与集群安装总结
文章目录
- 【README】
- 【1】安装单机
- 【1.1】安装环境
- 【1.2】安装步骤
- 【2】redis集群主从模式配置
- 【2.1】集群架构
- 【2.2】redis集群主从模式搭建步骤
- 【2.3】redis集群主从模式的问题(单点故障问题)
- 【3】redis集群哨兵模式配置
- 【3.1】集群架构
- 【3.2】redis集群哨兵模式搭建步骤
- 【3.2.1】redis集群哨兵模式下的读写操作
- 【3.2.2】模拟主节点6501宕机
- 【3.2.3】模拟主节点6501恢复
- 【3.3】哨兵模式总结
- 【3.3.1】哨兵模式特点
- 【3.3.2】哨兵模式的问题(重要)
- 【4】redis集群Cluster模式配置(最佳配置)
- 【4.1】集群架构
- 【4.2】redis集群Cluster模式搭建步骤
- 【4.3】模拟redis节点宕机(cluster模式如何自动恢复)
- 【4.4】运行时新增或删除主从节点
- 【4.4.1】新增主节点6607
- 【4.4.2】新增从节点6608
- 【4.4.3】删除从节点6608
- 【4.5】主节点6607分配槽位
- 【4.6】主节点6607删除槽位/剪切槽位(分配槽位的逆向操作)
- 【5】参考资料
【README】
1)本文介绍了redis单例,redis集群3种模式安装方法(主从模式, 哨兵模式, CLUSTER模式); 其中CLUSTER是redis集群的最佳模式 ;
2)对于redis集群的cluster模式,演示了新增与删除主从节点,槽位分配操作;
【1】安装单机
【1.1】安装环境
[root@centos211 redis-7.0.15]# cat /etc/redhat-release
CentOS Linux release 8.3.2011
【1.2】安装步骤
1)下载redis安装包源码
https://redis.io/downloads/
或者 https://download.redis.io/releases/redis-7.0.15.tar.gz?_gl=18hf3xj_gcl_au*MTE4NTMwMTg4Ny4xNzMyOTM4MDk1
2)拷贝到centos8 root家目录下的software文件下:
[root@centos211 software]# ll
总用量 2932
drwxrwxr-x. 8 root root 4096 1月 9 2024 redis-7.0.15
-rw-r--r--. 1 root root 2994329 11月 30 11:43 redis-7.0.15.tar.gz
[root@centos211 software]#
[root@centos211 software]# pwd
/root/software
[root@centos211 software]#
执行解压命令:
tar -xvf redis-7.0.15.tar.gz 得到 redis-7.0.15
3)在redis目录(/root/software/redis-7.0.15) 执行make命令,编译redis源码
sudo yum install make #若没有安装make命令(编译工具)
make
【make命令补充】make命令理解为是编译工具
Linux 中的 make 命令可自动执行从源代码创建和编译应用程序的过程。在编译应用程序时,该实用程序会读取包含如何构建应用程序的说明的 makefile,然后执行必要的命令以完成构建过程。
4)使用make编译报cc:命令未找到
原因:没有gcc编译器 ;
安装gcc编译器,如下:
sudo yum groupinstall 'Development Tools' #安装开发工具,包括安装gcc编译器
5)查看gcc编译器版本
rpm -q gcc #查看gcc编译器安装包
gcc --verson #查看安装的gcc编译器版本
gcc -v
g++ -v
6)继续执行make命令编译redis源码
报错:zmalloc.h:50:10: fatal error: jemalloc/jemalloc.h: No such file or directory
原因:我们在开始执行make 时遇到了错误(大部分是由于gcc未安装),然后我们安装好了gcc 后,我们再执行make ,这时就出现了jemalloc/jemalloc.h: No such file or directory。 这是因为上次的编译失败,有残留的文件,我们需要清理下,然后重新编译就可以了。
解决方法:在redis家目录【/root/software/redis-7.0.15】重新执行命令:
make distclean && make
7)在redis家目录执行 make test 验证redis源码编译成功
8)在redis家目录执行 make install 安装redis服务;
[root@centos211 redis]# make install
cd src && make install
make[1]: Entering directory '/root/software/redis-7.0.15/src'
Hint: It's a good idea to run 'make test' ;)
INSTALL redis-server
INSTALL redis-benchmark
INSTALL redis-cli
make[1]: Leaving directory '/root/software/redis-7.0.15/src'
9)在redis家目录创建 conf 与 data文件夹
mkdir conf
mkdir data
10)使用 ln -s 创建符号链接(软链接);(使用/redis 可以访问/root/software/redis-7.0.15)
ln -s /root/software/redis-7.0.15 /redis
11)新增redis启动配置文件(参考redis家目录下的redis.conf文件)
[root@centos211 conf]# vim redis-6379.conf
port 6379
dir /redis/data
dbfilename "dump-6379.rdb"
12)启动redis服务器
[root@centos211 conf]# redis-server redis-6379.conf
13)客户端连接redis服务器(redis-cli -p 6379)
[root@centos211 redis]# redis-cli -p 6379
127.0.0.1:6379>
127.0.0.1:6379> set name 123
OK
127.0.0.1:6379> get name
"123"
127.0.0.1:6379>
【2】redis集群主从模式配置
【2.1】集群架构
主节点:127.0.0.1 6401
从节点:127.0.0.1 6402
【2.2】redis集群主从模式搭建步骤
1)创建 redis-6401.conf文件
[root@centos211 conf]# cp redis-6379.conf redis-6401.conf
# redis-6401.conf 内容
port 6401
dir /redis/data
dbfilename "dump-6401.rdb"
[root@centos211 conf]# pwd
/redis/conf
2)创建redis-6402.conf文件(从redis-6401.conf复制并用6402替换6401,得到redis-6402.conf)
[root@centos211 conf]# sed "s/6401/6402/g" redis-6401.conf > redis-6402.conf
# redis-6402.conf 内容
port 6402
dir /redis/data
dbfilename "dump-6402.rdb"
slaveof 127.0.0.1 6401 #声明6402是6401的从节点,6401是主节点
3)启动主节点
[root@centos211 conf]# redis-server redis-6401.conf
4)启动从节点
[root@centos211 conf]# redis-server redis-6402.conf
44963:S 01 Dec 2024 02:33:27.592 * Ready to accept connections
44963:S 01 Dec 2024 02:33:27.597 * Connecting to MASTER 127.0.0.1:6401 # 连接到主节点
44963:S 01 Dec 2024 02:33:27.597 * MASTER <-> REPLICA sync started
5)从节点启动后,主节点日志如下:
44956:M 01 Dec 2024 02:33:03.518 * Ready to accept connections
44956:M 01 Dec 2024 02:33:27.599 * Replica 127.0.0.1:6402 asks for synchronization
# 接收到从节点6402的resync请求
44956:M 01 Dec 2024 02:33:27.599 * Full resync requested by replica 127.0.0.1:6402
6)客户端1连接主节点6401,设置key=name,value=1234
[root@centos211 ~]# redis-cli -p 6401
127.0.0.1:6401> set name 1234
OK
127.0.0.1:6401>
7)客户端2连接从节点6402,获取key=name的value
[root@centos211 ~]# redis-cli -p 6402
127.0.0.1:6402> get name
"1234"
【2.3】redis集群主从模式的问题(单点故障问题)
1)问题: 当主节点宕机,则整个集群无法提供写服务直到从节点切换为主节点,因为从节点是只读节点,只能提供读服务;(而主节点宕机后,主从模式不具备自动恢复能力,即从节点自动切换为主节点,只能人工干预 )
2)从节点写操作报错
[root@centos211 ~]# redis-cli -p 6402
127.0.0.1:6402> get name
"1234"
127.0.0.1:6402> get name
"1234"
127.0.0.1:6402> set age 100
(error) READONLY You can't write against a read only replica.
【3】redis集群哨兵模式配置
1)哨兵模式: 监控redis集群中主从节点存活状态,若主节点宕机,则哨兵可以自动从多个从节点选择一个作为新主节点;
2)哨兵的作用:
监控状态:会向所有监控对象每秒发送ping命令,通过是否有响应来判断master和所有slave节点状态。
故障转移:当一旦发现Master节点异常,它将尝试进行故障转移,选择新的slave节点为master节点,并通过发布订阅的方式通知其他slave节点修改配置。
【3.1】集群架构
1)redis集群哨兵模式有2类节点: 主从节点, 哨兵节点;
2)主从节点:
-
主节点: 127.0.0.1 6501
-
从节点1: 127.0.0.1 6502
-
从节点2: 127.0.0.1 6503
3)哨兵节点(3个哨兵节点组成哨兵集群,为了防止哨兵节点单节点故障):
- 哨兵节点1:127.0.0.1 26501
- 哨兵节点1:127.0.0.1 26502
- 哨兵节点1:127.0.0.1 26503
【3.2】redis集群哨兵模式搭建步骤
1)新建主从节点配置文件: redis-6501.conf , redis-6502.conf , redis-6503.conf
【使用 sed “s/6502/6503/g” redis-6502.conf > redis-6503.conf快捷创建文件并做文本替换】
[root@centos211 conf]# vim redis-6501.conf
port 6501
dir /redis/data
dbfilename "dump-6501.rdb"
[root@centos211 conf]# vim redis-6502.conf
port 6502
dir /redis/data
dbfilename "dump-6502.rdb"
slaveof 127.0.0.1 6501
[root@centos211 conf]# vim redis-6503.conf
port 6503
dir /redis/data
dbfilename "dump-6503.rdb"
slaveof 127.0.0.1 6501
2)新建哨兵节点配置文件【sentinel-26501.conf】 (剔除sentinel.conf文件中的带#的行,空行; grep -v表示反向选择)
[root@centos211 conf]# cat ../sentinel.conf | grep -v '#' | grep -v '^$' > sentinel-26501.conf
port 26501 #哨兵线程端口26501
dir /redis/data #数据目录
#设置监听的主节点为127.0.0.1 6501; 2表示哨兵节点总数/2+1(本文计划的哨兵节点总数为3);
#即超过一半哨兵节点认为主节点下线,则该主节点客观下线
sentinel monitor mymaster 127.0.0.1 6501 2
#哨兵与主节点失联5秒后,哨兵主观认为主节点下线
sentinel down-after-milliseconds mymaster 5000
#设置主节点个数为1
sentinel parallel-syncs mymaster 1
#设置故障转移的超时时间为20s
sentinel failover-timeout mymaster 20000
sentinel deny-scripts-reconfig yes
3)同理,新建哨兵节点配置文件【sentinel-26502.conf】,【sentinel-26503.conf】
[root@centos211 conf]# cat sentinel-26502.conf
port 26502
dir /redis/data
sentinel monitor mymaster 127.0.0.1 6501 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 20000
sentinel deny-scripts-reconfig yes
[root@centos211 conf]# cat sentinel-26503.conf
port 26503
dir /redis/data
sentinel monitor mymaster 127.0.0.1 6501 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 20000
sentinel deny-scripts-reconfig yes
4)新开3个客户端分别启动6501, 6502, 6503 主从节点
redis-server redis-6501.conf
redis-server redis-6502.conf
redis-server redis-6503.conf
5)新开3个客户端分别启动 26501, 26502, 26503 共计3个哨兵节点
redis-sentinel sentinel-26501.conf
redis-sentinel sentinel-26502.conf
redis-sentinel sentinel-26503.conf
补充:哨兵节点26501, 26502, 26503相互都可以知道对方的存活状态;(此外,哨兵节点26501能够探测到主节点6501,2个从节点6502, 6503)
【同理】26502能够接收到26501, 26503的存活状态;26503能够接收到26501,26502的存活状态;
【3.2.1】redis集群哨兵模式下的读写操作
1)连接6501写数据,连接6502, 6503读数据
[root@centos211 ~]# redis-cli -p 6501
127.0.0.1:6501> set name lisi
OK
127.0.0.1:6501> get name
"lisi"
[root@centos211 ~]# redis-cli -p 6502
127.0.0.1:6502> get name
"lisi"
[root@centos211 ~]# redis-cli -p 6503
127.0.0.1:6503> get name
"lisi"
【3.2.2】模拟主节点6501宕机
目的:模拟主节点宕机,从节点切换为主节点;
1)强行让6501宕机:(6501宕机后,哨兵选择6502担任主节点)
2)连接6502并执行写操作
[root@centos211 ~]# redis-cli -p 6502
127.0.0.1:6502>
127.0.0.1:6502> set age 100
OK
127.0.0.1:6502>
127.0.0.1:6502> get age
"100"
【3.2.3】模拟主节点6501恢复
1)主节点6501宕机后, 哨兵选择从节点6502作为主节点; 主节点6501恢复后, 6501作为从节点,连接到6502主节点;
2)在6502客户端执行 info,可以看到当前节点6502是主节点, 6501, 6503是从节点
[root@centos211 ~]# redis-cli -p 6502
127.0.0.1:6502> set age 100
OK
127.0.0.1:6502> get age
"100"
127.0.0.1:6502> info
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6503,state=online,offset=261830,lag=1
slave1:ip=127.0.0.1,port=6501,state=online,offset=261830,lag=1
【3.3】哨兵模式总结
总结自:Redis从入门到放弃(8):哨兵模式
1)为什么哨兵需要多个节点的原因:
哨兵节点也存在单点故障。因此,为防止Sentinel发生意外,Sentinel也需要实现集群高可用,即需要多哨兵模式,实现了哨兵节点的高可用(本文部署了3个哨兵节点)。
Sentinel不只是监控Redis节点,各Sentinel节点之间也会互相监控。
【3.3.1】哨兵模式特点
1)自动检测及故障转移:当主节点宕机时,哨兵模式可以自动检测到宕机事件,并从从节点中选举出新的主节点,确保系统的持续可用性。
2)主观下线和客观下线
主观下线是指一个哨兵节点认为主节点不可用,但它并不确定其他哨兵节点是否也认为主节点不可用。当一个哨兵节点在一定时间(配置参数:down-after-milliseconds)内无法与主节点通信(比如发送PING命令没有收到响应),它会认为主节点下线。但在这个阶段,其他哨兵节点并不知道这个节点的状态,仅有一个哨兵主观地认为主节点宕机。
客观下线是指一个主节点被多数哨兵节点认定为不可用。当一个哨兵节点认为主节点宕机后,它会向其他哨兵节点询问对主节点的状态,并请求其他哨兵进行确认。如果多数(大多数至少需要半数加1)的哨兵节点都认为主节点不可用,那么主节点就会被判定为客观下线。客观下线意味着主节点的状态在整个哨兵集群中得到了确认。
主观下线和客观下线的引入是为了避免误判。如果只有一个哨兵节点认为主节点下线,那么很可能是网络抖动等原因导致的,此时并不应该进行故障转移。只有多数的哨兵节点都确认主节点下线,才能确保故障转移的正确性,保证整个集群的稳定性。
哨兵模式使用主观下线和客观下线状态的组合来实现可靠的主节点故障检测和故障转移,从而确保Redis集群的高可用性。
3)投票选举
在多Sentinel模式下,各节点会相互监控主从节点的健康状态。当主节点发生故障时,首先由Sentinel节点之间基于Raft算法进行投票选举,按照谁发现主节点故障谁去处理的原则,选举出一个领头Sentinel节点(Leader Sentinel)。这个领头Sentinel节点负责进行故障转移操作。
故障转移过程中,领头Sentinel节点会根据一定的规则在所有从节点中选择一个最优的从节点作为新的主节点(Master)。一般会选择复制偏移量最大且优先级较高的从节点作为新的主节点。然后,领头Sentinel节点通过发布订阅功能,通知其他从节点更改配置文件,将它们的连接从原来的主节点转移到新的主节点上。
对于客户端来说,连接Redis集群时首先连接到Sentinel节点,通过Sentinel节点查询主节点的地址。一旦主节点发生故障并进行了故障转移,Sentinel节点会将最新的主节点地址告知客户端。这样,客户端无需重启,就可以自动连接到新的主节点,实现高可用性的数据交互。
【3.3.2】哨兵模式的问题(重要)
1)哨兵模式的问题:
- 故障转移可能会引起数据丢失。在故障转移期间,可能会丢失尚未同步到从节点的数据。
- 哨兵模式的多维护了一套配置,维护成本相对较高。
【4】redis集群Cluster模式配置(最佳配置)
【4.1】集群架构
1)3主3从; 可以理解为3套redis服务,每套redis服务是一主一从架构;
- 127.0.0.1 6601
- 127.0.0.1 6602
- 127.0.0.1 6603
- 127.0.0.1 6604
- 127.0.0.1 6605
- 127.0.0.1 6606
【4.2】redis集群Cluster模式搭建步骤
1)新建6个redis启动配置文件
[root@centos211 conf]# vim redis-6601.conf
[root@centos211 conf]# cat redis-6601.conf
port 6601
dir "/root/software/redis-7.0.15/data"
dbfilename "dump-6601.rdb"
cluster-enabled yes
cluster-config-file "cluster-6601.conf"
cluster-node-timeout 5000
[root@centos211 conf]# sed 's/6601/6602/g' redis-6601.conf > redis-6602.conf
[root@centos211 conf]# sed 's/6601/6603/g' redis-6601.conf > redis-6603.conf
[root@centos211 conf]# sed 's/6601/6604/g' redis-6601.conf > redis-6604.conf
[root@centos211 conf]# sed 's/6601/6605/g' redis-6601.conf > redis-6605.conf
[root@centos211 conf]# sed 's/6601/6606/g' redis-6601.conf > redis-6606.conf
2)新开6个客户端,分别使用6个配置文件启动6个redis实例
redis-server /redis/conf/redis-6601.conf
redis-server /redis/conf/redis-6602.conf
redis-server /redis/conf/redis-6603.conf
redis-server /redis/conf/redis-6604.conf
redis-server /redis/conf/redis-6605.conf
redis-server /redis/conf/redis-6606.conf
3)创建redis集群
[root@centos211 ~]# redis-cli --cluster create 127.0.0.1:6601 127.0.0.1:6602 127.0.0.1:6603 127.0.0.1:6604 127.0.0.1:6605 127.0.0.1:6606 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:6605 to 127.0.0.1:6601 #这不是最终主从分配结果
Adding replica 127.0.0.1:6606 to 127.0.0.1:6602 #这不是最终主从分配结果
Adding replica 127.0.0.1:6604 to 127.0.0.1:6603 #这不是最终主从分配结果
# (redis对最终分配结果做了优化,如下)
>>> Performing Cluster Check (using node 127.0.0.1:6601)
M: 738ab432123c70b98e07d01502609c5a25b4111e 127.0.0.1:6601
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: 671876289bbf61375478c059800a654eaa79145e 127.0.0.1:6603
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 13f53bdd3bce98106ded4aed6b456496d58aaa00 127.0.0.1:6604
slots: (0 slots) slave
replicates 738ab432123c70b98e07d01502609c5a25b4111e #6601
M: eed20f0f41004059789cc3f15ab84a344885cc3a 127.0.0.1:6602
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 74bedd0c81b38f92a776cf09630e3d32688fff50 127.0.0.1:6606
slots: (0 slots) slave
replicates 671876289bbf61375478c059800a654eaa79145e #6603
S: d4a6ee7fe8a9d0e29465a1bc1b71083368a9c4c8 127.0.0.1:6605
slots: (0 slots) slave
replicates eed20f0f41004059789cc3f15ab84a344885cc3a #6602
redis集群cluster模式创建结果
- 创建命令把 6601与6604作为一套(一组)redis服务,其中6601是主,6604是从;
- 创建命令把 6602与6606作为一套(一组)redis服务,其中6602是主,6605是从;
- 创建命令把 6603与6606作为一套(一组)redis服务,其中6603是主,6606是从;
4)客户端以cluster模式连接到redis集群(-c就是以集群模式连接redis ,启动6605是从节点,也可以连接成功;只不过会重定向到6602从节点)
[root@centos211 ~]# redis-cli -c -p 6605 # -c就是以集群模式连接redis ,启动6605是从节点
127.0.0.1:6605> set name 12345
-> Redirected to slot [5798] located at 127.0.0.1:6602
OK
127.0.0.1:6602>
[root@centos211 ~]# redis-cli -c -p 6602
127.0.0.1:6602> get name
"12345"
[root@centos211 ~]# redis-cli -c -p 6605
127.0.0.1:6605> get name
-> Redirected to slot [5798] located at 127.0.0.1:6602 #重定向到6602
"12345"
[root@centos211 ~]# redis-cli -c -p 6601
127.0.0.1:6601>
127.0.0.1:6601> get name
-> Redirected to slot [5798] located at 127.0.0.1:6602 #重定向到6602
"12345"
127.0.0.1:6602>
【4.3】模拟redis节点宕机(cluster模式如何自动恢复)
1)查看主从节点信息;
127.0.0.1:6602> cluster nodes
13f53bdd3bce98106ded4aed6b456496d58aaa00 127.0.0.1:6604@16604 slave 738ab432123c70b98e07d01502609c5a25b4111e #6604的主节点为6601
d4a6ee7fe8a9d0e29465a1bc1b71083368a9c4c8 127.0.0.1:6605@16605 slave eed20f0f41004059789cc3f15ab84a344885cc3a #6605的主节点为6602
738ab432123c70b98e07d01502609c5a25b4111e 127.0.0.1:6601@16601 master - 0 1733040839227 1 connected 0-5460
74bedd0c81b38f92a776cf09630e3d32688fff50 127.0.0.1:6606@16606 slave 671876289bbf61375478c059800a654eaa79145e #6606的主节点为6603
671876289bbf61375478c059800a654eaa79145e 127.0.0.1:6603@16603 master - 0 1733040840245 3 connected 10923-16383
eed20f0f41004059789cc3f15ab84a344885cc3a 127.0.0.1:6602@16602 myself,master - 0 1733040839000 2 connected 5461-10922
6604的主节点为6601
6605的主节点为6602
6606的主节点为6603
2)模拟6601宕机:
127.0.0.1:6602> cluster nodes
13f53bdd3bce98106ded4aed6b456496d58aaa00 127.0.0.1:6604@16604 master - 0 1733041872000 7 connected 0-5460 #从节点6604升级为主节点
d4a6ee7fe8a9d0e29465a1bc1b71083368a9c4c8 127.0.0.1:6605@16605 slave eed20f0f41004059789cc3f15ab84a344885cc3a #6605的主节点为6602
738ab432123c70b98e07d01502609c5a25b4111e 127.0.0.1:6601@16601 master,fail - 1733041811334 1733041810000 1 disconnected #宕机
74bedd0c81b38f92a776cf09630e3d32688fff50 127.0.0.1:6606@16606 slave 671876289bbf61375478c059800a654eaa79145e #6606的主节点为6603
671876289bbf61375478c059800a654eaa79145e 127.0.0.1:6603@16603 master - 0 1733041872532 3 connected 10923-16383
eed20f0f41004059789cc3f15ab84a344885cc3a 127.0.0.1:6602@16602 myself,master - 0 1733041872000 2 connected 5461-10922
从节点6604升级为主节点
6605的主节点为6602
6606的主节点为6603
3)执行写操作
127.0.0.1:6602> set age 100
-> Redirected to slot [741] located at 127.0.0.1:6604
OK
127.0.0.1:6604>
4)模拟6601恢复
127.0.0.1:6604> cluster nodes
d4a6ee7fe8a9d0e29465a1bc1b71083368a9c4c8 127.0.0.1:6605@16605 slave eed20f0f41004059789cc3f15ab84a344885cc3a #6605的主节点为6602
671876289bbf61375478c059800a654eaa79145e 127.0.0.1:6603@16603 master - 0 1733042193000 3 connected 10923-16383
74bedd0c81b38f92a776cf09630e3d32688fff50 127.0.0.1:6606@16606 slave 671876289bbf61375478c059800a654eaa79145e #6606的主节点为6603
13f53bdd3bce98106ded4aed6b456496d58aaa00 127.0.0.1:6604@16604 myself,master - 0 1733042192000 7 connected 0-5460
738ab432123c70b98e07d01502609c5a25b4111e 127.0.0.1:6601@16601 slave 13f53bdd3bce98106ded4aed6b456496d58aaa00 #6601的主节点为6604
eed20f0f41004059789cc3f15ab84a344885cc3a 127.0.0.1:6602@16602 master - 0 1733042193321 2 connected 5461-10922
6605的主节点为6602
6606的主节点为6603
6601的主节点为6604
5)模拟6602宕机(因为本文执行set name 12345时,对6602做了写操作)
当6602宕机后,再次执行 set name 12345,redis集群如何处理?【重定向到6605,写操作正常】
127.0.0.1:6604> set name 12345
-> Redirected to slot [5798] located at 127.0.0.1:6605 #重定向到6605,而不是6602;写操作是正常的
OK
127.0.0.1:6605> cluster nodes
738ab432123c70b98e07d01502609c5a25b4111e 127.0.0.1:6601@16601 slave 13f53bdd3bce98106ded4aed6b456496d58aaa00 #6601的主节点为6604
13f53bdd3bce98106ded4aed6b456496d58aaa00 127.0.0.1:6604@16604 master - 0 1733042488139 7 connected 0-5460
eed20f0f41004059789cc3f15ab84a344885cc3a 127.0.0.1:6602@16602 master,fail - 1733042387127 1733042384571 2 disconnected #6602宕机
d4a6ee7fe8a9d0e29465a1bc1b71083368a9c4c8 127.0.0.1:6605@16605 myself,master - 0 1733042486000 8 connected 5461-10922
671876289bbf61375478c059800a654eaa79145e 127.0.0.1:6603@16603 master - 0 1733042488139 3 connected 10923-16383
74bedd0c81b38f92a776cf09630e3d32688fff50 127.0.0.1:6606@16606 slave 671876289bbf61375478c059800a654eaa79145e # 6606的主节点为6603
6601的主节点为6604
6606的主节点为6603
6602宕机前:6605的主节点为6602;
6602宕机后:6605本身升级为主节点 ;
即只有2个从节点,3个主节点;
6)模拟6602恢复
127.0.0.1:6605> cluster nodes
738ab432123c70b98e07d01502609c5a25b4111e 127.0.0.1:6601@16601 slave 13f53bdd3bce98106ded4aed6b456496d58aaa00 #6601的主节点为6604
13f53bdd3bce98106ded4aed6b456496d58aaa00 127.0.0.1:6604@16604 master - 0 1733042749319 7 connected 0-5460
eed20f0f41004059789cc3f15ab84a344885cc3a 127.0.0.1:6602@16602 slave d4a6ee7fe8a9d0e29465a1bc1b71083368a9c4c8 #6602的主节点为6605
d4a6ee7fe8a9d0e29465a1bc1b71083368a9c4c8 127.0.0.1:6605@16605 myself,master - 0 1733042749000 8 connected 5461-10922
671876289bbf61375478c059800a654eaa79145e 127.0.0.1:6603@16603 master - 0 1733042750344 3 connected 10923-16383
74bedd0c81b38f92a776cf09630e3d32688fff50 127.0.0.1:6606@16606 slave 671876289bbf61375478c059800a654eaa79145e #6606的主节点为6603
6601的主节点为6604
6602的主节点为6605
6606的主节点为6603
【4.4】运行时新增或删除主从节点
【4.4.1】新增主节点6607
1)新增主节点6607
[root@centos211 conf]# sed 's/6601/6607/g' redis-6601.conf > redis-6607.conf
[root@centos211 conf]#
[root@centos211 conf]# redis-server redis-6607.conf
[root@centos211 ~]# redis-cli --cluster add-node 127.0.0.1:6607 127.0.0.1:6605 #新增节点到端口6605所在集群
2)查看新增主节点后的集群架构
127.0.0.1:6605> cluster nodes
65f73c9360ce01c48dfe8c35603fdd0bf6b30d6b 127.0.0.1:6607@16607 master - 0 1733043206585 0 connected #6607本身作为主节点
738ab432123c70b98e07d01502609c5a25b4111e 127.0.0.1:6601@16601 slave 13f53bdd3bce98106ded4aed6b456496d58aaa00 #6601的主节点为6604
13f53bdd3bce98106ded4aed6b456496d58aaa00 127.0.0.1:6604@16604 master - 0 1733043206000 7 connected 0-5460
eed20f0f41004059789cc3f15ab84a344885cc3a 127.0.0.1:6602@16602 slave d4a6ee7fe8a9d0e29465a1bc1b71083368a9c4c8 #6602的主节点为6605
d4a6ee7fe8a9d0e29465a1bc1b71083368a9c4c8 127.0.0.1:6605@16605 myself,master - 0 1733043206000 8 connected 5461-10922
671876289bbf61375478c059800a654eaa79145e 127.0.0.1:6603@16603 master - 0 1733043207098 3 connected 10923-16383
74bedd0c81b38f92a776cf09630e3d32688fff50 127.0.0.1:6606@16606 slave 671876289bbf61375478c059800a654eaa79145e #6606的主节点为6603
6607本身作为主节点
6601的主节点为6604
6602的主节点为6605
6606的主节点为6603
【4.4.2】新增从节点6608
1)新增从节点6608
[root@centos211 conf]# sed 's/6601/6608/g' redis-6601.conf > redis-6608.conf
[root@centos211 conf]#
[root@centos211 conf]# redis-server redis-6608.conf
# 为主节点6605新增从节点6608
# d4a6ee7fe8a9d0e29465a1bc1b71083368a9c4c8为主节点6605的hash标识
[root@centos211 ~]# redis-cli --cluster add-node 127.0.0.1:6608 127.0.0.1:6605 --cluster-slave --cluster-master-id d4a6ee7fe8a9d0e29465a1bc1b71083368a9c4c8
2)查看新增从节点后的集群架构
127.0.0.1:6605> cluster nodes
65f73c9360ce01c48dfe8c35603fdd0bf6b30d6b 127.0.0.1:6607@16607 master - 0 1733043765747 9 connected #6607本身作为主节点
738ab432123c70b98e07d01502609c5a25b4111e 127.0.0.1:6601@16601 slave 13f53bdd3bce98106ded4aed6b456496d58aaa00 #6601的主节点为6604
13f53bdd3bce98106ded4aed6b456496d58aaa00 127.0.0.1:6604@16604 master - 0 1733043765000 7 connected 0-5460
eed20f0f41004059789cc3f15ab84a344885cc3a 127.0.0.1:6602@16602 slave d4a6ee7fe8a9d0e29465a1bc1b71083368a9c4c8 #6602的主节点为6605
d4a6ee7fe8a9d0e29465a1bc1b71083368a9c4c8 127.0.0.1:6605@16605 myself,master - 0 1733043764000 8 connected 5461-10922
671876289bbf61375478c059800a654eaa79145e 127.0.0.1:6603@16603 master - 0 1733043765540 3 connected 10923-16383
74bedd0c81b38f92a776cf09630e3d32688fff50 127.0.0.1:6606@16606 slave 671876289bbf61375478c059800a654eaa79145e #6606的主节点为6603
c1a85083c96d2bff465eeb2db783c9edbe728ed4 127.0.0.1:6608@16608 slave d4a6ee7fe8a9d0e29465a1bc1b71083368a9c4c8 #6608的主节点为6605
6607本身作为主节点
6601的主节点为6604
6602的主节点为6605
6606的主节点为6603
6608的主节点为6605
即: 主节点6605有2个从节点,包括6602, 6608 ;
【4.4.3】删除从节点6608
[root@centos211 ~]# redis-cli --cluster del-node 127.0.0.1:6608 c1a85083c96d2bff465eeb2db783c9edbe728ed4
>>> Removing node c1a85083c96d2bff465eeb2db783c9edbe728ed4 from cluster 127.0.0.1:6608
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.
补充: 删除主节点与删除从节点的命令相同;但删除主节点有一个前提条件是它下面没槽位;即删除主节点前,需要先删除其下的槽位;
删除后的集群架构:
【4.5】主节点6607分配槽位
1)为主节点6607分配槽位(分配3000个槽位,把其他主节点的槽位剪切给6607)
redis-cli --cluster reshard 127.0.0.1:6607 --cluster-from 13f53bdd3bce98106ded4aed6b456496d58aaa00,d4a6ee7fe8a9d0e29465a1bc1b71083368a9c4c8,671876289bbf61375478c059800a654eaa79145e --cluster-to 65f73c9360ce01c48dfe8c35603fdd0bf6b30d6b --cluster-slots 3000
其中 13f53bdd3bce98106ded4aed6b456496d58aaa00,d4a6ee7fe8a9d0e29465a1bc1b71083368a9c4c8,671876289bbf61375478c059800a654eaa79145e 分别是6603, 6604, 6605主节点的hashid,65f73c9360ce01c48dfe8c35603fdd0bf6b30d6b是主节点6607的hashid;分配3000个槽位给6607
2)分配结果:
# 分配前
127.0.0.1:6605> cluster nodes
65f73c9360ce01c48dfe8c35603fdd0bf6b30d6b 127.0.0.1:6607@16607 master - 0 1733048209000 9 connected
...
# 分配后
127.0.0.1:6605> cluster nodes
65f73c9360ce01c48dfe8c35603fdd0bf6b30d6b 127.0.0.1:6607@16607 master - 0 1733048342084 9 connected 0-998 5461-6461 10923-11921
...
【4.6】主节点6607删除槽位/剪切槽位(分配槽位的逆向操作)
1)删除主节点6607的槽位(把6607的槽位分配给6604主节点,13f53bdd3bce98106ded4aed6b456496d58aaa00是6604主节点的hashid)
redis-cli --cluster reshard 127.0.0.1:6607 --cluster-from 65f73c9360ce01c48dfe8c35603fdd0bf6b30d6b --cluster-to 13f53bdd3bce98106ded4aed6b456496d58aaa00 --cluster-slots 3000
2)剪切槽位后的结果(6607的槽位全部剪切给了6604,且6607由主节点变更为从节点,其主节点为6604):
【5】参考资料
b站-centos7安装redis以及redis的集群配置
Redis从入门到放弃掘金