Springboot 整合 Redis 集群,实现 Redis 分布式方案详解
- 前言
- 准备工作
- Redis 集群环境搭建
- Redis 集群故障转移(主从复制)
- Redis 集群扩展与收缩节点
- Redis 集群扩展节点(添加节点)
- Redis 集群收缩节点(移除节点)
- Springboot 整合 Redis 集群
前言
Redis Sentinel安装与部署,实现redis的高可用实现了redis的高可用,针对的主要是master宕机的情况,我们发现所有节点的数据都是一样的,那么一旦数据量过大,redis也会效率下降的问题。redis3.0版本正式推出后,有效地解决了Redis分布式方面的需求,当遇到单机内存、并发、流量等瓶颈时,可以采用Cluster架构方法达到负载均衡的目的。
准备工作
1、官网下载 Redis:http://www.redis.cn/download.html
2、准备 Linux 环境:Centos 7
3、Linux 服务器的 IP:可以通过 ifconfig 查询(此处很重要,避免踩坑
)
4、建议 Redis CLuster 结构目录如下
- redis-cluster# redis 安装目录- redis # redis 节点配置文件- conf# redis log日志文件- logs# redis 持久化文件、集群配置文件- data
Redis 集群环境搭建
注意:集群操作可以使用 ./redis-cli --cluster help 指令查看集群命令的使用说明
1、节点准备
Redis 集群的节点,通常是三个 master 以上节点,每个 master 节点至少有一个 slave 节点。
由于本文采用同一台服务器完成集群的演示,所以节点如下(注意 ip 地址为自己服务器地址,端口自行定义
)
192.168.211.158:6382 192.168.211.158:6383192.168.211.158:6384 192.168.211.158:6385192.168.211.158:6386192.168.211.158:6387
2、节点(192.168.211.158:6382
)配置文件:redis-6382.conf
,一共 6 个节点,注意:其余节点只是端口号不同
# 节点端口port 6382# 注释绑定127.0.0.1# bind 127.0.0.1# 关闭保护模式protected-mode norequirepass "myredis"# 设置 redis 后台运行daemonize yes# 设置 redis 运行的日志文件,自定义logfile "/redis-cluster/logs/6382.log"# 设置 redis 持久化文件名称,名称自定义,后缀为:.rdbdbfilename "dump-6382.rdb"# 持久化目录,这个目录保存的是:dbfilename、cluster-config-file 对应的文件dir "/redis-cluster/data"# master 节点登录密码masterauth "myredis"# 开启集群cluster-enabled yescluster-node-timeout 15000# 集群配置文件,自行生成,名称自定义cluster-config-file "nodes-6382.conf"
3、启动如上配置的全部节点
./redis/src/redis-server conf/redis-6382.conf ./redis/src/redis-server conf/redis-6383.conf ./redis/src/redis-server conf/redis-6384.conf ./redis/src/redis-server conf/redis-6385.conf ./redis/src/redis-server conf/redis-6386.conf ./redis/src/redis-server conf/redis-6387.conf
4、检查检点是否全部启动成功:ps -ef|grep redis
5、创建 Redis Cluster 集群
# --cluster-replicas 1 表示创建自动创建并给每个 master 节点分配一个 slave 节点# -a myredis 表示验证密码./redis/src/redis-cli --cluster create 192.168.211.158:6382 192.168.211.158:6383 192.168.211.158:6384 192.168.211.158:6385 192.168.211.158:6386 192.168.211.158:6387 --cluster-replicas 1 -a myredis
6、检测集群节点是否成功:./redis/src/redis-cli --cluster check 192.168.211.158:6382 -a myredis
[OK] All 16384 slots covered.表示集群所有的槽都已分配到节点。其中 key 是均匀分布在各个槽范围的。
7、Redis 集群的操作
# -c 表示集群支持,支持自动重定向./redis/src/redis-cli -h 192.168.211.158 -p 6382 -a myredis -c
Redis 集群故障转移(主从复制)
通过关闭某个集群节点的 master 节点,slave 节点会切换成 master 代替故障节点完成其工作。
Redis 集群扩展与收缩节点
集群一共有 16384 slots(槽)数量。
Redis 集群扩展节点(添加节点)
1、新建 192.168.211.158:6388、192.168.211.158:6389 两个节点的配置文件,分别为:redis-6388.conf
、redis-6389.conf,配置同上。
# 节点端口port 6388# 注释绑定127.0.0.1# bind 127.0.0.1# 关闭保护模式protected-mode norequirepass "myredis"# 设置 redis 后台运行daemonize yes# 设置 redis 运行的日志文件,自定义logfile "/redis-cluster/logs/6388.log"# 设置 redis 持久化文件名称,名称自定义,后缀为:.rdbdbfilename "dump-6388.rdb"# 持久化目录,这个目录保存的是:dbfilename、cluster-config-file 对应的文件dir "/redis-cluster/data"# master 节点登录密码masterauth "myredis"# 开启集群cluster-enabled yescluster-node-timeout 15000# 集群配置文件,自行生成,名称自定义cluster-config-file "nodes-6388.conf"
2、启动两个节点
./redis/src/redis-server conf/redis-6388.conf ./redis/src/redis-server conf/redis-6389.conf
3、添加节点
./redis/src/redis-cli --cluster add-node 192.168.211.158:6388 192.168.211.158:6382 -a myredis
4、将 6389 添加成 6388 的从节点
(1)查询节点 6388 的节点 id(node-id)
:M:abc8c97b1afb9982decace890c97653d00d10871
./redis/src/redis-cli --cluster check 192.168.211.158:6388 -a myredis
(2)将 6389 添加成 6388 的从节点
./redis/src/redis-cli --cluster add-node --cluster-master-id abc8c97b1afb9982decace890c97653d00d10871 --cluster-slave 192.168.211.158:6389 192.168.211.158:6382 -a myredis
5、给 192.168.211.158:6388 分槽,大小为:4096
./redis/src/redis-cli --cluster reshard 192.168.211.158:6382 -a myredis
(1)将大小为 4096 的槽分配给指定节点:6388(master
)
(2)使用 all 指令结尾,将各个槽的空间分配一部分到节点 6388。也可以使用指定的其他 master 节点id,分配大小为 4096 槽给 6388 。
Redis 集群收缩节点(移除节点)
1、首先要将被移除节点的槽分配出去,保证该槽大小为 0。还是使用指令。
./redis/src/redis-cli --cluster reshard 192.168.211.158:6382 -a myredis
2、移除节点
./redis/src/redis-cli --cluster del-node 192.168.211.158:6388 abc8c97b1afb9982decace890c97653d00d10871
Springboot 整合 Redis 集群
1、集群配置如上,已经配置好
2、引入 pom 依赖
org.springframework.boot spring-boot-starter-data-redis redis.clients jedis
3、yml 配置文件
server: port: 86379spring: redis: cluster: # 集群节点 nodes: 192.168.211.158:6382,192.168.211.158:6383,192.168.211.158:6384,192.168.211.158:6385,192.168.211.158:6386,192.168.211.158:6387 # 最大重定向次数 max-redirects: 5 # 密码 password: myredis lettuce: pool: min-idle: 0 max-active: 8 max-wait: -1 max-idle: 8 enabled: true
4、RedisConfig配置文件
@Configuration@EnableCaching@Slf4jpublic class RedisConfig extends CachingConfigurerSupport { @Bean @SuppressWarnings(value = {"unchecked", "rawtypes"}) public RedisTemplate
5、RedisService 自定义
6、测试
@SpringBootTest(classes = RedisServiceApplication.class)public class Test_redis { @Autowired private RedisService redisService; @Test public void test(){ redisService.setCacheObject("testkey","Hello world"); Object value = redisService.getCacheObject("testkey"); System.out.println("value = " + value); }}