Redis Sentinel使用说明

Redis哨兵提供了Redis的高可用功能,使用Sentinel以后能够在某些状况下无需人为介入自动的恢复Redis的服务不可用问题。node

特性

哨兵主要提供如下能力:redis

  • 监控:不断的周期性的检查Redis的Master节点和Slave节点的信息
  • 通知:经过API能够通知系统管理员,被监控的Redis实例遇到了某种问题
  • 故障自动恢复:若是某一台Master节点不工做了,Sentinel能够启动故障切换功能,将某台Slave提高为Master,Sentinel会从新配置Slave,同时通知链接Sentinel的客户端,Master的地址改变了
  • 配置提供:客户端链接到Sentinel上获取当前的Redis Master地址

image-20190927072426181

哨兵是分布式部署的,哨兵设计的目的是为了多台哨兵节点能相互配合。运行多台哨兵有以下优势:spring

  • 故障检测是多台哨兵都赞成这台Master不可用了,才认定Master不可用。若是节点数少,可能存在误判
    • 多个Sentinel发现Master节点有问题
    • 选举一个Sentinel做为Master,通常是发现Master不可用的Sentinel节点,Sentinel Master是具备提高Slave为Master功能的
    • 选出一个Slave做为新的Master
    • 通知其他Slave新的Master地址
    • 通知客户度主从变化
    • 等老的Master又被检测活以后,成为新Master的Slave
  • 就算挂掉了几台Sentinel,其他的Sentinel节点仍然正常工做,加强了系统的健壮性。

一套Sentinel集群能够监控多个Redis主从集群安全

三个定时任务

1 每10s每一个Sentinel对Master和Slave执行Info信息bash

  • 发现Slave节点
  • 确认主从关系

2 每隔2s对每一个Sentinel经过Master节点的Channel交换信息(pub/sub),注意是Master节点分布式

  • 经过__ sentinel __:hello 频道交互,Sentinel交互数据的方式,新的Sentinel节点会自动的注册这个频道
  • 交互对节点的“见解”和自身信息

3 每隔1S对其它Sentinel和Redis节点执行pingui

  • 心跳检测,失败判断依据

客户端链接Sentinel原理

Redis Sentinel高可用指的是服务端的高可用,若是咱们直接链接到Redis 的Master节点挂掉了,那么咱们的客户端就不可用了。spa

咱们须要的是服务端高可用和客户端高可用的结合。设计

1 获取全部的Sentinel节点,遍历获得一个可用的Sentinel节点code

2 在可用的Sentinel节点上执行,sentinel get-master-addr-by-name MasterName来返回Master节点信息,包含地址和端口

3 当获取到Master节点以后,执行role或者role replication来验证是否真的是Master节点

4 若是当Master节点发生了变化,Sentinel通知客户端主节点信息发生了变化。客户端接受到变化是经过一个Redis的Channel来实现

启动Sentinel

Sentinel默认监听的端口在TCP 26379,运行Sentinel有两种方式,效果是同样的:

redis-sentinel /path/to/sentinel.conf
redis-server /path/to/sentinel.conf --sentinel
复制代码

下载Redis后,通常都会有sentinel.conf配置文件,里面有sentinel的配置同时配上了文档说明。

配置

通常Redis Sentinel的配置以下:

# 指定监听的Redis Master地址,不须要指定slave的地址,sentinel链接到master以后能够自行获取
# 语法:sentinel monitor <master-group-name> <ip> <port> <quorum>
# quorum是当master没法访问的时候,须要几台sentinel确认才赞成master是不可用的
sentinel monitor mymaster 127.0.0.1 6379 2

# 配置格式:sentinel <option_name> <master_name> <option_value>

# down-after-milliseconds,在 60s内,sentinel一直没法ping通mymaster的时候,认为mymaster是不可用的
sentinel down-after-milliseconds mymaster 60000

# 指定当故障发生的时候,进行恢复的超时时间,当failover开始后,在此时间内仍然没有触发任何failover操做,当前sentinel 将会认为这次failoer失败
sentinel failover-timeout mymaster 180000

# 当某台slave被提高为新的master的时候,同一时间有几台slave会更新配置,值越小越好,若是值设的过大,可能致使master阻塞。
sentinel parallel-syncs mymaster 1

sentinel monitor resque 192.168.1.3 6380 4
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5
复制代码

Sentinel在发现Slave以后,或者提高Slave为Master节点以后,或者新加入了Sentinel节点的时候会自动的更新配置文件。

其余配置:

# 开启守护进程模式
daemonize yes

# 关闭保护模式
protected-mode no

# 让Sentinel只工做在/tmp目录下,减小安全隐患
dir "/tmp"

# 设置sentinel用于链接master的密码,若是redis配置了密码,那这里必须配置认证,不然不能自动切换
sentinel auth-pass <master-name> <password>
复制代码

Spring Redis配置

1 在配置文件中指定sentinel的地址,若是有多个用逗号分隔sentinel.nodes

spring.redis.sentinel.master=mymaster
spring.redis.sentinel.nodes=192.168.26.129:26379
spring.redis.password=123456
复制代码

若是不想使用属性配置能够自行在代码中建立:

/**
 * Jedis
 */
@Bean
public RedisConnectionFactory jedisConnectionFactory() {
  RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
  .master("mymaster")
  .sentinel("127.0.0.1", 26379)
  .sentinel("127.0.0.1", 26380);
  return new JedisConnectionFactory(sentinelConfig);
}
复制代码

2 配置下RedisTemplate的序列器,否则容易出现一些奇怪字符开头的key。如:

image.png

@Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        RedisSerializer stringSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(stringSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(stringSerializer);
        return redisTemplate;
    }
复制代码

3 注入RedisTemplate使用。

最后

关于Redis Sentinel的配置与使用就到这里了。

相关文章
相关标签/搜索