redis无中心化高可用集群部署(cluster模式)并集成SpringBoot
1、redis集群部署(cluster模式)2、redis集群部署3、redis无中心化集群部署4、redis cluster模式部署5、SpringBoot集成redis集群cluster模式6、SpringBoot集成redis集群
1、部署架构模式:
部署方式采用的Redis Cluster是Redis的亲儿子,是Redis作者自己提供的Redis集群化方案,从Redis3.0版本开始正式提供。
redis cluster主要是针对海量数据+高并发+高可用的场景,海量数据,如果你的数据量很大,那么建议就用redis cluster,数据量不是很大时,使用sentinel就够了。redis cluster的性能和高可用性均优于哨兵模式。
集群部署至少要 3 台以上的master节点,最好使用 3 主 3 从六个节点的模式
集群由多个Redis主从组成,每一个节点代表一个主从,每个节点负责一部分数据,他们之间通过一种特殊的二进制协议交互集群信息。
Redis Cluster将所有数据分片,分成16384个槽位,Redis Cluster对key值使用crc16算法进行hash,然后用除留余数发模除16384得到具体的槽位,每个节点负责其中一部分槽位。
当客户端连接集群,会得到一份集群的槽位匹配信息,当客户端要查找key,可以直接定位到目标节点。
Cluster去中心化,由多个节点组成,客户端连接时可以只用一个节点的地址,其余节点可通过该节点自动发现,但如果该节点挂了,就必须手动更换地址,因此连接多个地址安全性更高。
容错机制:
Redis Cluster拥有类似哨兵的功能,每个节点仍需设置若干从节点,主节点发生故障,集群可将slave升级为master;否则如果master挂了,集群完全不可用;
且Redis Cluster是去中心化,集群内某个节点不可用时,一个节点认为他失联并不代表所以节点都认为他失联,集群要进行一次商议,只有大多数节点认为他失联,才会认为其需要主从切换来容错。
支持动态扩容:
假如原先集群中有3个节点,一共3000个数据,可能1-1000在第一个节点,1001-2000在第二个节点,2001-3000在第三个节点。
当新节点加入集群,需要手动将槽和数据迁移到新节点,可以使用redis-trib工具或手动命令迁移。
优缺点:
优点
无中心架构,支持动态扩容
Cluster自动具备哨兵监控和故障转移(主从切换)能力
客户端连接集群内部地址可自动发现
高性能、高可用,有效解决了Redis分布式需求
缺点
运维复杂
接下来进行集群部署及配置:
以下以cluster为实例,官方最小集群必须至少包含三个主节点。本次部署,我们使用六节点集群,三主三副本。
本人redis使用redis-6.2.6版本安装在data目录下。
2、安装完后进入redis安装目录下创建创建6个节点配置文件存放文件夹,目录以实例的端口号命名并配置redis.conf文件。
cd /data/redis-6.2.6
mkdir cluster-test
cd cluster-test
mkdir 7000 7001 7002 7003 7004 7005
在每个目录中创建一个redis.conf文件,从 7000 到 7005。作为配置文件的模板,每个配置文件区别在于port,pidfile,dir,cluster-config-file这几个节点值不一样。
redis.conf配置文件中信息如下:
# 监听端口
port 7000
# 是否开启保护模式,默认只允许本机访问,把 bind 修改为 0.0.0.0 表示允许所有远程访问。如果想指定限制访问,可设置对应的 ip。
bind 0.0.0.0# 作为守护程序运行,设置为后台启动。
appendonly yes# 设置密码
requirepass 123456
# 当 master 服务设置了密码保护时,slave 服务连接 master 的密码
masterauth 123456
# 这是设置是否后台启动 Redis,默认 no ,但是生产环境肯定要默认就开启 Redis,所以这里设置为 yes 。
daemonize yes
# PID文件,修改对应的端口
pidfile /data/redis-6.2.6/cluster-test/7000/redis_7000.pid
# 数据文件存放位置,我换成指定目录下存放
dir /data/redis-6.2.6/cluster-test/7000/
# 启动集群模式
cluster-enabled yes
# 加载持久化集群配置文件,修改对应的端口
cluster-config-file nodes_7000.conf
# 超时时间
cluster-node-timeout 5000
3、启动各服务
按如下方式启动每个实例,每个实例都将在在单独的终端中运行:
/data/redis-6.2.6/src/redis-server /data/redis-6.2.6/cluster-test/7000/redis.conf
/data/redis-6.2.6/src/redis-server /data/redis-6.2.6/cluster-test/7001/redis.conf
/data/redis-6.2.6/src/redis-server /data/redis-6.2.6/cluster-test/7002/redis.conf
/data/redis-6.2.6/src/redis-server /data/redis-6.2.6/cluster-test/7003/redis.conf
/data/redis-6.2.6/src/redis-server /data/redis-6.2.6/cluster-test/7004/redis.conf
/data/redis-6.2.6/src/redis-server /data/redis-6.2.6/cluster-test/7005/redis.conf
5、初始创建集群
现在我们有6实例正在运行,我们需要通过向节点写入一些配置来创建我们的集群,要创建集群,请运行以下命令:
redis-cli --cluster create 192.168.43.58:7000 192.168.43.58:7001 192.168.43.58:7002 192.168.43.58:7003 192.168.43.58:7004 192.168.43.58:7005 --cluster-replicas 1
cluster-replicas 1 表示1主1从,前3个为主节点
进入redis中查看状态
redis-cli -c -h 192.168.43.58 -p 7000
cluster info
6、集群测试:
设置值
192.168.43.58:7000> set foo bar
-> Redirected to slot [12182] located at 192.168.43.58:7002
OK
192.168.43.58:7002> set name wly
-> Redirected to slot [5798] located at 192.168.43.58:7001
OK
192.168.43.58:7001> set gender 女
-> Redirected to slot [15355] located at 192.168.43.58:7002
OK
获取值:
192.168.43.58:7000> get foo
-> Redirected to slot [12182] located at 192.168.43.58:7002
"bar"
192.168.43.58:7002> get name
-> Redirected to slot [5798] located at 192.168.43.58:7001
"wly"
192.168.43.58:7001> get gender
-> Redirected to slot [15355] located at 192.168.43.58:7002
"\xe5\xa5\xb3"
7、Springboot集成redis集群配置方式
application.yml配置如下:
spring: redis: password: 123456 # Redis服务器连接密码(默认为空) timeout: 50000ms # 连接超时时间 cluster: nodes: 192.168.43.58:7000,192.168.43.58:7001,192.168.43.58:7002,192.168.43.58:7003,192.168.43.58:7004,192.168.43.58:7005 commamd-tomeout: 5000
RedisController:
package andanyoung.redis.rediscluster.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;
/**
* @author wly
* @since 2022/5/19 11:05
*/
@RestController
public class RedisController {
@Autowired
StringRedisTemplate stringRedisTemplate;
@GetMapping("get")
public String get(String key){
return stringRedisTemplate.opsForValue().get(key);
}
@RequestMapping("put")
public String put(String key,String value){
stringRedisTemplate.opsForValue().set (key,value);
return get(key);
}
}
验证效果:
更多推荐
所有评论(0)