【缓存与加速技术实践】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
相关推荐
White_Mountain1 分钟前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship2 分钟前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站5 分钟前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle
老王笔记6 分钟前
GTID下复制问题和解决
mysql
装不满的克莱因瓶8 分钟前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
LIKEYYLL34 分钟前
GNU Octave:特性、使用案例、工具箱、环境与界面
服务器·gnu
云云3211 小时前
搭建云手机平台的技术要求?
服务器·线性代数·安全·智能手机·矩阵
云云3211 小时前
云手机有哪些用途?云手机选择推荐
服务器·线性代数·安全·智能手机·矩阵
cominglately2 小时前
centos单机部署seata
linux·运维·centos
魏 无羡2 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos