2017年08月10日 10:22:43 人生的旅客 阅读数:2542
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014513883/article/details/77036890
上篇博客谈到了Spring整合redis集群以及故障转移演示,会发现redis集群模式存在一个很明显的问题:当某个主节点及其所有从节点挂掉,整个集群因为缺少该节点负责范围的哈希槽(hash slot)而宕掉,不具高可用性。redis引入了哨兵(sentinel)模式,能很好解决集群模式存在的不足。引用官网,redis哨兵系统有三个作用:
本文主要讲解spring整合redis sentinel及故障转移示例,以此加深理解。
笔者已经预先搭建好Redis Sentinel,环境如下:
role | ip | port |
---|---|---|
Redis Master | 192.168.48.31 | 6379 |
Redis Slave1 | 192.168.48.32 | 6379 |
Redis Slave0 | 192.168.48.33 | 6379 |
Redis Sentinel | 192.168.48.31 | 26379 |
Redis Sentinel | 192.168.48.32 | 26379 |
Redis Sentinel | 192.168.48.33 | 26379 |
客户端连接主节点,查看Redis Master相关信息
redis-cli -h 192.168.48.31 info Replication
Redis Sentinel启动信息
客户端连接sentinel节点,查看Redis Sentinel相关信息
redis-cli -h 192.168.48.31 -p 26379 info Sentinel
step1、maven依赖引入
org.springframework.data
spring-data-redis
1.8.6.RELEASE
redis.clients
jedis
2.9.0
step2、配置ConnectionFactory
构造JedisConnectionFactory实例,注入池配置poolConfig和哨兵配置sentinelConfig
step3、配置JedisPoolConfig
配置文件spring-redis.properties内容
redis.minIdle=50
redis.maxIdle=200
redis.maxActive=100
redis.maxWait=3000
redis.testOnBorrow=true
step4、配置RedisSentinelConfiguration
和集群配置一样,sentinel也有两种配置方式
1.sentinels设值注入
2.propertySource构造注入
spring-redis-sentinel.properties内容:
#哨兵监控主redis节点名称,必选
spring.redis.sentinel.master=mymaster
#哨兵节点
spring.redis.sentinel.nodes=192.168.48.31:26379,192.168.48.32:26379,192.168.48.33:26379
RedisSentinelConfiguration源码中这两个配置属性常量:
private static final String REDIS_SENTINEL_MASTER_CONFIG_PROPERTY = "spring.redis.sentinel.master";
private static final String REDIS_SENTINEL_NODES_CONFIG_PROPERTY = "spring.redis.sentinel.nodes";
step5、配置RedisTemplate
然后配置RedisTemplate,用于redis命令操作
step6、测试
package example;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
public class SpringMain {
public static void main(String[] args) throws InterruptedException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-redis.xml");
StringRedisTemplate template = context.getBean(StringRedisTemplate.class);
ValueOperations valueOperations = template.opsForValue();
valueOperations.set("foo","bar");
context.destroy();
}
}
由于主从复制,Master(48.31)、Slave1(48.32)、Slave0(48.33)能查看到相同的结果:
到此,spring整合redis sentinel完成,完整配置如下:
为验证故障转移,我们关闭Master节点
shutdown
Sentinel监控日志:
简单解释下日志信息:
查看该节点信息,发现他的角色已经变为master,原先的Slave0(192.168.48.33:6379)变成新master的slave:
redis-cli -h 192.168.48.32 info Replication
接下来再来测试一种情况:在故障节点重启之前发送写命令,故障节点重启后数据是否会复制过来?
valueOperations.set("foo1","bar1");
结果:
重启原来的Master节点(192.168.48.31:6379)
原先的Master重启后变成了新Master的从节点了,试着查看foo1的值
参考链接:
https://blog.csdn.net/u014513883/article/details/77036890?locationNum=9&fps=1
https://docs.spring.io/spring-data/redis/docs/2.0.0.RC2/reference/html/#redis:sentinel