文章目录
- 什么是哨兵模式
- 哨兵模式的优缺点
- 主观下线和客观下线
- 投票选举
- 哨兵模式场景应用
- Redis version 6.0.5 集群搭建
- 下载文件
- 环境安装
- 解压
- 编译
- 配置文件
- 启动
- 关闭
- 密码设置
什么是哨兵模式
哨兵模式是Redis的高可用解决方案之一,它旨在提供自动故障转移和故障检测的功能。在传统的Redis部署中,单个Redis节点可能成为单点故障,一旦该节点宕机,整个系统将不可用。为了解决这个问题,哨兵模式引入了多个Redis节点,其中一个节点被选为主节点,其他节点作为从节点。
在上面模式中,哨兵主要有几个作用:
- 监控状态:会向所有监控对象每秒发送ping命令,通过是否有响应来判断master和所有slave节点状态。
- 故障转移:当一旦发现Master节点异常,它将尝试进行故障转移,选择新的slave节点为master节点,并通过发布订阅的方式通知其他slave节点修改配置。
但在上面的模式中,哨兵节点也存在单点故障。因此,为防止Sentinel发生意外,Sentinel也需要实现集群高可用。
哨兵模式的优缺点
优点:
自动故障转移,提高系统的高可用性。
具有主从复制模式的所有优点,如数据冗余和读写分离。
缺点:
配置和管理相对复杂。
依然无法实现数据分片,受单节点内存限制。
主观下线和客观下线
主观下线是指一个哨兵节点认为主节点不可用,但它并不确定其他哨兵节点是否也认为主节点不可用。当一个哨兵节点在一定时间(配置参数:down-after-milliseconds)内无法与主节点通信(比如发送PING命令没有收到响应),它会认为主节点下线。但在这个阶段,其他哨兵节点并不知道这个节点的状态,仅有一个哨兵主观地认为主节点宕机。
客观下线是指一个主节点被多数哨兵节点认定为不可用。当一个哨兵节点认为主节点宕机后,它会向其他哨兵节点询问对主节点的状态,并请求其他哨兵进行确认。如果多数(大多数至少需要半数加1)的哨兵节点都认为主节点不可用,那么主节点就会被判定为客观下线。客观下线意味着主节点的状态在整个哨兵集群中得到了确认。
主观下线和客观下线的引入是为了避免误判。如果只有一个哨兵节点认为主节点下线,那么很可能是网络抖动等原因导致的,此时并不应该进行故障转移。只有多数的哨兵节点都确认主节点下线,才能确保故障转移的正确性,保证整个集群的稳定性。
哨兵模式使用主观下线和客观下线状态的组合来实现可靠的主节点故障检测和故障转移,从而确保Redis集群的高可用性。
投票选举
在多Sentinel模式下,各节点会相互监控主从节点的健康状态。当主节点发生故障时,首先由Sentinel节点之间基于Raft算法进行投票选举,按照谁发现主节点故障谁去处理的原则,选举出一个领头Sentinel节点(Leader Sentinel)。这个领头Sentinel节点负责进行故障转移操作。
故障转移过程中,领头Sentinel节点会根据一定的规则在所有从节点中选择一个最优的从节点作为新的主节点(Master)。一般会选择复制偏移量最大且优先级较高的从节点作为新的主节点。然后,领头Sentinel节点通过发布订阅功能,通知其他从节点更改配置文件,将它们的连接从原来的主节点转移到新的主节点上。
对于客户端来说,连接Redis集群时首先连接到Sentinel节点,通过Sentinel节点查询主节点的地址。一旦主节点发生故障并进行了故障转移,Sentinel节点会将最新的主节点地址告知客户端。这样,客户端无需重启,就可以自动连接到新的主节点,实现高可用性的数据交互。
哨兵模式场景应用
高可用性要求较高的场景:通过自动故障转移,确保服务的持续可用。
数据备份和容灾恢复:在主从复制的基础上,提供自动故障转移功能。
总结:哨兵模式在主从复制模式的基础上实现了自动故障转移,提高了系统的高可用性。然而,它仍然无法实现数据分片。如果需要实现数据分片和负载均衡,可以考虑使用Cluster模式。
Redis version 6.0.5 集群搭建
下载文件
下载 命令 url 可找官网 复制
wget http://download.redis.io/releases/redis-6.0.5.tar.gz
环境安装
yum install gcc-c++
yum install cpp
yum install binutils
yum install glibc
yum install glibc-kernheaders
yum install glibc-common
yum install glibc-devel
yum install gcc
yum install make
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
解压
创建redis文件夹
cd /home
mkdir redis
cd redis
解压
tar -zxvf redis-6.0.5.tar.gz
重命名
mv redis-6.0.5 redis-1
复制
cp -r redis-1 redis-2
cp -r redis-1 redis-3
编译
cd /home/redis/redis-1
每一个redis执行下行命令
scl enable devtoolset-9 bash
如果以以下编译安装 的命令失败 基本上是因为 环境安装问题 可以直接百度 相关更全面的安装环境
make MALLOC=lib
make install
配置文件
重要的配置看截图,ip地址以及格式请注意
master redis.conf 配置
vim /home/redis/redis-1/redis.conf
bind 0.0.0.0
protected-mode yes
port 16379
supervised no
pidfile "/home/redis/pid/16379.pid"
loglevel notice
logfile "/home/redis/log/16379.log"
databases 16
dir "/home/redis/data"
dbfilename dump16379.rdb
appendonly yes # 开启 aof 默认不开启
appendfilename "appendonly_16379.aof"
daemonize yes
混合持久化模式的开启
master sentinel.conf 配置
bind 0.0.0.0
port 26379
pidfile /home/redis/pid/-sentinel-26379.pid
logfile "/home/redis/log/sentinel-26379.log"
下面配置的ip 配置公网ip port 配置 master redis.conf 配置中的port
sentinel monitor mymaster ip 16379 2
slave redis.conf
bind 0.0.0.0
port 16380
daemonize yes
pidfile "/home/redis/pid/16380.pid"
logfile "/home/redis/log/16380.log"
dir "/home/redis/data"
appendonly yes # 开启 aof 默认不开启
appendfilename "appendonly_16380.aof"
slaveof masterIp masterPort
slave sentinel.conf 配置
bind 0.0.0.0
port 26380
daemonize yes
pidfile "/home/redis/pid/sentinel-26380.pid"
logfile "/home/redis/log/sentinel-26380.log"
下面配置的ip 配置公网ip port 配置 master redis.conf 配置中的port
sentinel monitor mymaster MasterIP MasterPort 2
启动
启动脚本
#!/bin/bash
# 启动 Redis-Server
echo "Star Redis-Server ..."
redis-1/src/redis-server redis-1/redis.conf &
# sleep 1 睡眠1秒
# sleep 1s 睡眠1秒
# sleep 1m 睡眠1分
# sleep 1h 睡眠1小时
sleep 3
redis-2/src/redis-server redis-2/redis.conf &
redis-3/src/redis-server redis-3/redis.conf &
# 启动 Redis-Sentinel
echo "Star Redis-Sentinel ..."
redis-1/src/redis-sentinel redis-1/sentinel.conf &
redis-2/src/redis-sentinel redis-2/sentinel.conf &
redis-3/src/redis-sentinel redis-3/sentinel.conf &
关闭
关闭脚本
#!/bin/bash
# 停止 Redis-Server
echo "Shutdown Redis-Sentinel ..."
redis-1/src/redis-cli -h 公网ip -p 16379 shutdown
redis-2/src/redis-cli -h 公网ip -p 16380 shutdown
redis-3/src/redis-cli -h 公网ip -p 16381 shutdown
# 停止 Redis-Server
echo "Shutdown Redis-Server ..."
redis-1/src/redis-cli -h 公网ip -p 26379 -a 123456 shutdown
redis-2/src/redis-cli -h 公网ip -p 26380 -a 123456 shutdown
redis-3/src/redis-cli -h 公网ip -p 26381 -a 123456 shutdown
密码设置
# 两台机器一台master,一台slave,两个sentinel
#master修改
#1. redis.conf
requirepass 123456 #添加密码
#2. sentinel.conf
sentinel auth-pass mymaster 123456 #连接master密码
#slave修改
#1. redis.conf
masterauth 123456 #连接master密码
slaveof 10.100.134.109 6379 #slaveof表示该机器是slave,后边ip为master地址和端口
#2. sentinel.conf
sentinel auth-pass mymaster 123456 #连接master密码,这个配置一定要在sentinel monitor 配置之后