Redis 哨兵架构
在主从架构下,Redis主节点宕机后,需要手动指定新的主节点,非常不方便。因此引入了哨兵架构,它可以自动发现故障节点并进行故障转移,即主节点宕机后会自动选举新的主节点。
在哨兵架构下,Client端第一次间接从哨兵获取Redis主节点,后续会直接访问主节点。当Redis主节点发生变化,哨兵会第一时间将新的主节点通知给Client端(Client订阅了哨兵发布的节点变动消息)
Redis是特殊的Redis服务,不提供读写服务,而是用来监控Redis实例节点。
哨兵架构搭建
(1) 修改配置(sentinel.conf)
# 可选配置
port 16379
daemonize yes
logfile "sentinel.log" # 日志文件
pidfile "" # 写入pid的文件
dir /usr/local/redis/data/sentinel # 数据存放目录
# 关键配置
# quorum表示多少个sentinel认为master失效时才算真正失效(一般需要半数sentinel,即 quorum >= total_sentinel_num / 2 + 1)
sentinel monitor mymaster 120.55.167.193 6379 2 # sentinel monitor <master_name> <master_ip> <master_port> <quorum>
(2) 启动哨兵实例:`src/redis-sentinel sentinel.conf`
(3) 判断哨兵是否搭建成功
判断方法1:登录sentinel客户端查看监控情况
sentinel master mymaster # 查看主节点
sentinel replicas mymaster # 查看从节点
判断方法2:检查哨兵集群各节点sentinel.conf文件末尾
SpringBoot下测试哨兵架构
(1) 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
(2) 测试代码
@Autowired
private StringRedisTemplate stringRedisTemplate;
@RequestMapping("/test_sentinel")
public void testSentinel() {
for (int i = 1; i <= 100; i++) {
try {
stringRedisTemplate.opsForValue().set("test_sentinel_" + i, String.valueOf(i));
System.out.println("设置key:test_sentinel_" + i);
Thread.sleep(6000);
} catch (Exception e) {
System.out.println("设置key出错:test_sentinel_" + i);
}
}
}
(3) 停止主节点测试是否可以故障转移
RedisTemplate用法
操作string: redisTemplate.opsForValue()
操作hash: redisTemplate.opsForHash()
操作list: redisTemplate.opsForList()
操作set: redisTemplate.opsForSet()
操作zset: redisTemplate.opsForZSet()
StringRedisTemplate 继承自 RedisTemplate,也有上面的方法,区别在于StringRedisTemplate默认使用String序列化key和value,而RedisTemplate默认使用JDK序列化key和value(在redis中显示为/xxx格式,不可读)
License:
CC BY 4.0