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 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从入门到放弃掘金

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

构建高可用系统设计OpenStack、Docker、Mesos和Kubernetes(简称K8s)

如果构建高可用、高并发、高效运维的大型系统 大型系统架构设计包括业务层设计、服务层设计、基础架层设计、存储层设计、网络层协同设计来完成。 一、业务层 根据主要业务范畴的分类和特征提取&#xff0c;抽象出独立的业务系统&#xff0c;分别统计系统的用户角色群体、访…

mrRobot解题过程

一、靶场环境需要桥接网络 不建议使用校园网&#xff0c;因为使用校园网进行主机探索的时候会出现数不完的主机。 arp-scan -l若是流量少只能用校园网&#xff0c;便在这里看靶机ip 二、端口扫描 我习惯用fscan了&#xff08;需要自己安装&#xff09;&#xff0c;你们用nma…

解决“ VMware Tools for Windows Vista and later“报错问题

今天&#xff0c;在Win7虚拟机上安装VMware Tools&#xff0c;报"VMware Tools for Windows Vista and later"证书错误&#xff0c;如图(1)所示&#xff1a; 图(1) 虚拟机报" VMware Tools for Windows Vista and later"证书错误 问题原因&#xff1a;VMwa…

C-操作符

操作符种类 在C语言中&#xff0c;操作符有以下几种&#xff1a; 算术操作符 移位操作符 位操作符 逻辑操作符 条件操作符 逗号表达式 下标引用&#xff0c;函数调用 拓展&#xff1a;整型提升 我们介绍常用的几个 算术操作符 &#xff08;加&#xff09;&#xff…

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

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

物联网——WatchDog(监听器)

看门狗简介 独立看门狗框图 看门狗原理&#xff1a;定时器溢出&#xff0c;产生系统复位信号&#xff1b;若定时‘喂狗’则不产生系统复位信号 定时中断基本结构&#xff08;对比&#xff09; IWDG键寄存器 独立看门狗超时时间 WWDG(窗口看门狗) WWDG特性 WWDG超时时间 由于…

Socket编程:UDP网络编程项目

目录 一、回显服务器 二、翻译器 三、聊天室 一、回显服务器 项目介绍&#xff1a;使用UDPIPv4协议进行Linux网络编程&#xff0c;实现回显服务器和客户端 功能介绍&#xff1a;客户端发送数据&#xff0c;经过服务端再返回到客户端&#xff0c;输出数据 源代码&#xff1…

Hbase2.2.7集群部署

环境说明 准备三台服务器&#xff0c;分别为&#xff1a;bigdata141&#xff08;作为Hbase主节点&#xff09;、bigdata142、bigdata143确保hadoop和zookeeper集群都先启动好我这边的hadoop版本为3.2.0&#xff0c;zookeeper版本为3.5.8 下载安装包 下载链接&#xff1a;In…

STM32 BootLoader 刷新项目 (十二) Option Byte之FLASH_OPTCR-命令0x58

STM32 BootLoader 刷新项目 (十二) Option Byte之FLASH_OPTCR-命令0x58 STM32F407芯片的OPTION Byte全面解析 STM32F407芯片是STMicroelectronics推出的一款功能强大的微控制器&#xff0c;广泛应用于工业控制、通信和消费电子等领域。其中&#xff0c;OPTION Byte&#xff0…

Matlab 绘制雷达图像完全案例和官方教程(亲测)

首先上官方教程链接 polarplothttps://ww2.mathworks.cn/help/matlab/ref/polarplot.html 上实例 % 定义角度向量和径向向量 theta linspace(0, 2*pi, 5); r1 [1, 2, 1.5, 2.5, 1]; r2 [2, 1, 2.5, 1.5, 2];% 绘制两个雷达图 polarplot(theta, r1, r-, LineWidth, 2); hold …

【C/C++】内存管理详解:从new/delete到智能指针的全面解析

文章目录 更多文章C/C中的传统内存管理方式new和delete运算符malloc和free函数传统内存管理的弊端 智能指针的崛起智能指针的定义与作用C11引入的标准智能指针 详解C标准智能指针std::unique_ptr特点使用方法适用场景 std::shared_ptr特点使用方法适用场景 std::weak_ptr特点使…

Python实现2048小游戏

2048是一个单人益智游戏&#xff0c;目标是移动和合并数字&#xff0c;以达到2048。 1. 实现效果 Python实现2048小游戏 2. 游戏规则 简单地理解一下规则 基本规则&#xff1a; 4x4棋盘&#xff0c;每个格可包含一个2的倍数的数字&#xff0c;初始时为空&#xff0c;表示0。…

Wireshark常用功能使用说明

此处用于记录下本人所使用 wireshark 所可能用到的小技巧。Wireshark是一款强大的数据包分析工具&#xff0c;此处仅介绍常用功能。 Wireshark常用功能使用说明 1.相关介绍1.1.工具栏功能介绍1.1.1.时间戳/分组列表概况等设置 1.2.Windows抓包 2.wireshark过滤器规则2.1.wiresh…

像素流送api ue多人访问需要什么显卡服务器

关于像素流送UE推流&#xff0c;在之前的文章里其实小芹和大家聊过很多&#xff0c;不过今天偶然搜索发现还是有很多小伙伴&#xff0c;在搜索像素流送相关的问题&#xff0c;搜索引擎给的提示有这些。当然这些都是比较短的词汇&#xff0c;可能每个人真正遇到的问题和想获取的…

基于Vue3+Element Plus 实现多表单校验

使用场景 表单校验在日常的开发需求中是一种很常见的需求&#xff0c;通常在提交表单发起请求前校验用户输入是否符合规则&#xff0c;通常只需formRef.value.validate()即可校验&#xff0c;但是&#xff0c;例如一些多步骤表单、动态表单、以及不同的用户角色可能看到不同的表…

ONVIF协议网络摄像机客户端使用gsoap获取RTSP流地址GStreamer拉流播放

什么是ONVIF协议 ONVIF&#xff08;开放式网络视频接口论坛&#xff09;是一个全球性的开放式行业论坛&#xff0c;旨在促进开发和使用基于物理IP的安全产品接口的全球开放标准。 ONVIF规范的目标是建立一个网络视频框架协议&#xff0c;使不同厂商生产的网络视频产品完全互通。…

【Datawhale组队学习】模型减肥秘籍:模型压缩技术6——项目实践

NNI (Neural Network Intelligence) 是由微软开发的一个开源自动化机器学习&#xff08;AutoML&#xff09;库&#xff0c;用于帮助研究人员和开发人员高效地进行机器学习实验。它提供了一套丰富的工具来进行模型调优、神经网络架构搜索、模型压缩以及自动化的超参数搜索。 1…

通讯专题4.1——CAN通信之计算机网络与现场总线

从通讯专题4开始&#xff0c;来学习CAN总线的内容。 为了更好的学习CAN&#xff0c;先从计算机网络与现场总线开始了解。 1 计算机网络体系的结构 在我们生活当中&#xff0c;有许多的网络&#xff0c;如交通网&#xff08;铁路、公路等&#xff09;、通信网&#xff08;电信、…

【51单片机】程序实验910.直流电机-步进电机

主要参考学习资料&#xff1a;B站【普中官方】51单片机手把手教学视频 前置知识&#xff1a;C语言 单片机套装&#xff1a;普中STC51单片机开发板A4标准版套餐7 码字不易&#xff0c;求点赞收藏加关注(•ω•̥) 有问题欢迎评论区讨论~ 目录 程序实验9&10.直流电机-步进电机…

Qt支持RKMPP硬解的视频监控系统/性能卓越界面精美/实时性好延迟低/录像存储和回放/云台控制

一、前言 之前做的监控系统&#xff0c;已经实现了在windows上硬解码比如dxva2和d3d11va&#xff0c;后续又增加了linux上的硬解vdpau的支持&#xff0c;这几种方式都是跨系统的硬解实现方案&#xff0c;也是就是如果都是windows系统&#xff0c;无论X86还是ARM都通用&#xf…