redis揭秘-redis01-redis单例与集群安装总结

news2024/12/26 19:23:56

文章目录

  • 【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 19 2024 redis-7.0.15
-rw-r--r--. 1 root root 2994329 1130 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从入门到放弃掘金

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2252113.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝牙定位的MATLAB仿真程序|基于信号强度的定位,平面、四个蓝牙基站(附源代码)

这段代码通过RSSI信号强度实现了蓝牙定位&#xff0c;展示了如何使用锚点位置和测量的信号强度来估计未知点的位置。它涵盖了信号衰减模型、距离计算和最小二乘法估计等基本概念。通过图形化输出&#xff0c;用户可以直观地看到真实位置与估计位置的关系。 文章目录 蓝牙定位原…

【网络篇】HTTP知识

键入网址到网页显示&#xff0c;期间发生了什么&#xff1f; 浏览器第一步是解析URL&#xff0c;这样就得到了服务器名称和文件的路径名&#xff0c;然后根据这些信息生成http请求&#xff0c;通过DNS查询得到我们要请求的服务器地址&#xff0c;然后添加TCP头、IP头以及MAC头&…

文件比较和文件流

文件比较和文件流 一、文本比较工具 diff1.基本用法1.1输出格式 2.常用选项 二、文件流1.文件的打开模式2.文件流的分类ifstreamofstreamfstrem区别 3.文件流的函数1. 构造函数2. is_open 用于判断文件是否打开3. open4. getline5. close6. get()7. read8. write9. put10. gcou…

使用ECharts创建带百分比标注的环形图

在数据可视化领域&#xff0c;环形图是一种非常有效的图表类型&#xff0c;它能够清晰地展示各部分与整体的关系。今天&#xff0c;我们将通过ECharts来创建一个带百分比标注的环形图&#xff0c;并详细解释如何实现这一效果。 1. 数据准备 首先&#xff0c;我们定义了一些基础…

win10环境mysql8.4免安装版配置

下载后解压 dos管理员&#xff0c;进入bin目录 mysqld -install net start mysql 出现错误&#xff0c;服务无法启动 MySQL 服务正在启动 . MySQL 服务无法启动。 服务没有报告任何错误。 请键入 NET HELPMSG 3534 以获得更多的帮助。 services.msc&#xff0c;查看服务…

时频转换 | Matlab基于S变换S-transform一维数据转二维图像方法

目录 基本介绍程序设计参考资料获取方式基本介绍 时频转换 | Matlab基于S变换S-transform一维数据转二维图像方法 程序设计 clear clc % close all load x.mat % 导入数据 x =

vue3项目中使用星火API

在node环境epxress中使用讯飞ai接口进行二次封装&#xff0c;通过ai对话回复提取&#xff0c;获得ai提取的文章摘要 本文章只是简单使用&#xff0c;更复杂功能比如调用星火API制作对话机器人可以查看文档&#xff0c;对于初次使用星火AI接口或许有帮助 讯飞星火大模型API-大模…

Leetcode - 周赛425

目录 一&#xff0c;3364. 最小正和子数组 二&#xff0c; 3365. 重排子字符串以形成目标字符串 三&#xff0c;3366. 最小数组和 四&#xff0c;3367. 移除边之后的权重最大和 一&#xff0c;3364. 最小正和子数组 本题可以直接暴力枚举&#xff0c;代码如下&#xff1a; …

linux系统信号简介

原文地址&#xff1a;linux系统信号简介 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 介绍 信号是一种重要的进程间通讯方式&#xff0c;这些信号有的有特定的用法&#xff0c;有的可作为扩展和自定义使用。并且大多数信号是可以被重新定义…

Linux 各个目录作用

刚毕业的时候学习Linux基础知识&#xff0c;发现了一份特别好的文档快乐的 Linux 命令行&#xff0c;翻译者是happypeter&#xff0c;作者当年也在慕课录制了react等前端相关的视频&#xff0c;通俗易懂&#xff0c;十分推荐 关于Linux的目录&#xff0c;多数博客已有详细介绍…

JavaScript对象笔记

JavaScript对象笔记 什么是JavaScript对象 JavaScript对象是一组键值对的集合&#xff0c;其中键是字符串&#xff08;通常是字符串&#xff0c;但也可以是符号&#xff09;&#xff0c;值可以是任何数据类型。 特点 动态性&#xff1a;可以在运行时添加、删除或更改属性。灵…

如何快速使用Unity 的UPR---1资源检测保姆级

关于我们的性能检测工具已经有很多了&#xff0c;比如UWA的或者是我们的Unity 的UPR 都是很好的&#xff0c;今天说一下UPR吧 官方网址 &#xff1a;UPR - Unity专业性能优化工具 这个是官方给的Demo 选择你的平台就可以 这个可以作为一个参考但是不是很建议用官方的因为我们…

Qt桌面应用开发 第九天(综合项目一 飞翔的鸟)

目录 1.鸟类创建 2.鸟动画实现 3.鼠标拖拽 4.自动移动 5.右键菜单 6.窗口透明化 项目需求&#xff1a; 实现思路&#xff1a; 创建项目导入资源鸟类创建鸟动画实现鼠标拖拽实现自动移动右键菜单窗口透明化 1.鸟类创建 ①鸟类中包含鸟图片、鸟图片的最小值下标和最大值…

【实体配置】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

Pytorch-GPU版本离线安装

最近在复现一项深度学习的工作&#xff0c;发现自己的pytorch是装的cpu版的(好像当时是直接加清华源&#xff0c;默认是cpu版本&#xff09;。从官网在线下载速度太慢&#xff0c;还时不时断开连接&#xff0c;我们可以配置conda的清华源去这个问题&#xff0c;但是考虑到是在用…

聊聊Flink:这次把Flink的触发器(Trigger)、移除器(Evictor)讲透

一、触发器(Trigger) Trigger 决定了一个窗口&#xff08;由 window assigner 定义&#xff09;何时可以被 window function 处理。 每个 WindowAssigner 都有一个默认的 Trigger。 如果默认 trigger 无法满足你的需要&#xff0c;你可以在 trigger(…) 调用中指定自定义的 tr…

[Redis#12] 常用类型接口学习 | string | list

目录 0.准备 1.string get | set set_with_timeout_test.cpp set_nx_xx_test.cpp mset_test.cpp mget_test.cpp getrange_setrange_test.cpp incr_decr_test.cpp 2.list lpush_lrange_test.cpp rpush_test.cpp lpop_rpop_test.cpp blpop_test.cpp llen_test.cpp…

网络安全之IP伪造

眼下非常多站点的涉及存在一些安全漏洞&#xff0c;黑客easy使用ip伪造、session劫持、xss攻击、session注入等手段危害站点安全。在纪录片《互联网之子》&#xff08;建议搞IT的都要看下&#xff09;中。亚伦斯沃茨&#xff08;真实人物&#xff0c;神一般的存在&#xff09;涉…

Spring Web开发(请求)获取JOSN对象| 获取数据(Header)

大家好&#xff0c;我叫小帅今天我们来继续Spring Boot的内容。 文章目录 1. 获取JSON对象2. 获取URL中参数PathVariable3.上传⽂件RequestPart3. 获取Cookie/Session3.1 获取和设置Cookie3.1.1传统获取Cookie3.1.2简洁获取Cookie 3. 2 获取和存储Session3.2.1获取Session&…

(SAST检测规则-1)Android - 权限管理漏洞

所属分类&#xff1a;Android - 权限管理漏洞缺陷详解&#xff1a;应用未正确实施最小权限原则或滥用已声明的权限可能导致敏感信息泄露。例如&#xff0c;恶意代码利用已授予的权限绕过用户授权&#xff0c;访问通讯录、位置、短信等敏感资源。部分开发者还可能滥用权限以执行…