Redis 学习总结(3) Redis 哨兵模式

1. 背景

在实际开发中不会仅仅部署一个 Redis 示例,为了获得高可用,Redis 哨兵模式 则是高可用的一种选择。

本文先介绍下 哨兵模式,再介绍了如何在 springboot 项目中使用。

2.知识

Redis Sentinel 即哨兵模式,它是 Redis 官方的高可用性解决方案。

这意味着使用 Sentinel (哨兵模式),您可以创建一个 Redis 部署,它可抵抗某些类型的故障(进行故障迁移)而无需人工干预。

它有这些功能:

  • 监控。Sentinel 会不断检查 reids 实例是否正常工作。
  • 通知。当其中一个受监控的 Redis 实例出现问题,触发通知。
  • 自动故障转移。如果 master 没有按预期工作,将启动一个故障转移过程,其中一个副本被提升为 master。
  • 配置提供程序。它提供“ Redis 服务发现”的来源,客户端从 Sentinel 获得 Redis 主节点的地址,如果发生故障转移,Sentinels 将报告新地址。

Sentinel 的分布式特性
Redis Sentinel 是一个分布式系统,多个 Sentinel 进程协同工作,有这些优势:

  • 当多个 Sentinel 都认为某个给定的 master 不可用时,就会执行故障检测。能降低了误报的可能性。
  • 即便 某个Sentinel 进程挂掉,整个 Sentinel 模式也能正常工作。

部署前需要了解:

  • 至少需要三个 Sentinel 实例才能进行稳健的部署
  • 在不同的可用区上分别部署
  • Redis 使用异步复制,不保证在故障期间写入都是成功的。

三个节点的基本配置

+---------------------+
        | Redis #1号(主)       |
        | 哨兵 #1号            |
        +---------------------+
                    |
+------------+      |      +------------+
| Redis #2号 |------+------| Redis #3号  |
| 哨兵 #2号   |             | 哨兵 #3号   |
+------------+             +------------+

配置: 法定人数 = 2

法定人数和仲裁
在配置 哨兵模式时,要指定一个 quorum,它可理解为“法定人数”。
假设有3 个 哨兵,法定人数为2。那么:

  • 如果两个 哨兵 同时发现 master 不可访问,则由其中一个哨兵尝试启动故障转移。

哨兵和副本的自动发现
Sentinel 与其他 Sentinel 保持连接,以便相互检查彼此的可用性并交换消息。

但是,您不需要在您运行的每个 Sentinel 实例中配置其他 Sentinel 地址的列表,因为 Sentinel 使用 Redis 实例的 Pub/Sub 功能来发现正在监视相同主节点和副本的其他 Sentinel。

类似地,您不需要配置附加到主服务器的副本地址在哪里,因为 Sentinel 会通过查询 Redis 自动发现它们。

2. 准备工作

2.1 安装Reids

参考我的另一篇文章:

2.2 主要的配置步骤

一般需要三个节点,每个节点有一个 redis 和一个哨兵。

  • 1、先配置“主从复制”,一个master,两个副本。
  • 2、配置哨兵
  • 3、客户端访问

下面再分别描述。

2.3 配置 Redis 的主从复制

我这里按三个 节点,先配置 redis 的主从复制。1个节点作为 master ,2个副本。

配置节点1:master
这里的 redis 作为 master 主redis,其他两个节点作为从节点。
我的文件夹名字叫 box1,这里编辑一个 box1/redis.conf 文件,主要配置内容如下:

port 6379
pidfile /var/run/redis_6379.pid
# 此处无需配置 replicaof,因为这是主节点

配置节点2:副本
编辑一个 box2/redis.conf 文件,主要配置内容如下:

port 6380
pidfile /var/run/redis_6380.pid
dbfilename dump-6380.rdb
replicaof 127.0.0.1 6379

配置节点3:副本
编辑一个 box3/redis.conf 文件,主要配置内容如下:

port 6381
pidfile /var/run/redis_6381.pid
dbfilename dump-6381.rdb
replicaof 127.0.0.1 6379

分别启动这三个redis
命令行执行 redis-server ,并指定 配置文件的路径参数。

redis-server ./box1/redis.conf

如何查看“主从复制”是否配置成功?
使用 info replication 命令,操作如下:

# 登入 主节点,它的端口是6379
redis-cli -p 6379
# 然后输入 info replication 指令,查看状态
info replication
Redis 学习总结(3) Redis 哨兵模式_第1张图片
image.png

副本节点设置为只读?
从 Redis 2.6 开始,副本已被默认设置为 只读,无需额外配置。.

replica-read-only yes

2.4 哨兵的配置

一般情况下,至少会需要三个哨兵对redis 进行监控,我们可以通过修改端口启动多个sentinel 服务。

第一个哨兵:
哨兵的 默认端口是 26379 ,这里不改。

port 26379
sentinel monitor mymaster 127.0.0.1 6379 2

第二个哨兵:
修改哨兵端口。

port 26380
sentinel monitor mymaster 127.0.0.1 6379 2

第三个哨兵:
修改哨兵端口。

port 26381
sentinel monitor mymaster 127.0.0.1 6379 2

启动哨兵
使用 redis-sentinel 命令,分别启动这三个哨兵

redis-sentinel sentinel.conf

哨兵的自动发现
当三个哨兵都启动后,在各个哨兵的打印日志里可以看到,三个哨兵已互相发现了彼此的存在

Redis 学习总结(3) Redis 哨兵模式_第2张图片
image.png

2.5 总结

至此,配置完毕了,我们有三个 redis,和三个哨兵,看下截图。

image.png

模拟 master 宕机
按 ctrl+c 停止 master ,其位于 6379 。停止后,从日志可以看到,哨兵和 redis副本先努力继续连接 6379,反复几次失败后,开始选举出新的 master。截图如下:

Redis 学习总结(3) Redis 哨兵模式_第3张图片
image.png

至此,配置完毕。

3. 配置客户端的访问

我们看下 springboot 项目的客户端如何配置 以访问 哨兵模式的 redis。

Redis 哨兵支持
对于处理高可用Redis,Spring Data Redis 已经支持Redis Sentinel,使用RedisSentinelConfiguration,如下例所示:

Jedis 和 Lettuce 两种 redis 驱动都可以支持。

/**
 * 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);
}

/**
 * Lettuce
 */
@Bean
public RedisConnectionFactory lettuceConnectionFactory() {
  RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
  .master("mymaster")
  .sentinel("127.0.0.1", 26379)
  .sentinel("127.0.0.1", 26380);
  return new LettuceConnectionFactory(sentinelConfig);
}

RedisSentinelConfiguration 也可以用可以 通过 PropertySource 来设置,它允许您设置以下属性:

配置application.yml

spring.redis.sentinel.master: 主节点的名称。
spring.redis.sentinel.nodes:逗号分隔的主机:端口对列表。
spring.redis.sentinel.password: 使用 Redis Sentinel 进行身份验证时应用的密码

比如我这里修改我的 application.yml 文件如下:

spring:
  redis:
    sentinel:
      master: mymaster
      nodes: 127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26371

4. 扩展

我的配置文件示例:https://github.com/vir56k/java_demo/tree/master/redis-sentinel
我的 springboot 配置实例:https://github.com/vir56k/java_demo/tree/master/redis-sentinel/springboot_redis_demo

5.参考:

Redis官网 sentinel 介绍https://redis.io/topics/sentinel

spring-data/data-redishttps://docs.spring.io/spring-data/data-redis/docs/current/reference/html/#redis:sentinel

https://www.cnblogs.com/jaycekon/p/6237562.html

END

你可能感兴趣的:(java,数据库,redis,linux,分布式)