Redis哨兵模式

一.哨兵的作用及工作原理

1.哨兵的作用

2.哨兵监测集群的方式

3.master宕机后哨兵如何从众多slave中选举一个slave作为新的master

4.哨兵如何实现故障转移

5.总结

二.哨兵集群搭建

1.架构模式

2.搭建流程

说明:搭建哨兵集群只需2步

        第一:搭建一个Redis主从集群;

        第二:搭建哨兵去监控集群;

1.资源配置

IP端口角色
192.168.157.1306379master
192.168.157.1316379slave1
192.168.157.1326379slave2

2.上传redis安装包并解压

        使用版本为:redis-6.2.14.tar.gz

3.安装gcc

# 三台redis节点
yum install -y gcc tcl

4.进入redis解压目录执行安装命令

# 三台Redis节点
make && make install

说明:执行make && make install命令成功后Redis的启动脚本默认放在/usr/local/bin目录下。且已自动配置好Redis的环境变量你可以在任何地方尝试使用redis-server命令去启动Reids;

5.修改三台Redis节点的redis.conf配置文件

# 允许外部所有IP访问(方便测试)
bind 0.0.0.0

# 允许以守护进程后台运行Redis
daemonize yes

# 为Redis设置访问密码(不同节点密码可不同,最终只需在slave节点中配置master节点密码即可)
requirepass 123456

6.分别在三台Redis节点的redis.conf文件中指定redis实例所绑定的IP

# 在192.168.157.130 redis.conf中添加
replica-announce-ip 192.168.157.130

# 在192.168.157.131 redis.conf中添加
replica-announce-ip 192.168.157.131

# 在192.168.157.132 redis.conf中添加
replica-announce-ip 192.168.157.132

7.在两台从节点中的redis.conf文件中添加连接主节点的密码

# 两台从节点添加,不然启动集群时从节点无法连接到主节点(192.168.157.131 ~ 192.168.157.132)
# 123456为主节点的访问密码
masterauth 123456

8.建立主从关系(在两台从节点的redis.conf中配置)

# 在两台从节点中添加绑定的主节点(192.168.157.131 ~ 192.168.157.132)
# 格式:replicaof <主节点IP> <主节点port>
replicaof 192.168.157.130 6379

9.启动集群

        分别启动三台Redis节点

# 因为是在redis的解压目录下执行的,所以此处redis.conf用的是相对路径
redis-server redis.conf

10.查看集群状态

# 查看集群状态命令
INFO replication

至此搭建Redis哨兵集群的第一部分搭建主从集群完成;下面开始完成第二部分配置哨兵;

11.三台Redis节点解压后在其根目录下都有一个sentinel.conf文件

补充:若无sentinel.conf文件可在redis解压目录下自行新建sentinel.conf配置文件(配置参数如下)

# sentinel端口
port 26379

# 配置Redis主节点密码(123456为Redis主节点设置的密码)
sentinel auth-pass mymaster 123456

# 访问sentinel密码
requirepass 654321

# sentinel绑定IP(不同sentinel节点绑定不同IP,当前sentinel在哪个Redis下就绑定哪个Redis的IP)
sentinel announce-ip 192.168.157.130

# sentinel绑定Redis集群master信息
# 格式: sentinel monitor <master-name(主节点名[任意写])> <ip(主节点IP)> <redis-port(主节点Port)> <quorum(主节点下线阈值)>
sentinel monitor mymaster 192.168.157.130 6379 2

# 超时时间
sentinel down-after-milliseconds mymaster 30000

# 超时时间
sentinel failover-timeout mymaster 180000

# 工作目录
dir /tmp

12.分别在三台Redis节点的sentinel.conf文件中指定sentinel(哨兵)所绑定的IP

# 在192.168.157.130 sentinel.conf中修改
sentinel announce-ip 192.168.157.130

# 在192.168.157.131 sentinel.conf中修改
sentinel announce-ip 192.168.157.131

# 在192.168.157.132 sentinel.conf中修改
sentinel announce-ip 192.168.157.132

13.分别在三台Redis节点的sentinel.conf文件中指定监控Redis主节点的信息

# 在三台Redis节点的sentinel.conf中修改(三台节点修改的信息都一样)
# 格式: sentinel monitor <master-name(主节点名[任意写])> <ip(主节点IP)> <redis-port(主节点Port)> <quorum(主节点下线阈值)>
# 参数说明:<quorum(主节点下线阈值)> 如下配置值为2是因为总共只有3个sentinel节点当集群中超过一半的sentinel节点都认为当前master已主观下线则让其客观下线

sentinel monitor mymaster 192.168.157.130 6379 2

说明:为什么sentinel只配置监控master节点而不配置监控slave节点?

        监控master节点后可以从master节点中获取到其它slave节点从而实现整个Redis集群节点的监控;

        实现Redis节点的监控,sentinel首先要得到所有的Redis节点的信息。sentinel通过在配置文件中配置 sentinel monitor 选项来指定要监控的redis master节点的地址,然后在启动sentinel时,会创建与redis master节点的连接并向master节点发送一个info命令,master节点在收到info命令后,会将自身节点的信息和自己下面所有的slave节点的信息返回给sentinel,sentinel收到反馈后,会与新的slave节点创建连接,接下来就会每隔10秒钟向所有的redis节点发送info命令来获取最新的redis主从结构信息。

14.分别在三台Redis节点的sentinel.conf文件中配置访问Redis主节点密码&&访问sentinel密码及后台启动sentinel

# 在三台Redis节点下的sentinel.conf文件中配置Redis主节点的访问密码
sentinel auth-pass mymaster 123456

# 访问sentinel密码
requirepass 654321

# 在三台Redis节点下的sentinel.conf文件中配置sentinel的启动方式为后台启动
# 为了方便测试此处不以后台启动的方式启动sentinel。就在当前窗口启动sentinel方便查看启动sentinel时的日志信息(daemonize no)
daemonize yes

15.启动三台Redis节点中的三个sentinel实例

# 启动三台Redis节点下的三个sentinel实例(因为是在redis解压目录下启动sentinel实例所以sentinel.conf使用的是相对路径)
redis-sentinel sentinel.conf

16.查看启动日志

192.168.1.130(master)

192.168.1.131(slave1)

192.168.1.132(slave2)

三.测试哨兵集群

        目前已知master节点为192.168.157.130。测试关闭master节点的redis服务观察sentinel(哨兵)是否会重新选举一个新的master节点出来;

1.关闭192.168.157.130master节点服务

2.观察两个从节点sentinel情况

192.168.157.131

192.168.157.132

3.sentinel新选举的主节点为192.168.157.132

四.RedisTemplate连接哨兵

1.pom.xml

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.0</version>
    </parent>

    <dependencies>
        <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>
    </dependencies>

2.配置yml

spring:
  redis:
    password: 123456 # redis的访问密码
    sentinel:
      master: mymaster # 指定sentinel集群名称
      password: 654321 # sentinel的访问密码
      nodes: # 指定redis-sentinel集群信息
        - 192.168.157.130:26379
        - 192.168.157.131:26379
        - 192.168.157.132:26379

# 日志相关配置
logging:
  level:
    io.lettuce.core: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS

3.配置Redis读写分离

        写操作:

                一直都是主节点;

        读操作:

                可选用下面适当的读取策略;

import io.lettuce.core.ReadFrom;
import org.springframework.boot.autoconfigure.data.redis.LettuceClientConfigurationBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * 配置Redis集群读写分离
 */
@Configuration
public class RedisConfig {
    @Bean
    public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){
        return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
    }
}

4.编写测试Controller

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/redis")
public class RedisController {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 获取值
     */
    @GetMapping("/get/{key}")
    public String getValue(@PathVariable String key){
        return stringRedisTemplate.opsForValue().get(key);
    }

    /**
     * 设置值
     */
    @GetMapping("/set/{key}/{value}")
    public String setValue(@PathVariable String key,@PathVariable String value){
        stringRedisTemplate.opsForValue().set(key,value);
        return "success";
    }
}

5.测试

        上面controller中提供了两个方法,getValue(读取数据),setValue(保存数据),因为上面Redis已经配置了读写分离所以先测试读写分离;

目前集群分布情况:

        主节点:192.168.157.132

        从节点:192.168.157.130 ~ 192.168.157.131

1.测试读写分离

        写操作:

 

使用了192.168.157.132这个主节点去执行了写操作;

        读操作:

使用了192.168.157.131这个从节点去执行了读操作

2.测试主从故障切换

        即主节点192.168.157.132宕机,哨兵重新选出主节点后测试数据读写;

1.关闭主节点192.168.157.132的Redis服务模拟宕机

2.执行INFO REPLICATION命令查看最新的主从节点分布情况

        目前主节点已自动由192.168.157.132切换至192.168.157.130;

3.测试读写操作

        写操作:

使用了192.168.157.130这个主节点去执行了写操作;

        读操作:

 

      使用了192.168.157.131这个从节点去执行了读操作;

<think>我们正在讨论Redis哨兵模式配置与实现。根据引用内容,用户提供了几个配置示例,但我们需要系统地解释哨兵模式配置步骤和实现原理。步骤1:理解哨兵模式Redis哨兵(Sentinel)是一个分布式系统,用于管理多个Redis实例(主从结构),提供自动故障转移(failover)和高可用性。哨兵模式的核心功能包括:-监控:哨兵定期检查主节点和从节点的状态。-通知:当被监控的实例出现问题时,哨兵可以通过API通知系统管理员或其他程序。-自动故障转移:如果主节点故障,哨兵会启动故障转移过程:选择一个从节点晋升为主节点,并让其他从节点复制新的主节点。-配置提供者:客户端可以通过哨兵获取当前主节点的地址。步骤2:配置哨兵模式的基本步骤根据引用[2]和引用[3],配置哨兵模式通常包括以下步骤:1.准备Redis主从结构:首先需要配置一个主节点和至少一个从节点。例如:-主节点:运行在127.0.0.1:6380-从节点1:运行在127.0.0.1:6381-从节点2:运行在127.0.0.1:63822.创建哨兵配置文件:每个哨兵实例需要一个配置文件。通常,我们会创建多个哨兵实例(通常为奇数,如3个)以实现哨兵自身的容错。以配置三个哨兵为例(端口分别为26380,26381,26382):-复制模板配置文件:创建三个哨兵配置文件(如sentinel-26380.conf,sentinel-26381.conf,sentinel-26382.conf)。-修改每个配置文件,主要设置:port<哨兵端口>#每个哨兵使用不同端口daemonizeyes#以守护进程方式运行sentinelmonitor<master-group-name><master-ip><master-port><quorum>sentinelauth-pass<master-group-name><password>#如果主节点有密码例如:sentinelmonitormymaster127.0.0.163802sentinelauth-passmymaster123456注意:`<quorum>`(法定人数)是判定主节点故障至少需要的哨兵数量。这里设置为2,表示需要至少两个哨兵同意才能判定主节点故障。3.启动哨兵redis-sentinel/path/to/sentinel-26380.confredis-sentinel/path/to/sentinel-26381.confredis-sentinel/path/to/sentinel-26382.conf4.验证:连接到一个哨兵实例,使用`infoSentinel`命令查看状态。步骤3:哨兵模式的工作原理-哨兵通过发送PING命令定期检查主从节点的健康状态。-如果主节点在配置的`down-after-milliseconds`时间内未回复,哨兵将其标记为“主观下线”。-当足够数量的哨兵(达到quorum)都将主节点标记为主观下线时,主节点被标记为“客观下线”。-然后,哨兵会选举一个领导者哨兵(使用Raft算法)来执行故障转移。-领导者哨兵选择一个从节点(通常选择数据最新的从节点)晋升为主节点,并让其他从节点复制新的主节点。-最后,哨兵更新配置:将旧主节点(如果重新上线)设置为新主节点的从节点。步骤4:注意事项-哨兵数量:通常至少需要3个哨兵以确保系统在部分故障时仍能正常工作(容忍一个哨兵故障)。-网络分区:哨兵系统需要大多数哨兵可达才能做出决策,因此奇数个哨兵(如3或5)可以避免脑裂。-客户端:客户端需要支持哨兵,能够通过查询哨兵获取当前主节点地址。步骤5:配置示例参考引用[2]中的配置片段,一个哨兵配置文件(如sentinel-26382.conf)可能如下:```plaintextport16382daemonizeyessentinelmonitormymaster127.0.0.163802sentinelauth-passmymaster123456```步骤6:启动和停止引用[3]展示了如何停止和启动所有节点(包括主从和哨兵)的示例命令。注意:生产环境中应避免直接使用kill命令,应使用服务管理工具。总结:Redis哨兵模式提供了高可用性,配置过程包括设置主从复制、配置多个哨兵实例以及启动哨兵哨兵通过监控和自动故障转移确保Redis服务在节点故障时继续运行。§§相关问题§§1.Redis哨兵模式与集群模式有什么区别?2.如何配置哨兵的故障转移通知?3.哨兵模式在故障转移过程中如何处理客户端连接?4.如何监控哨兵系统的状态?</think>### Redis哨兵模式配置与实现 Redis哨兵(Sentinel)是一种高可用解决方案,用于监控主从架构中的Redis实例,实现自动故障检测和故障转移。以下是关键配置步骤和实现原理: #### **一、核心配置步骤** 1. **创建哨兵配置文件** 复制模板并修改端口和监听对象(每个哨兵独立配置): ```bash cp sentinel-26380.conf sentinel-26381.conf cp sentinel-26380.conf sentinel-26382.conf ``` 配置文件内容示例: ```plaintext port 16381 # 哨兵端口 daemonize yes # 后台运行 sentinel monitor mymaster 127.0.0.1 6380 2 # 监控主节点,2为法定同意数 sentinel auth-pass mymaster 123456 # 主节点密码 ``` [^2] 2. **启动哨兵进程** 分别启动三个哨兵节点: ```bash redis-sentinel sentinel-16380.conf redis-sentinel sentinel-16381.conf redis-sentinel sentinel-16382.conf ``` [^2] 3. **验证哨兵状态** 连接Redis执行命令查看哨兵信息: ```bash redis-cli -p 16381 info Sentinel # 输出主节点状态、从节点列表等 ``` 4. **故障转移流程** - 哨兵通过PING命令检测节点健康 - 主节点超时未响应 → 标记为**主观下线** - 多数哨兵确认 → 升级为**客观下线** - 选举领导者哨兵执行故障转移 - 选择数据最新的从节点晋升为新主节点 - 更新其他从节点复制目标 #### **二、关键参数解析** | 配置项 | 说明 | 示例 | |--------|------|------| | `sentinel monitor <name> <ip> <port> <quorum>` | 定义监控的主节点 | `sentinel monitor mymaster 127.0.0.1 6380 2` | | `sentinel down-after-milliseconds` | 判定节点失效的毫秒数 | 默认30,000ms | | `sentinel failover-timeout` | 故障转移超时时间 | 默认180,000ms | | `sentinel parallel-syncs` | 故障转移时同步新主的从节点数 | 默认1 | #### **三、实现原理** 1. **分布式监控** 多个哨兵节点组成集群,通过Gossip协议通信,避免单点故障。 2. **Raft共识算法** 故障转移时通过Raft选举领导者哨兵,需满足: $$ \text{同意票数} \geq \left\lfloor \frac{\text{哨兵总数}}{2} \right\rfloor + 1 $$ 3. **配置自动传播** 新主节点确认后,哨兵自动修改其他节点的`redis.conf`和`sentinel.conf`,更新主节点地址[^1]。 #### **四、注意事项** 1. **节点数量** 推荐部署**至少3个哨兵**(奇数个),法定人数(quorum)通常设为 $\frac{N}{2} + 1$(N为哨兵总数)。 2. **网络分区处理** 当网络分裂时,少数分区中的旧主节点会被置为只读模式,防止数据冲突。 3. **客户端集成** 客户端需支持哨兵协议,通过`SENTINEL get-master-addr-by-name`动态获取主节点地址。 > **故障转移演示**: > 当主节点(6380)宕机时,哨兵日志会显示: > ```plaintext > +sdown master mymaster 127.0.0.1 6380 # 检测到故障 > +vote-for-leader ... # 开始选举 > +failover-state-select-slave master mymaster # 选择新主 > +promote-slave slave 127.0.0.1:6381 ... # 提升从节点 > +switch-master mymaster 127.0.0.1 6380 127.0.0.1 6381 # 切换完成 > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值