哨兵
搭建哨兵集群
1.创建哨兵文件夹
mkdir s1 s2 s3
2.配置哨兵配置文件 sentinel.conf
port 27001
sentinel announce-ip 192.168.99.100
sentinel monitor mymaster 192.168.99.100 7001 2
sentinel down-after-millseconds mymaster 5000
sentinel failover-timeout mymaster 60000
dir "/tmp/s1"
解读:
port 27001 : 是当前sentinel 实例的端口
sentinel monitor mymaster 192.168.99.100 7001 2 : 指定主节点信息
mymaster : 主节点名称,自定义,随便写
192.168.99.100 7001:主节点的ip和端口
2 :选举master时的quorum值
拷贝sentinel.conf到s2,s3目录
修改s2,s3的信息(端口和目录)
启动哨兵
redis-sentinel s1/sentinel.conf
redis-sentinel s2/sentinel.conf
redis-sentinel s3/sentinel.conf
测试
尝试让master节点7001宕机,查看sentinel日志:
7002的日志
7003的日志
7001重启启动后的日志:
代码
1.引入依赖
<!-- springboot redis配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置sentinel相关信息
spring:
redis:
sentinel:
master: mymaster #执行master名称
nodes: #指定redis-sentinel集群信息
- 192.168.99.100:27001
- 192.168.99.100:27002
- 192.168.99.100:27003
在有哨兵模式,项目中不需要配置Redis的地址,因为Redis节点信息会动态改变. 连接Redis的事情都交给sentinel哨兵
3.配置主从读写分离
@Configuration
public class SentinalConfig {
@Bean
public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){
return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
}
}
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
void testString() {
//写操作将交给主节点
stringRedisTemplate.opsForValue().set("name", "李四");
//读操作交给从节点
String value = stringRedisTemplate.opsForValue().get("name");
System.out.println(value);
}