6、Redis哨兵高可用架构

Redis哨兵高可用架构

在这里插入图片描述

1、简介

	sentinel哨兵是特殊的redis服务,不提供读写服务,主要用来监控redis实例节点。 哨
	
兵架构下client端第一次从哨兵找出redis的主节点,后续就直接访问redis的主节点,不会

每次都通过 sentinel代理访问redis的主节点,当redis的主节点发生变化,哨兵会第一时间

感知到,并且将新的redis 主节点通知给client端(这里面redis的client端一般都实现了订阅

功能,订阅sentinel发布的节点变动消息)

2、redis哨兵架构搭建步骤:

3、哨兵的Jedis连接代码:

public class JedisSentinelTest {
    public static void main(String[] args) throws IOException {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(20);
        config.setMaxIdle(10);
        config.setMinIdle(5);

        String masterName = "mymaster";
        Set<String> sentinels = new HashSet<String>();
        sentinels.add(new HostAndPort("192.168.0.60", 26379).toString());
        sentinels.add(new HostAndPort("192.168.0.60", 26380).toString());
        sentinels.add(new HostAndPort("192.168.0.60", 26381).toString());
        //JedisSentinelPool其实本质跟JedisPool类似,都是与redis主节点建立的连接池 
        //JedisSentinelPool并不是说与sentinel建立的连接池,而是通过sentinel发现redis主节点并与其建立连接 
        JedisSentinelPool jedisSentinelPool = new JedisSentinelPool(masterName, sentinels, config, 3000, null);
        Jedis jedis = null;
        try {
            jedis = jedisSentinelPool.getResource();
            System.out.println(jedis.set("sentinel", "zhuge"));
            System.out.println(jedis.get("sentinel"));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //注意这里不是关闭连接,在JedisPool模式下,Jedis会被归还给资源池。 
            if (jedis != null){
                jedis.close();
            }
        }
    }
} 

4、哨兵的Spring Boot整合Redis项目:redis-sentinel-cluster

1)、引入相关依赖
	<dependency>
		<groupId>org.springframework.boot</groupId> 
		<artifactId>spring‐boot‐starter‐data‐redis</artifactId>
	</dependency> 
	<dependency>
		<groupId>org.apache.commons</groupId> 
		<artifactId>commons‐pool2</artifactId>
	</dependency>

2)、springboot项目核心配置:
server:
  port: 8080
spring:
  redis:
    database: 0
    timeout: 3000
    sentinel: #哨兵模式
      master: mymaster #主服务器所在集群名称
      nodes: 192.168.0.29:26379,192.168.0.30:26380,192.168.0.31:26381
      lettuce:
    pool:
      max‐idle: 50
      min‐idle: 10
      max‐active: 100
      max‐wait: 1000
3)、访问代码:
@RestController
public class IndexController {
    private static final Logger logger = LoggerFactory.getLogger(IndexController.class);
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 测试节点挂了哨兵重新选举新的master节点,客户端是否能动态感知到
     * 新的master选举出来后,哨兵会把消息发布出去,客户端实际上是实现了一个消息监听机制,
     * 当哨兵把新master的消息发布出去,客户端会立马感知到新master的信息,从而动态切换访问
     * 的masterip
     *
     * @throws InterruptedException
     */
    @RequestMapping("/test_sentinel")
    public void testSentinel() throws InterruptedException {
        int i = 1;
        while (true) {
            try {
                stringRedisTemplate.opsForValue().set("td" + i, i + "");
                System.out.println("设置key:" + "td" + i);
                i++;
                Thread.sleep(1000);
            } catch (Exception e) {
                logger.error("错误:", e);
            }
        }
    }
}

5、StringRedisTemplate与RedisTemplate详解

	spring 封装了 RedisTemplate 对象来进行对redis的各种操作,它支持所有的 redis 原生的 api。在
RedisTemplate中提供了几个常用的接口方法的使用,分别是:

private ValueOperations<K, V> valueOps;
private HashOperations<K, V> hashOps;
private ListOperations<K, V> listOps;
private SetOperations<K, V> setOps;
private ZSetOperations<K, V> zSetOps;

5.1、RedisTemplate中定义了对5种数据结构操作

redisTemplate.opsForValue();//操作字符串

redisTemplate.opsForHash();//操作hash

redisTemplate.opsForList();//操作list

redisTemplate.opsForSet();//操作set

redisTemplate.opsForZSet();//操作有序set

5.2、StringRedisTemplate

StringRedisTemplate继承自RedisTemplate,也一样拥有上面这些操作。

StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的

RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

5.3、Redis客户端命令对应的RedisTemplate中的方法列表:

String 类型结构:
在这里插入图片描述

Hash结构:
在这里插入图片描述

List结构:

在这里插入图片描述

Set结构:
在这里插入图片描述

6、哨兵leader选举流程

	当一个master服务器被某sentinel视为下线状态后,该sentinel会与其他sentinel协商选出sentinel的leader进行故障转移工作。每个发现master
	
服务器进入下线的sentinel都可以要求其他sentinel选自己为sentinel的leader,选举是先到先得。同时每个sentinel每次选举都会自增配置纪元(选举

周期),每个纪元中只会选择一个sentinel的leader。如果所有超过一半的sentinel选举某sentinel作为leader。之后该sentinel进行故障转移操作,从

存活的slave中选举出新的master,这个选举过程跟集群的master选举很类似。 


	哨兵集群只有一个哨兵节点,redis的主从也能正常运行以及选举master,如果master挂了,那唯一的那个哨兵节点就是哨兵leader了,可以正常选举
新master。

	不过为了高可用一般都推荐至少部署三个哨兵节点。为什么推荐奇数个哨兵节点原理跟集群奇数个master节点类似。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值