美文网首页redis
Redis-分布式缓存(二)

Redis-分布式缓存(二)

作者: 石头耳东 | 来源:发表于2022-04-02 20:09 被阅读0次

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

    零、本文纲要

    • 一、单机Redis的问题
    • 二、Redis哨兵机制
      1、认识Redis哨兵机制
      2、主观下线和客观下线
      3、新master选举
      4、故障转移步骤
      5、搭建哨兵集群
      6、RedisTemplate的哨兵模式

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

    一、单机Redis的问题

    1、数据丢失问题

    实现Redis数据持久化;

    2、并发能力问题

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

    3、故障恢复问题

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

    4、存储能力问题

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

    二、Redis哨兵机制

    1、认识Redis哨兵机制

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

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

    • 健康监控(Monitoring):Sentinel 会不断检查您的master和slave是否按预期工作;
    • 自动故障恢复(Automatic failover):如果master故障,Sentinel会将一个slave提升为master;
    • 通知(Notification):Sentinel充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端。

    2、主观下线和客观下线

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

    • 主观下线(Subjectively Down, 简称 SDOWN):指的是单个 Sentinel 实例对服务器做出的下线判断;
    • 客观下线(Objectively Down, 简称 ODOWN):指的是多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断, 并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服务器下线判断。 (一个 Sentinel 可以通过向另一个 Sentinel 发送 SENTINEL is-master-down-by-addr 命令来询问对方是否认为给定的服务器已下线。)

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

    3、新master选举

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

    • ① 首先会判断slave节点与master节点断开时间长短,如果超过指定值(down-after-milliseconds * 10)则会排除该slave节点;
    • ② 然后判断slave节点的slave-priority值,越小优先级越高,如果是0则永不参与选举;
    • ③ 如果slave-prority一样,则判断slave节点的offset值,越大说明数据越新,优先级越高;
    • ④ 最后是判断slave节点的运行id大小,越小优先级越高。

    4、故障转移步骤

    • ① 首先选定一个slave作为新的master,执行slaveof no one
    • ② 然后让所有节点都执行slaveof 新master
    • ③ 修改故障节点,执行slaveof 新master

    5、搭建哨兵集群

    • ① 准备实例和配置
    # 进入/tmp目录
    cd /tmp
    # 创建目录
    mkdir s1 s2 s3
    
    • ② 编写sentinel.conf文件

    在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>
    
    • ② application.yaml
    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);
        }
    }
    
    • ④ Controller类
    @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-分布式缓存(二)的部分内容,感谢阅读。

    相关文章

      网友评论

        本文标题:Redis-分布式缓存(二)

        本文链接:https://www.haomeiwen.com/subject/ebzajrtx.html