redis

Redis-分布式缓存(二)

2022-04-02  本文已影响0人  石头耳东

前置文章:
一、Redis-分布式缓存(一)

零、本文纲要

tips:Ctrl + F快速定位所需内容阅读吧。

一、单机Redis的问题

1、数据丢失问题

实现Redis数据持久化;

2、并发能力问题

搭建主从集群,实现读写分离;

3、故障恢复问题

利用哨兵机制,实现健康检测和自动恢复;

4、存储能力问题

搭建分片集群,利用插槽机制实现动态扩容。

二、Redis哨兵机制

1、认识Redis哨兵机制

官方文档:High availability with Redis Sentinel | Redis

Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。

2、主观下线和客观下线

Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:

如果一个服务器没有在 master-down-after-milliseconds 选项所指定的时间内, 对向它发送 PING 命令的 Sentinel 返回一个有效回复(valid reply), 那么 Sentinel 就会将这个服务器标记为主观下线。

3、新master选举

一般没有特殊配置的话,我们仅需关注第③点,如下:

4、故障转移步骤

5、搭建哨兵集群

# 进入/tmp目录
cd /tmp
# 创建目录
mkdir s1 s2 s3

在s1\s2\s3中编写配置文件,先编写一个,后面批量复制:

# 当前sentinel实例的端口
port 27001
# sentinel实例的声明 IP
sentinel announce-ip 192.168.253.128
# 指定主节点信息,mymaster主节点名(自定义即可)
# 192.168.253.128 7001主节点IP和端口
# 2 选举master时的quorum值
sentinel monitor mymaster 192.168.253.128 7001 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
dir "/tmp/s1"

批量复制:

# 方式一:逐个拷贝
cp s1/sentinel.conf s2
cp s1/sentinel.conf s3

# 方式二:管道组合命令,一键拷贝
echo s2 s3 | xargs -t -n 1 cp s1/sentinel.conf

修改s2、s3端口号:

sed -i -e 's/27001/27002/g' -e 's/s1/s2/g' s2/sentinel.conf
sed -i -e 's/27001/27003/g' -e 's/s1/s3/g' s3/sentinel.conf
# 第1个
redis-sentinel s1/sentinel.conf
# 第2个
redis-sentinel s2/sentinel.conf
# 第3个
redis-sentinel s3/sentinel.conf

shutdown 7001节点:

哨兵实例日志.png

查看7003的日志:MASTER MODE enabled

# Setting secondary replication ID to 4fa7ef37e94fcb03f7346a196f4a759cc49efe40, valid up to offset: 9893. New replication ID is ee42a3c38907f5b94a09abca13cb6ab5c80eacb4
104557:M 02 Apr 2022 17:43:38.101 * MASTER MODE enabled (user request from 'id=10 addr=192.168.253.128:38722 laddr=192.168.253.128:7003 fd=13 name=sentinel-641bf245-cmd age=29 idle=0 flags=x db=0 sub=0 psub=0 multi=4 qbuf=188 qbuf-free=40766 argv-mem=4 obl=45 oll=0 omem=0 tot-mem=61468 events=r cmd=exec user=default redir=-1')

查看7002的日志:会进行主从同步

7002日志.png

6、RedisTemplate的哨兵模式

在Sentinel集群监管下的Redis主从集群,其节点会因为自动故障转移而发生变化,Redis的客户端必须感知这种变化,及时更新连接信息。Spring的RedisTemplate底层利用lettuce实现了节点的感知和自动切换。

        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
spring:
  redis:
    sentinel:
      master: mymaster
      nodes:
        - 192.168.253.128:27001
        - 192.168.253.128:27002
        - 192.168.253.128:27003

ReadFrom是配置Redis的读取策略:
MASTER:从主节点读取;
MASTER_PREFERRED:优先从master节点读取,master不可用才读取replica;
REPLICA:从slave(replica)节点读取;
REPLICA _PREFERRED:优先从slave(replica)节点读取,所有的slave都不可用才读取master。

@Configuration
public class LettuceClientConfiguration {
    @Bean
    public LettuceClientConfigurationBuilderCustomizer configurationBuilderCustomizer(){
        return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
    }
}
@RestController
public class HelloController {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @GetMapping("/get/{key}")
    public String hi(@PathVariable String key) {
        return redisTemplate.opsForValue().get(key);
    }

    @GetMapping("/set/{key}/{value}")
    public String hi(@PathVariable String key, @PathVariable String value) {
        redisTemplate.opsForValue().set(key, value);
        return "success";
    }
}

三、结尾

以上即为Redis-分布式缓存(二)的部分内容,感谢阅读。

上一篇 下一篇

猜你喜欢

热点阅读