【缓存与加速技术实践】Redis哨兵

文章目录

Redis哨兵

在主从复制的基础上,哨兵实现了自动化的故障恢复。
缺陷:写操作无法负载均衡;存储能力受到单机的限制;哨兵无法对从节点进行自动故障转移,在读写分离场景下,从节点故障会导致读服务不可用,需要对从节点做额外的监控、切换操作。

核心功能

  1. 监控:哨兵节点会不断地检查主节点和从节点的状态,包括它们的健康情况和配置信息。
  2. 自动故障转移:当主节点出现故障时,哨兵会自动选择一个从节点作为新的主节点,并更新其他从节点的配置,使它们指向新的主节点。这个过程是自动完成的,无需人工干预。
  3. 通知:哨兵可以将故障转移的结果通知给客户端,使客户端能够及时更新连接信息。

结构

哨兵模式由两部分组成:哨兵节点和数据节点。

  • 哨兵节点:哨兵节点是特殊的Redis节点,它们不存储数据,而是专注于监控和故障转移。哨兵节点之间通过相互通信来共享信息和协调行动。
  • 数据节点:数据节点包括主节点和从节点,它们存储实际的数据。主节点负责处理写操作,而从节点则复制主节点的数据,负责处理读操作。

故障转移机制

故障转移机制是哨兵模式的核心功能之一,它包括以下几个步骤:

  1. 主观下线:每个哨兵节点都会定期向主节点和从节点发送心跳检测(通常是PING命令)。如果主节点在一定时间范围内没有响应,哨兵节点就会认为主节点已经主观下线。
  2. 客观下线:当超过半数哨兵节点认为主节点主观下线时,主节点就会被标记为客观下线。这意味着主节点确实已经出现故障,需要进行故障转移。
  3. 选举Leader:在确认主节点客观下线后,哨兵节点会通过Raft算法(或其他选举算法)选举出一个Leader哨兵节点。Leader哨兵节点负责执行故障转移操作。
  4. 执行故障转移:Leader哨兵节点会选择一个合适的从节点作为新的主节点,并更新其他从节点的配置信息。同时,如果原主节点恢复,它会被重新配置为从节点,并指向新的主节点。
  5. 通知客户端:最后,哨兵会将故障转移的结果通知给客户端,使客户端能够更新连接信息并继续访问Redis服务。

主节点的选举

在选择新的主节点时,哨兵会遵循以下原则:

  1. 健康性:首先排除那些已经下线的从节点。
  2. 优先级 :然后选择配置文件中优先级最高的从节点。优先级可以通过replica-priority配置项进行设置。
  3. 复制偏移量:如果多个从节点具有相同的优先级,哨兵会选择复制偏移量最大的从节点作为新的主节点。复制偏移量反映了从节点复制主节点数据的进度和完整性。

哨兵的启动

哨兵模式的启动依赖于主从模式的配置。因此,在配置哨兵模式之前,必须确保主从模式已经正确安装和配置。然后,可以通过启动哨兵节点来监控和保护Redis集群的高可用性。

Redis哨兵搭建指南

Redis哨兵模式搭建指南

1. 准备工作

  • Master节点:IP地址为192.168.80.10

  • Slave1节点:IP地址为192.168.80.11

  • Slave2节点:IP地址为192.168.80.12

  • 在所有节点上停止防火墙服务并设置SELinux为宽容模式:

    bash 复制代码
    systemctl stop firewalld
    setenforce 0

2. 修改Redis哨兵模式的配置文件(所有节点操作)

  • 复制哨兵配置文件到指定目录并更改所有权:

    bash 复制代码
    cp /opt/redis-7.0.9/sentinel.conf /usr/local/redis/conf/
    chown redis.redis /usr/local/redis/conf/sentinel.conf
  • 编辑哨兵配置文件(/usr/local/redis/conf/sentinel.conf),进行以下更改:

    conf 复制代码
    # 关闭保护模式
    protected-mode no
    
    # Redis哨兵默认的监听端口
    port 26379
    
    # 指定sentinel为后台启动
    daemonize yes
    
    # 指定PID文件
    pidfile /usr/local/redis/log/redis-sentinel.pid
    
    # 指定日志存放路径
    logfile "/usr/local/redis/log/sentinel.log"
    
    # 指定数据库存放路径
    dir /usr/local/redis/data
    
    # 配置哨兵监控主节点
    # 格式:sentinel monitor <master-name> <ip> <port> <quorum>
    # 其中<quorum>表示判定主节点故障所需的哨兵节点数
    sentinel monitor mymaster 192.168.80.10 6379 2
    
    # 如果主节点设置了密码,则取消以下行的注释并设置密码
    # sentinel auth-pass mymaster abc123
    
    # 判定服务器down掉的时间周期,默认30000毫秒(30秒)
    sentinel down-after-milliseconds mymaster 3000
    
    # 同一个sentinel对同一个master两次failover之间的间隔时间(180秒)
    sentinel failover-timeout mymaster 180000

3. 启动哨兵模式

  • 先启动Master节点上的Redis服务,再启动Slave节点上的Redis服务

  • 在所有节点上启动哨兵服务:

    bash 复制代码
    cd /usr/local/redis/conf/
    redis-sentinel sentinel.conf &

4. 查看哨兵信息

  • 使用以下命令查看哨兵信息:

    bash 复制代码
    redis-cli -p 26379 info Sentinel

    预期输出示例:

    复制代码
    # Sentinel
    sentinel_masters:1
    sentinel_tilt:0
    sentinel_running_scripts:0
    sentinel_scripts_queue_length:0
    sentinel_simulate_failure_flags:0
    master0:name=mymaster,status=ok,address=192.168.80.10:6379,slaves=2,sentinels=3

5. 故障模拟

  • 查看Redis服务进程号

    bash 复制代码
    ps -ef | grep redis
  • 杀死Master节点上的Redis服务进程

    bash 复制代码
    # 替换为实际的Master节点Redis服务进程号
    kill -9 <Master_Redis_PID>
  • 验证故障转移结果

    • 查看哨兵日志以确认故障转移过程:

      bash 复制代码
      tail -f /usr/local/redis/log/sentinel.log
    • 再次使用redis-cli -p 26379 info Sentinel查看哨兵信息,确认新的主节点。

预期输出示例(故障转移后):

复制代码
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_tilt_since_seconds:-1
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.80.11:6379,slaves=2,sentinels=3

注意

  • 哨兵数量:为确保故障转移的有效性,哨兵节点的数量应至少为3个。
  • 网络配置:确保所有节点之间的网络连接正常。
  • 安全性 :如果主节点设置了密码,请确保在哨兵配置文件中正确配置了sentinel auth-pass
  • 监控与日志:定期监控哨兵日志和Redis服务状态,以确保系统健康运行。

哨兵failover

复制代码
vim sentinel.conf

sentinel client-reconfig-script mymaster /etc/redis/failover.sh

Sentinel 在做 failover 的时候会执行这个脚本,并且传递 7 个参数 master-name、role、state、from-ip、from-port、to-ip、to-port,其中 to-ip 是新主 Redis 的 IP 地址,可以在这个脚本里做 VIP 漂移操作。

复制代码
vim /etc/redis/failover.sh

#!/bin/bash
#新master的ip地址
MASTER_IP=${6}
#当前服务器IP
LOCAL_IP='192.168.80.13'

VIP='192.168.80.200'
NETMASK='24'
INTERFACE='ens33'

if [ "${MASTER_IP}" = "${LOCAL_IP}" ]; then
    #将VIP绑定到该服务器上
    /sbin/ip addr add ${VIP}/${NETMASK} dev ${INTERFACE}
    /sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE}
    exit 0
else
    #将VIP从该服务器上删除
    /sbin/ip addr del ${VIP}/${NETMASK} dev ${INTERFACE}   
    exit 0
fi
#如果返回1,sentinel会一直执行这个脚本
exit 1

chmod +x /etc/redis/failover.sh

#手动绑定VIP到当前主redis服务器上
/sbin/ip  addr add 192.168.80.200/24 dev ens33
/sbin/arping -q -c 3 -A 192.168.80.200 -I ens33
相关推荐
赴33513 分钟前
Xftp8传输文件与 Linux 系统 Anaconda 安装
linux·anaconda·xftp
.Shu.20 分钟前
Redis zset 渐进式rehash 实现原理、触发条件、执行流程以及数据一致性保障机制【分步源码解析】
数据库·redis·缓存
君不见,青丝成雪20 分钟前
大数据技术栈 —— Redis与Kafka
数据库·redis·kafka
悟能不能悟22 分钟前
排查Redis数据倾斜引发的性能瓶颈
java·数据库·redis
切糕师学AI23 分钟前
.net core web程序如何设置redis预热?
redis·.netcore
DemonAvenger33 分钟前
事务管理:ACID特性与隔离级别详解
数据库·mysql·性能优化
励志五个月成为嵌入式糕手42 分钟前
0819 使用IP多路复用实现TCP并发服务器
java·服务器·tcp/ip
Mi_Manchikkk1 小时前
Java高级面试实战:Spring Boot微服务与Redis缓存整合案例解析
java·spring boot·redis·缓存·微服务·面试
源远流长jerry1 小时前
STM32之MCU和GPIO
linux·c++·stm32·单片机·嵌入式硬件
华纳云IDC服务商1 小时前
服务器Linux防火墙怎样实现访问控制
linux·运维·服务器