当前位置: 首页 > news >正文

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-serverINSTALL redis-benchmarkINSTALL 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.confport 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:6601slots:[0-5460] (5461 slots) master1 additional replica(s)
M: 671876289bbf61375478c059800a654eaa79145e 127.0.0.1:6603slots:[10923-16383] (5461 slots) master1 additional replica(s)
S: 13f53bdd3bce98106ded4aed6b456496d58aaa00 127.0.0.1:6604slots: (0 slots) slavereplicates 738ab432123c70b98e07d01502609c5a25b4111e #6601
M: eed20f0f41004059789cc3f15ab84a344885cc3a 127.0.0.1:6602slots:[5461-10922] (5462 slots) master1 additional replica(s)
S: 74bedd0c81b38f92a776cf09630e3d32688fff50 127.0.0.1:6606slots: (0 slots) slavereplicates 671876289bbf61375478c059800a654eaa79145e #6603
S: d4a6ee7fe8a9d0e29465a1bc1b71083368a9c4c8 127.0.0.1:6605slots: (0 slots) slavereplicates 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;写操作是正常的
OK127.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从入门到放弃掘金

相关文章:

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

文章目录 【README】【1】安装单机【1.1】安装环境【1.2】安装步骤 【2】redis集群主从模式配置【2.1】集群架构【2.2】redis集群主从模式搭建步骤【2.3】redis集群主从模式的问题&#xff08;单点故障问题&#xff09; 【3】redis集群哨兵模式配置【3.1】集群架构【3.2】redis…...

mini-spring源码分析

IOC模块 关键解释 beanFactory&#xff1a;beanFactory是一个hashMap, key为beanName, Value为 beanDefination beanDefination: BeanDefinitionRegistry&#xff0c;BeanDefinition注册表接口&#xff0c;定义注册BeanDefinition的方法 beanReference&#xff1a;增加Bean…...

RVO动态避障技术方案介绍

原文&#xff1a;RVO动态避障技术方案介绍 - 哔哩哔哩 我们在开发游戏的时候经常会遇到这样的问题&#xff0c;当我们寻路的时候&#xff0c;其它人也在寻路&#xff0c;如何避免不从其它人的位置穿过。这个叫做动态避障&#xff0c;目前主流的解决方案就是RVO。本节我们来介绍…...

HTML CSS JS基础考试题与答案

一、选择题&#xff08;2分/题&#xff09; 1&#xff0e;下面标签中&#xff0c;用来显示段落的标签是&#xff08; d &#xff09;。 A、<h1> B、<br /> C、<img /> D、<p> 2. 网页中的图片文件位于html文件的下一级文件夹img中&#xff0c;…...

【C语言】二叉树(BinaryTree)的创建、3种递归遍历、3种非递归遍历、结点度的实现

代码主要实现了以下功能&#xff1a; 二叉树相关数据结构定义 定义了二叉树节点结构体 BiTNode&#xff0c;包含节点数据值&#xff08;字符类型&#xff09;以及指向左右子树的指针。 定义了顺序栈结构体 SqStack&#xff0c;用于存储二叉树节点指针&#xff0c;实现非递归遍历…...

MySQL Workbench 数据库建模详解:从设计到实践

目录 数据库建模基础概念MySQL Workbench 简介与安装 什么是 MySQL Workbench&#xff1f;安装与环境配置 MySQL Workbench 数据库建模功能详解 EER 图&#xff08;实体关系图&#xff09;数据库反向工程数据库正向工程模型同步与版本管理 MySQL Workbench 数据库建模实战教程…...

【字体】Fire Code连字效果开启

Vscode 开启方法 1、设置字体Fire Code 放在最前面的即可&#xff1a; 2、启用连字 继续往下找到“在 settings.json 中编辑”&#xff0c;然后设置"editor.fontLigatures": true &#xff1a; 保存即可。 Sublime 开启方法 设置中设置字体后&#xff0c;启…...

springboot kafka在kafka server AUTH变动后consumer自动销毁

前言 笔者使用了kafka用来传输数据&#xff0c;笔者在今年10月写了文章&#xff0c;怎么使用配置化实现kafka的装载&#xff1a;springboot kafka多数据源&#xff0c;通过配置动态加载发送者和消费者-CSDN博客 不过在实际运行中&#xff0c;kafka broker是加密的&#xff0c…...

第六届国际科技创新(IAECST 2024)暨第四届物流系统与交通运输(LSTT 2024)

重要信息 会议官网&#xff1a;www.lstt.org 大会时间&#xff1a;2024年12月6-8日 大会地点&#xff1a;中国-广州 简介 第六届国际科技创新暨第四届物流系统与交通运输国际&#xff08;LSTT 2024&#xff09;将于2024年12月6-8日在广州举办&#xff0c;这是一个集中探讨…...

【Vue3】【Naive UI】< a >标签

【Vue3】【Naive UI】< a >标签 超链接及相关属性其他属性 【VUE3】【Naive UI】&#xff1c;NCard&#xff1e; 标签 【VUE3】【Naive UI】&#xff1c;n-button&#xff1e; 标签 【VUE3】【Naive UI】&#xff1c;a&#xff1e; 标签 <a> 标签HTML中的一个锚&…...

Fortran mpi在Linux的安装

最近编译一个程序需要需要 Fortran mpi 编译器&#xff0c;则需要安装 Fortran编辑器和MPI库&#xff0c;以下是具体的安装步骤&#xff1a; 一、安装 Fortran 编译器&#xff08;gfortran&#xff09; 在conda环境中安装&#xff1a; conda install -c conda-forge gfortra…...

蓝桥-希尔排序模板题

第一眼看到这个题还在想希尔排序模板不记得了&#xff0c;于是去网上了搜了一个&#xff0c;但是考虑到这种题只看测试点能不能通过&#xff0c;于是用Arrays方法试了一下&#xff0c;发现也可以。 1.希尔排序模板ac代码 package yunkePra;import java.util.Scanner;public cl…...

深入学习指针(5)!!!!!!!!!!!!!!!

文章目录 1.回调函数是什么&#xff1f;2.qsort使用举例2.1使用qsort函数排序整形数据2.2使用sqort排序结构数据 3.qsort函数的模拟实现 1.回调函数是什么&#xff1f; 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递…...

windows 应用 UI 自动化实战

UI 自动化技术架构选型 UI 自动化是软件测试过程中的重要一环&#xff0c;网络上也有很多 UI 自动化相关的知识或资料&#xff0c;具体到 windows 端的 UI 自动化&#xff0c;我们需要从以下几个方面考虑&#xff1a; 开发语言 毋庸置疑&#xff0c;在 UI 自动化测试领域&am…...

nodejs相关知识介绍

1、nodejs官方文档&#xff1a; https://nodejs.org/zh-cn nodejs可以用nvm进入安装&#xff1b; 2、npm说明&#xff1a; npm官方教程&#xff1a;https://npm.p2hp.com/ npm是 Node.js 的标准包管理器&#xff0c;也就是说nodejs安装好&#xff0c;npm也就安装好了&#…...

How to monitor Spring Boot apps with the AppDynamics Java Agent

本文介绍如何使用 AppDynamics Java 代理监视 Azure Spring Apps 中的 Spring Boot 应用程序。 使用 AppDynamics Java 代理可以&#xff1a; 监视应用程序使用环境变量配置 AppDynamics Java 代理 在 AppDynamics 仪表板中检查所有监视数据 How to monitor Spring Boot app…...

安装SQL Server 2022提示需要Microsoft .NET Framework 4.7.2 或更高版本

安装SQL Server 2022提示需要Microsoft .NET Framework 4.7.2 或更高版本。 原因是&#xff1a;当前操作系统版本为Windows Server 2016 Standard版本&#xff0c;其自带的Microsoft .NET Framework 版本为4.6太低&#xff0c;不满足要求。 根据报错的提示&#xff0c;点击链接…...

TypeScript核心语法(5)——函数

简介​ 函数的类型声明&#xff0c;需要在声明函数时&#xff0c;给出参数的类型和返回值的类型。 function hello(a: string): void {console.log("hello " txt); } 上面示例中&#xff0c;函数hello()在声明时&#xff0c;需要给出参数a的类型&#xff08;stri…...

【MyBatis】验证多级缓存及 Cache Aside 模式的应用

文章目录 前言1. 多级缓存的概念1.1 CPU 多级缓存1.2 MyBatis 多级缓存 2. MyBatis 本地缓存3. MyBatis 全局缓存3.1 MyBatis 全局缓存过期算法3.2 CacheAside 模式 后记MyBatis 提供了缓存切口&#xff0c; 采用 Redis 会引入什么问题&#xff1f;万一遇到需强一致场景&#x…...

ARIMA-神经网络混合模型在时间序列预测中的应用

ARIMA-神经网络混合模型在时间序列预测中的应用 1. 引言 1.1 研究背景与意义 时间序列预测在现代数据科学中扮演着越来越重要的角色。从金融市场的价格走势到工业生产的需求预测,从气象数据的天气预报到用电量的负荷预测,时间序列分析无处不在。传统的统计方法和现代深度学习…...

Scala关于成绩的常规操作

score.txt中的数据&#xff1a; 姓名&#xff0c;语文&#xff0c;数学&#xff0c;英语 张伟&#xff0c;87&#xff0c;92&#xff0c;88 李娜&#xff0c;90&#xff0c;85&#xff0c;95 王强&#xff0c;78&#xff0c;90&#xff0c;82 赵敏&#xff0c;92&#xff0c;8…...

【Maven】项目创建

3. Maven的应用 本章主要内容&#xff1a; 使用 Maven 创建 JavaSE 项目使用 Maven 创建 JavaWeb 项目&#xff0c;在本地部署 Tomcat 测试导入 Maven 项目 3.1 基于Maven开发JavaSE的项目 3.1.1 流程 1、File—>new—>Project—>Empty Project Location&#xff1…...

基于 LlamaFactory 的 LoRA 微调模型支持 vllm 批量推理的实现

背景 LlamaFactory 的 LoRA 微调功能非常便捷&#xff0c;微调后的模型&#xff0c;没有直接支持 vllm 推理&#xff0c;故导致推理速度不够快。 LlamaFactory 目前支持通过 VLLM API 进行部署&#xff0c;调用 API 时的响应速度&#xff0c;仍然没有vllm批量推理的速度快。 …...

Vue进阶之单组件开发与组件通信

书接上篇&#xff0c;我们了解了如何快速创建一个脚手架&#xff0c;现在我们来学习如何基于vite创建属于自己的脚手架。在创建一个新的组件时&#xff0c;要在新建文件夹中打开终端创建一个基本的脚手架&#xff0c;可在脚手架中原有的文件中修改或在相应路径重新创建&#xf…...

HCIE IGP双栈综合实验

实验拓扑 实验需求及解法 本实验模拟ISP网络结构&#xff0c;R1/2组成国家骨干网&#xff0c;R3/4组成省级网络&#xff0c;R5/6/7组成数据中 心网络。 配置所有ipv4地址&#xff0c;请自行测试直连。 R1 sysname R1 interface GigabitEthernet0/0/0ip address 12.1.1.1 255.…...

Unity 超链接文本类

注&#xff1a;该脚本在文本显示不全时会有问题。 HyperlinkText.cs using System; using System.Text; using System.Collections.Generic; using System.Text.RegularExpressions; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems;namespace MYT…...

Vim小白学习指南

博客 Vim编辑器简介 Vim是一个非常高效的文本编辑器&#xff0c;最初源于Vi编辑器。它以其强大的文本编辑能力和快捷键而闻名于程序员和系统管理员。Vim的特别之处在于它提供了多种模式&#xff0c;每种模式都有不同的功能。 Vim的基本模式 1. 普通模式&#xff08;Normal …...

【微服务】Nacos配置管理

一、统一配置管理 1、配置统一管理 2、微服务获取配置 ①引入Nacos的配置管理客户端依赖(usersevice下) <!--nacos的配置管理依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-confi…...

从单机缓存到分布式缓存那些事

作者&#xff1a;秦怀 1 缓存前世今生 1.1 故事从硬件开始 Cache 一词来源于 1967 年的一篇电子工程期刊论文。其作者将法语词“cache”赋予“safekeeping storage”的涵义&#xff0c;用于电脑工程领域。当时没有 Cache&#xff0c;CPU 和内存都很慢&#xff0c;CPU 直接访…...

华为新手机和支付宝碰一下 带来更便捷支付体验

支付正在变的更简单。 11月26日&#xff0c;华为新品发布会引起众多关注。发布会上&#xff0c;华为常务董事余承东专门提到&#xff0c;华为Mate 70和Mate X6折叠屏手机的“独门支付秘技”——“碰一下”&#xff0c;并且表示经过华为和支付宝的共同优化&#xff0c;使用“碰…...

element ui select绑定的值是对象的属性时,显示异常.

需要声明 value-key"value",如果还不行可能是数据类型不一致数字0和字符串0是不一致的. el-select v-model"value" clearable placeholder"Select" value-key"value" style"width: 240px"><!-- <el-option v-for&…...

基于Springboot开发的时光兼职网

一、功能介绍 时光兼职网包含管理员、用户、商家三个角色以及前后台系统。 前台系统功能 首页、兼职信息推荐、查看更多等 职位申请、申请日期、上传简历、点击下载简历、留言反馈等 个人中心、上传图片、更新信息等 后台系统功能 用户登录&#xff1a; 个人中心、修改密码…...

Vue3 Ts 如何获取组件的类型

vue3 Ts ref 子组件 1、默认写法 typeof&#xff1a;获取ts类型 InstanceType&#xff1a;获取模版的实例 <tempolate><myComponent ref"myCompRef"> </tempolate><script setup lang"ts"> import { ref } from "vue&quo…...

Unity类银河战士恶魔城学习总结(P146 Delete Save file-P147 Encryption of save data删除数据和加密数据)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了快速删除存档和加密存档 以下是加密前和加密后的对比 SaveManager.cs using System.Collections; using System.Collection…...

Uniapp 使用自定义字体

技术栈&#xff1a;Uniapp 简介 为了更好的还原UI图片效果&#xff0c;往往需要使用特殊字体&#xff0c;引入字体包。 因实际业务运行平台在微信小程序上&#xff0c;对发布包的项目文件大小有限制&#xff0c;项目中某些比较大的静态资源需要放在服务器上来远程加载&#x…...

Scala

统计成绩练习 1.计算每个同学的总分和平均分 2.统计每个科目的平均分 3.列出总分前三名和单科前三名&#xff0c;并保存结果到文件中 解题思路如下&#xff1a; 1.读入txt文件&#xff0c;按行读入 2.处理数据 &#xff08;1&#xff09;计算每个同学的总分…...

fnOS中安装HAOS,集成haier

只作为自己记录重要事项&#xff0c;不做详细教程。大致流程 安装飞牛OS&#xff0c;简称fnosfnos中有集成Docker在docker中安装haos在haos中安装hacs在hacs中添加haier 在docker中安装haos 安装好fnos后&#xff0c;docker里面找到haos&#xff0c;里面下载最多的&#xff0c…...

基于群晖搭建个人图书架-TaleBook based on Docker

前言 在群晖Container Manager中部署失败&#xff0c;转通过ssh部署。 一、准备工作 名称备注群晖SSH“终端机和SNMP”中启用SSH软件secureCRT等docker-compose.ymlGithub下载并修改 二、过程 2.1 创建本地文件夹 本地路径为&#xff1a; /docker/Calibre/data 2.2 下载d…...

spring导出多个文件,要求打包成压缩包

背景 业务要求我们批量生成一批excel&#xff0c;并将这些excel压缩成一个压缩包导出给前端。 实现 java自带了ZipOutputStream&#xff0c;可以直接生成压缩包&#xff0c;因此&#xff0c;我们直接使用这个&#xff0c;在内存中生成压缩包&#xff0c;直接返回给前端。&am…...

Vue 3中实现多个自定义组件之间的切换

在 Vue 3 中&#xff0c;如果你想在 HTML 页面中实现多个自定义组件之间的切换&#xff0c;你可以使用 Vue 的条件渲染功能&#xff0c;比如 v-if、v-else-if 和 v-else 指令&#xff0c;或者使用 <component> 标签结合 is 属性来动态绑定组件。 1. 打开HBuilder X 图1 …...

opengl 三角形

最后效果&#xff1a; OpenGL version: 4.1 Metal 不知道为啥必须使用VAO 才行。 #include <glad/glad.h> #include <GLFW/glfw3.h>#include <iostream> #include <vector>void framebuffer_size_callback(GLFWwindow *window, int width, int heigh…...

shell脚本练习(2)

1. 使用case实现成绩优良差的判断 2. for创建20用户 用户前缀由用户输入 用户初始密码由用户输入 例如&#xff1a;test01,test10 3. for ping测试指网段的主机 网段由用户输入&#xff0c;例如用户输入192.168.2 &#xff0c;则ping 192.168.2.10 --- 192.168.2.2…...

JS数组的一些方法

前言 忘了在哪里听说JS是用来处理各种各样的数据的&#xff0c;所以掌握一些数组的处理方法极其重要 而最近学校要进行测试&#xff0c;本着复习回顾的想法&#xff0c;决定将一些我所知道的数组处理方法整理整理 不过难免有遗漏与错误&#xff0c;还望各位大佬指正 forEac…...

学习threejs,使用CubeCamera相机创建反光效果

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️CubeCamera 立方体相机 二、…...

#渗透测试#红蓝攻防#HW#漏洞挖掘#漏洞复现01-笑脸漏洞(vsftpd)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

使用nginx请求转发时前端报跨域问题解决

当其他接口都没有问题&#xff0c;后端也进行了跨域的配置时&#xff0c;此时问题应该就出现在nginx中 我发现当上传文件大小小于1m时并不会发生错误&#xff0c;所以我们应该配置一下nginx允许上传文件的大小 在nginx.conf中添加 在nginx目录下重启nginx即可 &#xff08;Wi…...

贪心算法入门(二)

第1题 越野跑 查看测评数据信息 为了能在下一次跑步比赛中有好的发挥&#xff0c;桐桐在一条山路上开始了她的训练 。桐桐希望能在每次训练中跑得尽可能远&#xff0c;不过她也知道农场中的一条规定&#xff1a;独自进山的时间不得超过M秒(1 < M < 10,000,000)。 整条…...

欧拉函数——acwing

题目一&#xff1a;欧拉函数 873. 欧拉函数 - AcWing题库 分析&#xff08;欧拉函数相关知识点&#xff09; 互质数不了解可以参考之前笔记&#xff0c;以便更好了解&#xff1a; 数论—快速幂&#xff0c;欧几里得及其扩展&#xff0c;逆元&#xff0c;单位元_数论单位元函…...

Spring集成Mybatis的实现

实现步骤大纲 第一步&#xff1a;准备数据库表 使用t_act表&#xff08;账户表&#xff09; 第二步&#xff1a;IDEA中创建一个模块&#xff0c;并引入依赖 spring-contextspring-jdbcmysql驱动mybatismybatis-spring&#xff1a;mybatis提供的与spring框架集成的依赖德鲁伊连…...

Redis中的分布式锁(步步为营)

分布式锁 概述 分布式锁指的是&#xff0c;所有服务中的所有线程都去获取同一把锁&#xff0c;但只有一个线程可以成功的获得锁&#xff0c;其他没有获得锁的线程必须全部等待&#xff0c;直到持有锁的线程释放锁。 分布式锁是可以跨越多个实例&#xff0c;多个进程的锁 分布…...