redis集群
本文最后更新于 2023-12-11,文章内容可能已经过时,请注意内容的辨别。
redis集群
集群模式
作用
集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。
集群由多个节点(Node)组成,Redis的数据分布在这些节点中。集群中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护;从节点只进行主节点数据和状态信息的复制。
集群的作用,可以归纳为两点:
1、数据分区:数据分区(或称数据分片)是集群最核心的功能。
集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。
Redis单机内存大小受限问题,在介绍持久化和主从复制时都有提及;例如,如果单机内存太大,bgsave和bgrewriteaof的fork操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出……。
2、高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似);当任一节点发生故障时,集群仍然可以对外提供服务。
关键字
分区 扩容 故障转移
搭建步骤
1.明确集群需要的实例端口 80 81 82 83 84 85 86 87 88
80-8182主从
83-8485主从
86-8788主从
无效明确,因为我们集群不主动去配置他的主从关系,而是交到我们redis本身去配置他的主从关系
2.删除rdb和aof文件
3.复制出多个redis配置文件更改配置信息,先配置一个,然后再复制
1).daemonize yes
2).修改pid文件名
3).指定端口号
4).修改log文件名字
5).修改dump文件名字
6).cluster-enabled yes 打开集群模式
7).cluster-config-file nodes-6380.conf 设定节点配置文件名
8.)cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换。
4.复制出另外8个文件,然后vim进去输入
:%s/6380/6381 //意思就是将文中所有的6379变成6380
5.按照redis文件启动9个服务
./redis-server ../redis-cluster-80.conf
.........
6.合并成集群
./redis-cli --cluster create xxx:6380 xxx:6381 xxx:6382 xxx:6383 xxx:6384 xxx:6385 xxx:6386 xxx:6387 xxx:6388 --cluster-replicas 2
//replicas 2 配置集群,一台主机,二台从机,正好三组。如果是云服务器最好不要用外网地址,用127.0.0.1,不然会出现故障转移失败的问题,如果你是本机的虚拟机就是这个操作,云服务器要考虑相关的内存大小和网络通信问题
[WARNING] Some slaves are in the same host as their master就对了,他在问你是不是要接受这样的主从分配 然后记住他给你分配的主节点 然后把这些节点端口都开开,在运行如上的命令再 输入yes回车就完事了 一定要输入yes 输入y是不行的
你还要把集群总线给暴露出来 就是你redis主机端口前面再加个1 比如说 6380 前面加个1 就是16380,要把这个端口暴露
總共要開的端口 如下
26380/tcp 6380/tcp 6381/tcp 6382/tcp 26379/tcp 6383/tcp 6384/tcp 6385/tcp 6386/tcp 6387/tcp 6388/tcp 16380/tcp 16381/tcp 16382/tcp
如果出现故障转移失败的现象,注意总线端口是否打开,比如说16380-16388都要开开
26380/tcp 6380/tcp 6381/tcp 6382/tcp 26379/tcp 6383/tcp 6384/tcp 6385/tcp 6386/tcp 6387/tcp 6388/tcp 16380/tcp 16381/tcp 16382/tcp 16383/tcp 16384/tcp 16385/tcp 16386/tcp 16387/tcp 16388/tcp
输出All 16384 slots covered.就行了
7.登录
redis-cli -p
这种方式不推荐使用,既然用了集群就要用集群的方式,用这种方式可能会出现error,(会出现MOVED重定向操作)
redis-cli -c -p
这种事真正集群使用的连接操作,他会切换到相应的主机
8.查看集群信息
cluster nodes
分配原则
一个集群至少要有三个主节点。
选项 --cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。
插槽
我们在之前会看到一个 All 16384 slots covered这个样的一个信息
这个其实就是告诉我们一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个键都属于这 16384 个插槽的其中一个,
集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。
集群中的每个节点负责处理一部分插槽。
举个例子, 如果一个集群可以有主节点, 其中:
节点 A 负责处理 0 号至 5460 号插槽。
节点 B 负责处理 5461 号至 10922 号插槽。
节点 C 负责处理 10923 号至 16383 号插槽。
集群插入值
在redis-cli每次录入、查询键值,redis都会计算出该key应该送往的插槽,如果不是该客户端对应服务器的插槽,redis会报错,并告知应前往的redis实例地址和端口。
redis-cli客户端提供了 –c 参数实现自动重定向。
如 redis-cli -c –p 6379 登入后,再录入、查询键值对可以自动重定向。
故障恢复
主节点下线,过一会你就能看到从机变成了主机了,后面主机回来了,他就变成从机了
Redis集群的不足
多键操作是不被支持的(mset mget 原因就是插槽的问题)
由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。但是随着时间的推移,这个不足将会慢慢褪去
springboot连接redis集群
就改配置文件
spring:
redis:
timeout: 30000
lettuce:
pool:
max-active: 256
max-idle: 64
max-wait: 30000
min-idle: 32
cluster:
max-redirects: 3 # 获取失败 最大重定向次数
nodes:
- xxx:6380
- xxx:6381
- xxx:6382
- xxx:6383
- xxx3:6384
- xxx:6385
- xxx:6386
- xxx:6387
- xxx:6388
server:
port: 8080
package s309.redisdemo1;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import s309.redisdemo1.until.RedisUtils;
@SpringBootTest
class Redisdemo1ApplicationTests {
@Autowired
private RedisUtils redisUtil;
@Test
void contextLoads() {
redisUtil.set("ssfdsf", "addsc");
System.out.println(redisUtil.get("ssfdsf"));
}
}
- 感谢你赐予我前进的力量