文章

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用法

  1. 操作string: redisTemplate.opsForValue() 

  2. 操作hash: redisTemplate.opsForHash() 

  3. 操作list: redisTemplate.opsForList() 

  4. 操作set: redisTemplate.opsForSet() 

  5. 操作zset: redisTemplate.opsForZSet() 

StringRedisTemplate 继承自 RedisTemplate,也有上面的方法,区别在于StringRedisTemplate默认使用String序列化key和value,而RedisTemplate默认使用JDK序列化key和value(在redis中显示为/xxx格式,不可读)

License:  CC BY 4.0