Redis主从集群部署与SpringBoot整合指南
导航:
主从集群 哨兵集群 分区集群
环境:
redis:5.0.8 Springboot: 2.2.3.RELEASE redis安装
集群方式及配置
先梳理一下基础配置,再来看集群的相关配置。
基础配置集群配置:
#后台运行(守护进程)daemonize yes #去除保护模式(允许远程访问)protected-mode no#去除绑定(远程访问)#bind 127.0.0.1# 设置密码requirepass redispwd
本次配置基于同一机器不通端口做集群,当redis位于不同机器时,部分配置可以省去(以下配置过程中会说明/【单机非必须】:当前机器仅运行一个redis实例)
主从集群
主从集群的表现形式是一主多从,主节点负责写和读,从节点只负责读。这其实是一种最常见的读写分离方案,但要注意的是,从节点是禁止写入的。
修改主节点配置
拷贝一份配置文件命名为redis-master.conf(来源安装目录:redis-5.0.8/redis.conf)
# db写入磁盘目录位置(文件夹路径如果不存在,需要手动创建):【单机非必须】dir ./master #日志目录,默认运行命令时的目录【单机非必须】logfile "./master/master.log"#pid写入位置,默认/var/run/redis_6379.pid【单机非必须】pidfile "/var/run/redis_6379.pid"
修改丛点1配置 6380节点 拷贝redis-master.conf 命名为redis-sla ve6380.conf
# redis端口【单机非必须】port 6380 # db写入磁盘目录位置(文件夹路径如果不存在,需要手动创建):【单机非必须】dir ./sla ve/6380 #日志目录,默认运行命令时的目录【单机非必须】logfile "./sla ve/sla ve6380.log"#pid写入位置,默认/var/run/redis_6379.pid【单机非必须】pidfile /var/run/redis_6380.pid
#----以下为丛节点的不同修改点
#主节点地址(ip 端口)sla veof 192.168.1.17 6379#master节点密码 ,(打开注释,修改master的密码即可)masterauth redispwd
修改丛点2配置 6381节点 拷贝redis-sla ve6380.conf 命名为redis-sla ve6381.conf
# redis端口【单机非必须】port 6381 # db写入磁盘目录位置(文件夹路径如果不存在,需要手动创建):【单机非必须】dir ./sla ve/6381 #日志目录,默认运行命令时的目录【单机非必须】logfile "./sla ve/sla ve6381.log"#pid写入位置,默认/var/run/redis_6379.pid【单机非必须】pidfile /var/run/redis_6381.pid
#----以下为丛节点的不同修改点(因为当前节点是丛节点1复制过来的,所以以下信息无需修改)
#主节点地址(ip 端口)sla veof 192.168.1.17 6379#master节点密码 ,(打开注释,修改master的密码即可)masterauth redispwd
启动主、丛节点配置
#注意redis-server路径及配置文件路径 ./bin/redis-server redis-master.conf ./bin/redis-server redis-sla ve6380.conf./bin/redis-server redis-sla ve6381.conf
查看master节点
#登陆master节点,执行info命令查看主从节点信息info
#登陆6380丛节点,执行info看一下
分别登陆丛节点,感受一下主从同步
[root@bogon bin]# ./redis-cli -p 6380[root@bogon bin]# ./redis-cli -p 6381
master节点设置一个值
#master 节点设置 set testkey demo
sla ve节点查看缓存
#sla ve节点查询master缓存get testkey
sla ve6380节点
在这里插入图片描述
sla ve6381节点
在这里插入图片描述
sla ve节点不允许写入
主从集群在Springboot中的配置
主从集群在Springboot里的配置其实跟单机部署差不太多,但有个关键点:应用程序需要明确知道主从节点的角色,避免往从节点写入数据导致异常。也正因如此,主从配置在实际生产中用得其实不多——当然,主节点一旦挂掉,整个写入链路就断了,这也是一个硬伤。
1. pom引入
org.springframework.boot spring-boot-starter-data-redis
2.yml配置(properties配置文件类型自行转换)
spring:redis:# Redis服务器地址 单机模式host: 192.168.1.17# Redis服务器连接端口(这里配置的是主节点,可以写,可以读)port: 6379# Redis服务器连接密码(默认为空)password: redispwd#jedis连接池信息仅供参考jedis:pool:#连接池最大连接数(使用负值表示没有限制)max-active: 8# 连接池最大阻塞等待时间(使用负值表示没有限制)max-wait: -1# 连接池中的最大空闲连接pool.max-idle: 8# 连接池中的最小空闲连接pool.min-idle: 0
3.封装RedisTemplate MyRedisConfig.ja va
import com.fasterxml.jackson.annotation.JsonAutoDetect;import com.fasterxml.jackson.annotation.PropertyAccessor;import com.fasterxml.jackson.databind.ObjectMapper;import org.springframework.cache.annotation.EnableCaching;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.data.redis.core.ValueOperations;import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration@EnableCachingpublic class MyRedisConfig {@Beanpublic RedisTemplate
4.测试Controller SysController.ja va
import com.platform.test.common.exception.BusinessException;import com.platform.test.service.SysService;import com.platform.test.vo.BaseRespVo;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.ValueOperations;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import ja vax.servlet.http.HttpSession;import ja va.text.SimpleDateFormat;import ja va.util.Date;import ja va.util.HashMap;import ja va.util.concurrent.TimeUnit;@RestController@RequestMapping("/sys")public class SysController {static final Logger logger = LoggerFactory.getLogger(SysController.class);@Autowired@Qualifier("valueoperations")ValueOperations valueOperations;@AutowiredRedisTemplate redisTemplate;@AutowiredSysService sysService;final static String REDIS_TEST_KEY_VALUE = "__REDIS_TEST_KEY_VALUE";@RequestMapping("/health")public BaseRespVo health(HttpSession session) throws BusinessException {SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");HashMap data = new HashMap<>();data.put("time-server",sf.format(new Date()));data.put("status-redis",checkRedis());return new BaseRespVo(data);} private boolean checkRedis() {long time = System.currentTimeMillis();if(valueOperations == null){return false;}try {valueOperations.set(REDIS_TEST_KEY_VALUE time,REDIS_TEST_KEY_VALUE,300, TimeUnit.MILLISECONDS);logger.info("写入redis key: " REDIS_TEST_KEY_VALUE time " value:" REDIS_TEST_KEY_VALUE);Thread.sleep(100);String value = valueOperations.get(REDIS_TEST_KEY_VALUE time);if (value!=null && REDIS_TEST_KEY_VALUE.equals(value)) {logger.info("读取redis key: " REDIS_TEST_KEY_VALUE time " value:" value);return true;}}catch (Exception e){logger.error("redis test exception!",e);}return false;}}
执行结果:
在这里插入图片描述
sla ve节点
5.yml配置切sla ve节点(properties配置文件类型自行转换)
spring:redis:# Redis服务器地址 单机模式host: 192.168.1.17# Redis服务器连接端口(这里该配置为丛节点,不可以写,但可以读) 如果丛节点部署到不同的机器上记得同步修改上面的hostport: 6380
重启执行结果
与终端执行结果一致,均不允许写!
【补充】 需要注意的事儿~
- 主从配置需要确保cluster-enabled=no或者保持注释状态
- 主从模式下sla ve服务需要正确配置master的密码
- 主从间网络保持畅通(可达性及防火墙限制)






