Redis哨兵架构(哨兵搭建,哨兵原理)

sentinel哨兵是特殊的Redis服务,不提供读写服务,主要用来监控redis实例节点,实现自动故障转移

一、Redis哨兵架构搭建

  1. 基于主从架构搭建一主两从架构
    在这里插入图片描述

  2. 准备开启三个哨兵节点,这里演示安装26379

  3. 复制sentinel.conf到26379目录下(目录自己指定)
    在这里插入图片描述

  4. 修改sentinel.conf配置

port 26379

daemonize yes

pidfile "/var/run/redis‐sentinel‐26379.pid"

logfile "26379.log"

dir "/usr/local/redis/26379/"

# sentinel monitor <master‐redis‐name> <master‐redis‐ip> <master‐redis‐port> <quorum>
# quorum是一个数字,指明当有多少个seninel(值一般为:sentinel总数/2+1)认为一个master失效时master才算失效
# mymaster 自己定义,客户端访问时需要
sentinel monitor mymaster 192.168.1.110 6379 2
  1. 启动哨兵实例
./bin/redis-sentinel ./26379/sentinel/sentinel.conf
./bin/redis-sentinel ./26380/sentinel/sentinel.conf
./bin/redis-sentinel ./26381/sentinel/sentinel.conf
  1. 查看哨兵是否启动成功
    在这里插入图片描述
  2. info命令查看哨兵信息
    在这里插入图片描述
  3. 查看sentinel.conf中的redis节点信息
    在这里插入图片描述

二、Java中使用哨兵架构

哨兵架构模式中,客户端访问Redis服务,第一次从哨兵服务中获取Redis主节点信息,后续就会直接访问主节点,不会再通过哨兵代理访问,当主节点发送变化后,哨兵会立即将新的主节点信息通知客户端(客户端一般都订阅了哨兵发布的节点变动信息)

  1. 引入依赖
<dependency>
   <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>22.0</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <!-- <scope>test</scope>-->
</dependency>
  1. 测试代码
/**
 * Jedis连接哨兵架构
 */
public class JedisSentinelTest {

    JedisSentinelPool jedisSentinelPool = null;

    @Before
    public void connect(){
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(20);
        config.setMaxIdle(10);
        config.setMinIdle(5);

        String masterName = "mymaster";

        Set<String> sentinels = new HashSet<>();
        sentinels.add(new HostAndPort("192.168.1.110",26379).toString());
        sentinels.add(new HostAndPort("192.168.1.110",26380).toString());
        sentinels.add(new HostAndPort("192.168.1.110",26381).toString());

        jedisSentinelPool = new JedisSentinelPool(masterName,sentinels,config,3000,null);

    }

    @Test
    public void testSentinel(){
        Jedis jedis = null;

        try {
            jedis=jedisSentinelPool.getResource();
            System.out.println(jedis.set("sentinel","1"));
            System.out.println(jedis.get("sentinel"));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (jedis!=null){
                jedis.close();
            }
        }
    }
}

  1. 运行结果
    在这里插入图片描述

三、哨兵机制原理

1. 哨兵机制解决了什么问题

哨兵主要是为了解决主从复制架构中出现宕机的情况,在主节点出现宕机时,哨兵会自动将主节点下的某个从节点升级为新的主节点

2. 哨兵定时监控

  1. 每个哨兵节点每10秒会向主节点和从节点发送info命令获取最新拓扑结构图,哨兵配置时只需要配置对主节点的监控即可,通过向主节点发送info命令,获取从节点的信息,并且当有新的从节点时可以立马感知到
  2. 每个哨兵节点每2秒会像redis数据节点的指定频道上发送该哨兵节点对于主节点的判断以及当前哨兵节点的信息,同时每个哨兵节点也会订阅该频道,来了解其他哨兵对主节点状态的判断,其实就是通过消息publish/subscribe来完成的
  3. 每一秒每个哨兵会向主节点,从节点,其他哨兵节点发送一次ping命令做一次心跳检测,这个也是哨兵用来判断节点是否正常的重要依据

3. 主观下线与客观下线

3.1 主观下线

主观下线就是单个哨兵认为某个节点下线

哨兵会以每秒一次的频率向所有与其建立连接的实例(主节点,从节点,其他哨兵节点)发送ping命令,通过判断ping回复是否有效,还是无效来判断实例是否在线

3.2 客观下线

当主观下线的节点是主观节点时,认为主节点主观下线的哨兵节点会通过指令sentinel is-masterdown-by-addr寻求其他哨兵节点对主节点的判断,当主观下线的个数超过quorum个数,此时大部分哨兵节点会都同意下线,这就是客观下线

4. 哨兵leader选举流程

主节点被判定为客观下线后,就需要选取一个哨兵节点来完成故障转移的工作,选举哨兵leader的流程如下:

  1. 每个在线的哨兵节点都可以成为leader,当它确认主节点下线后,会向其他哨兵发送is-master-down-by-addr命令,征求判断并要求把自己设置为leader
  2. 其他哨兵接收到这个命令后,可以同意或者拒绝它成为领导者
  3. 如果哨兵发现自己在选举的过程中的票数大于等于(sentinel/2 +1)时,它将成为leader,如果没有,继续选举

5. 自动故障转移

5.1 选择新的主节点

哨兵状态数据结构中保存了主服务的所有从服务的信息,哨兵leader会按照一定的规则选择出一个从节点成为新的主节点,选择规则如下:

  1. 过滤掉主观下线的节点
  2. 选择slave-priority最高的节点,如果有就返回,没有就继续选择
  3. 选择出复制偏移量最大的节点,复制偏移量越大则数据复制的越完整,有则返回,没有则继续
  4. 选择run_id最小的节点

5.2 更新主从状态

通过slaveof no one命令,让选择出来的从节点变为主节点,并通过slaveof命令让其他节点成为从节点
将已下线的主节点设置为新主节点的从节点,当它恢复正常时,从新的主节点复制数据
其他下线的从节点恢复正常时,哨兵会向其发送slaveof命令,让他成为新主的从节点

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
哨兵模式是基于主从复制模式的一种解决方案。在主从复制模式中,当主节点挂掉时,需要手动将某个从节点提升为新的主节点。而在哨兵模式中,多个哨兵节点会自动监控主节点的状态,并在主节点挂掉时选举出新的主节点。 哨兵模式的搭建步骤如下: 1. 首先,搭建Redis的主从复制模式。 2. 配置多个哨兵节点,以解决单点故障问题。可以在主节点上启动哨兵,也可以在从节点上启动哨兵。 3. 复制哨兵的配置文件到Redis的安装目录下,并与redis.conf配置文件放在一起。 4. 修改sentinel.conf文件中的参数,主要是定义哨兵节点要监控的主节点的IP、端口和密码等。 5. 启动哨兵节点,使用命令`./redis-sentinel ../etc/sentinel.conf`来指定哨兵配置文件进行启动。 6. 登录到哨兵节点,使用命令`./redis-cli -h 主节点IP -p 26379`来登录哨兵节点。如果未设置密码,则无需输入密码。 7. 验证主节点挂掉后,发现从节点自动成为新的主节点。当原来的主节点故障恢复并重新启动之后,它会自动成为从节点。 8. 在不修改redis.conf配置文件的情况下,重启新的主节点,发现它仍然是主节点,即使在redis.conf中定义了它是从节点。这与没有哨兵模式的主从模式有所不同,在只有主从模式的情况下,重启主节点后它仍然是主节点,重启从节点后它仍然是从节点,这是因为配置文件中定义了这种角色。 通过以上步骤,我们就可以成功搭建哨兵模式,实现Redis的高可用性。希望这些内容能帮助您更深入地理解Redis原理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [redis搭建哨兵模式(哨兵模式原理)](https://blog.csdn.net/MssGuo/article/details/127163216)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [redis进阶:哨兵模式工作原理搭建](https://blog.csdn.net/qq_24950043/article/details/127797798)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值