Redis哨兵模式以及主从
目录
Redis哨兵概述
哨兵模式的核心功能
哨兵模式的架构
哨兵模式的工作流程
哨兵模式的配置示例
哨兵模式的优缺点
哨兵模式与Redis Cluster的区别
最佳实践
Redis主从配置
Redis哨兵
Redis哨兵概述
Redis哨兵模式(Sentinel)是Redis提供的一种高可用性解决方案,主要用于监控Redis主从集群中的主节点(Master)和从节点(Slave),并在主节点发生故障时自动完成故障转移,确保Redis服务的持续可用性。以下是对Redis哨兵模式的全面概述:
哨兵模式的核心功能
- 监控(Monitoring)
- 哨兵节点会持续监控Redis主节点和从节点的运行状态,包括心跳检测(每秒一次
PING
命令)。 - 若主节点在指定时间内(
down-after-milliseconds
)未响应,哨兵会标记主节点为“主观下线”(SDOWN)。
- 哨兵节点会持续监控Redis主节点和从节点的运行状态,包括心跳检测(每秒一次
- 故障通知(Notification)
- 当哨兵发现主节点故障时,会通过Redis的发布/订阅机制或API通知管理员或其他系统。
- 自动故障转移(Automatic Failover)
- 若多个哨兵节点(默认超过半数)确认主节点为“客观下线”(ODOWN),则会选举一个哨兵作为领导者(Leader),负责执行故障转移。
- 领导者哨兵会从从节点中选举一个新主节点(通常选择
slave-priority
最高或数据最新的从节点),并提升其为主节点。 - 其他从节点会重新配置为新主节点的从节点。
- 配置提供者(Configuration Provider)
- 哨兵模式为客户端提供最新的主节点地址,客户端通过哨兵获取主节点信息(通过
SENTINEL get-master-addr-by-name
命令)。
- 哨兵模式为客户端提供最新的主节点地址,客户端通过哨兵获取主节点信息(通过
哨兵模式的架构
- 哨兵节点(Sentinel Nodes)
- 多个哨兵节点组成集群,通过Gossip协议通信,共享主从节点的状态信息。
- 哨兵节点本身也是Redis实例,但仅用于监控和故障转移,不存储数据。
- 主从节点(Master-Slave Nodes)
- 主节点负责写操作,从节点负责读操作(通过
replicaof
命令配置)。 - 主从节点之间通过异步复制同步数据。
- 主节点负责写操作,从节点负责读操作(通过
- 客户端(Clients)
- 客户端通过哨兵获取主节点地址,并直接连接主节点进行写操作,连接从节点进行读操作。
哨兵模式的工作流程
- 初始化阶段
- 启动哨兵节点,配置主节点名称(
sentinel monitor <master-name> <ip> <port> <quorum>
)。 - 哨兵节点与主节点建立连接,并发现所有从节点。
- 启动哨兵节点,配置主节点名称(
- 监控阶段
- 哨兵节点定期向主从节点发送
PING
命令,检查其存活状态。 - 若主节点未响应,哨兵会标记其为“主观下线”,并询问其他哨兵节点的意见。
- 哨兵节点定期向主从节点发送
- 故障转移阶段
- 若超过
quorum
个哨兵节点确认主节点“客观下线”,则选举领导者哨兵。 - 领导者哨兵选择新主节点,并发送
SLAVEOF NO ONE
命令将其提升为主节点。 - 其他从节点执行
SLAVEOF <new-master-ip> <new-master-port>
命令,重新配置为新主节点的从节点。
- 若超过
- 通知阶段
- 哨兵节点通过发布/订阅机制通知客户端主节点地址已变更。
哨兵模式的配置示例
# sentinel.conf 配置示例 | |
sentinel monitor mymaster 127.0.0.1 6379 2 # 监控主节点,quorum=2 | |
sentinel down-after-milliseconds mymaster 30000 # 30秒无响应则标记为主观下线 | |
sentinel failover-timeout mymaster 180000 # 故障转移超时时间 | |
sentinel parallel-syncs mymaster 1 # 故障转移时同步的从节点数量 |
哨兵模式的优缺点
- 优点
- 高可用性:自动故障转移,减少人工干预。
- 配置简单:通过哨兵配置文件即可管理主从集群。
- 扩展性强:支持动态添加哨兵节点和从节点。
- 缺点
- 脑裂问题:若网络分区导致部分哨兵无法与其他节点通信,可能误判主节点下线。
- 数据一致性:主从复制是异步的,故障转移时可能丢失少量数据。
- 性能开销:哨兵节点需要额外的资源(CPU、内存)。
哨兵模式与Redis Cluster的区别
特性 | 哨兵模式 | Redis Cluster |
---|---|---|
高可用性 | 通过故障转移实现 | 通过分片和冗余实现 |
数据分片 | 不支持 | 支持(将数据分散到多个节点) |
扩展性 | 仅支持垂直扩展(增加从节点) | 支持水平扩展(增加节点) |
适用场景 | 小规模集群,读写分离 | 大规模集群,需要分片和容错 |
最佳实践
- 哨兵节点数量
- 建议至少3个哨兵节点,部署在不同物理机上,避免单点故障。
- 网络配置
- 确保哨兵节点与主从节点之间的网络延迟低,避免误判。
- 监控与告警
- 结合监控工具(如Prometheus、Grafana)实时监控哨兵和Redis状态。
- 测试故障转移
- 定期模拟主节点故障,验证哨兵模式的可用性。
Redis主从配置
三台redis配置是一样的,一主两从
关闭防火墙
[root@localhost ~]# systemctl stop firewalld #防火墙
[root@localhost ~]# setenforce 0 #内核
下载redis所依赖的插件
[root@localhost ~]# dnf -y install gcc
解压redis的安装包
[root@localhost ~]# tar zxf redis-6.2.4.tar.gz
初始化并且指定安装位置
[root@localhost ~]# cd redis-6.2.4
[root@localhost ~]# make #编译
[root@localhost ~]# make PREFIX=/usr/local/redis install #指定安装位置
系统环境
[root@localhost redis-6.2.4]# ln -s /usr/local/redis/bin/* /usr/local/bin/
创建配置文件位置
[root@localhost redis-6.2.4]# mkdir /etc/redis
复制配置文件至/etc/redis
[root@localhost redis-6.2.4]# cp redis.conf /etc/redis/6379.conf
使systemd可以使用redis命令
[root@localhost redis-6.2.4]# cd /lib/systemd/system
[root@localhost system]# vim redis.service
[Unit]
Description=redis
After=network.target[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /etc/redis/6379.conf[Install]
WantedBy=multi-user.target
修改配置文件
[root@localhost system]# vim /etc/redis/6379.conf
75
101:bind 127.0.0.1 192.168.10.101 #监听本机
102:bind 127.0.0.1 192.168.10.102
103:bind 127.0.0.1 192.168.10.103
257
daemonize yes
302
logfile "/var/log/redis_6379.log"
重载下systemd的配置
[root@localhost system]# systemctl daemon-reloa
启动redis
[root@localhost ]# systemctl start redis
可以通过查看端口查看redis运行起来了没
[root@localhost system]# netstat -anpt |grep redis
两个从节点需要更改以下配置
[root@localhost system]# vim /etc/redis/6379.conf
478行
replicaof 192.168.10.101 6379 将master指向101
验证:
登录主节点 查看状态
[root@localhost system]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.10.103,port=6379,state=online,offset=337325,lag=0
slave1:ip=192.168.10.102,port=6379,state=online,offset=337325,lag=0
master_failover_state:no-failover
master_replid:4b5a90d4742ac9ebfa4eda62a8274b2b56c21e31
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:337465
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:337465
Redis哨兵
三台哨兵 上面主从就不用更改了
三台哨兵配置一样
关闭防火墙以及系统内核
[root@localhost ~]# systemctl stop firewalld #防火墙
[root@localhost ~]# setenforce 0 #内核
下载Redis所需要的插件
[root@localhost ~]# dnf -y install gcc
解压
[root@localhost ~]# tar zxf redis-6.2.4.tar.gz
编译
[root@localhost ~]# cd redis-6.2.4
[root@localhost ~]# make
[root@localhost redis-6.2.4]# make install #这里make指定安装位置不一定生效 我查看过 没有被移动到指定的安装位置 主从可以指定安装位置并且 生效 哨兵不太行
移动到我们所需要的安装位置
[root@localhost ~]# mv redis-6.2.4 /usr/local/redis #移动至我们所需要的位置
创建配置文件路径
[root@localhost redis-6.2.4]# mkdir /etc/redis
将配置文件复制过来
[root@localhost redis-6.2.4]# cp redis.conf /etc/redis/6379.conf
环境变量
[root@localhost redis-6.2.4]# ln -s /usr/local/redis/bin/* /usr/local/bin/
修改配置文件
[root@localhost redis-6.2.4]# vim /etc/redis/6379.conf
75行
bind 0.0.0.0
257行
daemonize yes
#末尾添加 shift+G查看文件末尾
sentinel monitor master 192.168.10.101 6379 2
支持systemd命令
[root@localhost system]# vim redis.service
[Unit]
Description=redis
After=network.target[Service]
Type=forking
ExecStart=/usr/local/bin/redis-sentinel /etc/redis/6379.conf[Install]
WantedBy=multi-user.target
重载启动
[root@localhost system]# systemctl daemon-reload
[root@localhost bin]# systemctl start redis
查看哨兵运行状态
[root@localhost ~]# netstat -anpt |grep redis
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 6422/redis-sentinel
tcp 0 0 192.168.10.104:52701 192.168.10.102:6379 ESTABLISHED 6422/redis-sentinel
tcp 0 0 192.168.10.104:6379 192.168.10.105:50665 ESTABLISHED 6422/redis-sentinel
tcp 0 0 192.168.10.104:37157 192.168.10.101:6379 ESTABLISHED 6422/redis-sentinel
tcp 0 0 192.168.10.104:45287 192.168.10.106:6379 ESTABLISHED 6422/redis-sentinel
tcp 0 0 192.168.10.104:48779 192.168.10.103:6379 ESTABLISHED 6422/redis-sentinel
tcp 0 0 192.168.10.104:33239 192.168.10.103:6379 ESTABLISHED 6422/redis-sentinel
tcp 0 0 192.168.10.104:57135 192.168.10.101:6379 ESTABLISHED 6422/redis-sentinel
tcp 0 0 192.168.10.104:51199 192.168.10.102:6379 ESTABLISHED 6422/redis-sentinel
tcp 0 0 192.168.10.104:6379 192.168.10.106:51629 ESTABLISHED 6422/redis-sentinel
tcp 0 0 192.168.10.104:56731 192.168.10.105:6379 ESTABLISHED 6422/redis-sentinel
登录哨兵查看节点信息
[root@localhost ~]# redis-cli
127.0.0.1:6379> 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=master,status=ok,address=192.168.10.101:6379,slaves=2,sentinels=3masters=一个主节点
slaves=两个从节点
sentinels=三台哨兵
后续可以登录到主节点给主节点整坏 关闭pc或者停止redis的运行
主从整坏:给主节点redis停止运行
从节点切换主
slaveof on one
info replication #查看状态
从就是主了,但03从的主还是101,并不是很实用,所以还是给101启动起来将02改回去
slaveof 192.168.10.101 6379
哨兵:给主节点关闭或者停止
查看哨兵状态 哨兵会以投票的方式选出新的主,原来的主修好后并不会抢占新的主