Redis-4-哨兵机制Sentinel

1.什么是Redis哨兵机制?

当主节点发生故障时,Redis哨兵自动完成故障发现和转移,并通知给应用,实现高可用性。
Redis-4-哨兵机制Sentinel_第1张图片

Redis 哨兵机制主要功能包括
监控(Monitoring):哨兵会不断地检查主节点和从节点是否运作正常。

自动故障转移(Automatic Failover):当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。

配置提供者(Configuration Provider):客户端在初始化时,通过连接哨兵来获得当前Redis服务的主节点地址。

通知(Notification):哨兵可以将故障转移的结果发送给客户端。

2.为什么要用哨兵机制?

在实现主从复制的基础上,实现了自动的故障转移。

3.怎么实现哨兵机制?

3.1部署主从节点

#redis-6379.conf
port 6379

daemonize yes

logfile "6379.log"

dbfilename "dump-6379.rdb"



#redis-6380.conf

port 6380

daemonize yes

logfile "6380.log"

dbfilename "dump-6380.rdb"

slaveof 192.168.92.128 6379



#redis-6381.conf

port 6381

daemonize yes

logfile "6381.log"

dbfilename "dump-6381.rdb"

slaveof 192.168.92.128 6379

3.2部署哨兵节点

#sentinel-26379.conf

port 26379

daemonize yes

logfile "26379.log"

sentinel monitor mymaster 192.168.92.128   6379 2

3.3两种启动方式

redis-sentinel sentinel-26379.conf #第一种

redis-server   sentinel-26379.conf --sentinel #第二种

4.功能演示

4.1用kill杀死主节点6379
在这里插入图片描述
4.2立即查看信息info sentinel
主节点6379还没有切换
Redis-4-哨兵机制Sentinel_第2张图片

4.3几分钟后查信息info sentinel
主节点已经切换成6380
Redis-4-哨兵机制Sentinel_第3张图片
4.4重启节点6379
节点6379成为了主节点6380的从节点
Redis-4-哨兵机制Sentinel_第4张图片
4.5查看配置文件
故障转移后,哨兵和主从节点的配置文件都已经改变。
Redis-4-哨兵机制Sentinel_第5张图片

5.SpringDataRedis连接哨兵

5.1新建SpringBoot的maven测试工程redis_demo



    4.0.0

    com.mingju
    redis_demo
    1.0-SNAPSHOT

    
    
        org.springframework.boot
        spring-boot-starter-parent
        2.1.6.RELEASE
         
    

    
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
            org.springframework.boot
            spring-boot-starter-data-redis
        
    


5.2编写application的yml文件

spring:
  redis:
    password: 123456
    #redis哨兵模式配置
    sentinel:
      # 主节点名字
      master: mymaster
      # 哨兵服务地址和端口,如果有多个哨兵,则用英文逗号分割
      nodes: 192.168.40.141:26379
logging:
  level:
    #根路径包的日志级别,默认就是info
    root: info
    #配置指定的包的日志级别
    org.springframework.data.redis: debug
  #指定log4j的日志核心配置文件
  #config: classpath:log4j.properties
  #日志同时写入到磁盘文件中
  file: d:/redisdemo.log

5.3编写启动类

package com.mingju.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class RedisApplication {
    public static void main(String[] args) {
        SpringApplication.run(RedisApplication.class, args);
    }
}

5.4编写测试类

package com.mingju.demo;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.connection.RedisServer;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.Collection;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = RedisApplication.class)
public class RedisTemplateTest {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @Test
    public void test() {
        //增加测试数据
        redisTemplate.opsForValue().set("username", "XiaoMing");
        //读取数据
        String username = redisTemplate.opsForValue().get("username");
        System.out.println("username:"+username);

        Collection masters = redisTemplate.getConnectionFactory().getSentinelConnection().masters();
        for (RedisServer master : masters) {
            //打印主节点
            System.out.println("============主节点===============");
            System.out.println(master);

            Collection slaves = redisTemplate.getConnectionFactory().getSentinelConnection().slaves(master);
            System.out.println("============从节点===============");
            for (RedisServer slave : slaves){
                //打印从节点
                System.out.println(slave);
            }
        }
    }
}

你可能感兴趣的:(Redis)