1. 首页 > Redis教程 > 正文

Redis教程FG023-Redis哨兵高可用部署实战

本文档风哥主要介绍Redis哨兵高可用部署实战,包括哨兵概念、哨兵架构、哨兵功能、哨兵规划、硬件要求、网络要求、哨兵部署、哨兵配置、哨兵操作、哨兵监控以及实战案例等内容,风哥教程参考Redis官方文档Sentinel等内容编写,适合DBA人员和开发人员在生产环境中使用。

Part01-基础概念与理论知识

1.1 哨兵概念

Redis Sentinel是Redis的高可用性解决方案,它可以监控Redis主从集群的健康状态,并在主节点故障时自动进行故障转移。哨兵的核心概念:

  • 哨兵节点:监控Redis主从集群的健康状态的特殊Redis实例
  • 主节点:负责处理写操作的Redis实例
  • 从节点:负责处理读操作并从主节点同步数据的Redis实例
  • 故障转移:当主节点故障时,从从节点中选举一个新的主节点的过程

1.2 哨兵架构

Redis Sentinel的架构:

  • 多个哨兵节点:通常部署3个或以上的哨兵节点,以提高可靠性
  • 主从集群:一个主节点和多个从节点
  • 哨兵之间的通信:哨兵节点之间通过Gossip协议通信,交换集群状态信息
  • 客户端连接:客户端通过哨兵获取主节点的地址

1.3 哨兵功能

Redis Sentinel的主要功能:

  • 监控:监控Redis主从集群的健康状态
  • 通知:当集群状态发生变化时,通知相关人员
  • 自动故障转移:当主节点故障时,自动从从节点中选举一个新的主节点
  • 配置管理:当故障转移发生时,自动更新集群的配置

更多视频教程www.fgedu.net.cn

Part02-生产环境规划与建议

2.1 哨兵规划

生产环境哨兵规划:

  • 哨兵数量:建议部署3个或以上的哨兵节点,以提高可靠性
  • 部署位置:哨兵节点应部署在不同的物理机器上,避免单点故障
  • 网络规划:确保哨兵节点之间以及哨兵节点与Redis节点之间的网络连接稳定
  • 配置规划:合理配置哨兵的参数,如quorum、down-after-milliseconds等

2.2 硬件要求

硬件要求:

  • CPU:哨兵节点对CPU的要求较低,一般1-2核即可
  • 内存:哨兵节点对内存的要求较低,一般512MB-1GB即可
  • 磁盘:哨兵节点对磁盘的要求较低,一般10GB即可
  • 网络:哨兵节点需要稳定的网络连接

2.3 网络要求

# 网络要求

## 1. 网络延迟
– 哨兵节点之间的网络延迟应尽可能低,建议不超过10ms
– 哨兵节点与Redis节点之间的网络延迟也应尽可能低

## 2. 网络带宽
– 哨兵节点之间的通信带宽要求较低
– 哨兵节点与Redis节点之间的通信带宽也要求较低

## 3. 网络稳定性
– 确保哨兵节点之间的网络连接稳定
– 确保哨兵节点与Redis节点之间的网络连接稳定

## 4. 网络安全
– 配置防火墙规则,只允许哨兵节点之间以及哨兵节点与Redis节点之间的通信
– 考虑使用专线或VPN连接

学习交流加群风哥QQ113257174

Part03-生产环境项目实施方案

3.1 哨兵部署

# 哨兵部署

## 1. 环境准备
# 主节点:192.168.1.100:6379
# 从节点1:192.168.1.101:6379
# 从节点2:192.168.1.102:6379
# 哨兵节点1:192.168.1.100:26379
# 哨兵节点2:192.168.1.101:26379
# 哨兵节点3:192.168.1.102:26379

## 2. 配置主从集群
# 主节点配置(192.168.1.100)
$ vi /redis/app/redis.conf

bind 192.168.1.100
port 6379
requirepass fgedu@2026
repl-backlog-size 1mb

# 从节点1配置(192.168.1.101)
$ vi /redis/app/redis.conf

bind 192.168.1.101
port 6379
requirepass fgedu@2026
replicaof 192.168.1.100 6379
masterauth fgedu@2026

# 从节点2配置(192.168.1.102)
$ vi /redis/app/redis.conf

bind 192.168.1.102
port 6379
requirepass fgedu@2026
replicaof 192.168.1.100 6379
masterauth fgedu@2026

## 3. 配置哨兵节点1
$ vi /redis/app/sentinel.conf

bind 192.168.1.100
port 26379
dir /redis/fgdata
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel auth-pass mymaster fgedu@2026
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

## 4. 配置哨兵节点2
$ vi /redis/app/sentinel.conf

bind 192.168.1.101
port 26379
dir /redis/fgdata
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel auth-pass mymaster fgedu@2026
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

## 5. 配置哨兵节点3
$ vi /redis/app/sentinel.conf

bind 192.168.1.102
port 26379
dir /redis/fgdata
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel auth-pass mymaster fgedu@2026
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

## 6. 启动主从集群
$ systemctl start redis # 在主节点上执行
$ systemctl start redis # 在从节点1上执行
$ systemctl start redis # 在从节点2上执行

## 7. 启动哨兵节点
$ /redis/app/bin/redis-sentinel /redis/app/sentinel.conf # 在哨兵节点1上执行
$ /redis/app/bin/redis-sentinel /redis/app/sentinel.conf # 在哨兵节点2上执行
$ /redis/app/bin/redis-sentinel /redis/app/sentinel.conf # 在哨兵节点3上执行

3.2 哨兵配置详解

# 哨兵配置详解

## 1. 核心配置参数
– bind:绑定地址
– port:哨兵端口,默认26379
– dir:工作目录
– sentinel monitor:监控的主节点,格式为sentinel monitor
– sentinel auth-pass:主节点的密码
– sentinel down-after-milliseconds:判断主节点下线的时间阈值,单位毫秒
– sentinel parallel-syncs:故障转移后,从节点同步新主节点的并行数量
– sentinel failover-timeout:故障转移的超时时间,单位毫秒
– sentinel notification-script:故障转移时执行的脚本
– sentinel client-reconfig-script:客户端重新配置时执行的脚本

## 2. 配置示例
“`
bind 192.168.1.100
port 26379
dir /redis/fgdata
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel auth-pass mymaster fgedu@2026
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
“`

3.3 哨兵操作

# 哨兵操作

## 1. 查看哨兵状态
$ /redis/app/bin/redis-cli -h 192.168.1.100 -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.1.100:6379,slaves=2,sentinels=3

## 2. 查看主节点信息
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 26379 sentinel master mymaster

## 3. 查看从节点信息
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 26379 sentinel slaves mymaster

## 4. 查看哨兵节点信息
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 26379 sentinel sentinels mymaster

## 5. 手动触发故障转移
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 26379 sentinel failover mymaster

## 6. 检查主节点状态
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info replication

## 7. 检查从节点状态
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 info replication

3.4 哨兵监控

# 哨兵监控

## 1. 监控哨兵状态
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 26379 info sentinel

## 2. 监控主节点状态
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 26379 sentinel master mymaster

## 3. 监控从节点状态
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 26379 sentinel slaves mymaster

## 4. 监控哨兵节点状态
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 26379 sentinel sentinels mymaster

## 5. 使用监控工具
# 可以使用Prometheus + Grafana监控Redis Sentinel
# 可以使用Redis自带的监控命令
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 26379 monitor

风哥提示:Redis接口限流是保护系统的重要机制,合理的限流策略可以防止系统过载,确保系统的稳定性和可用性。在实际应用中,需要根据具体业务场景和数据特点,选择合适的限流算法和策略。

Part04-生产案例与实战讲解

4.1 哨兵部署实战

# 哨兵部署实战

## 1. 环境准备
# 主节点:192.168.1.100:6379
# 从节点1:192.168.1.101:6379
# 从节点2:192.168.1.102:6379
# 哨兵节点1:192.168.1.100:26379
# 哨兵节点2:192.168.1.101:26379
# 哨兵节点3:192.168.1.102:26379

## 2. 配置主从集群
# 主节点配置
$ vi /redis/app/redis.conf

bind 192.168.1.100
port 6379
requirepass fgedu@2026
repl-backlog-size 1mb

# 从节点1配置
$ vi /redis/app/redis.conf

bind 192.168.1.101
port 6379
requirepass fgedu@2026
replicaof 192.168.1.100 6379
masterauth fgedu@2026

# 从节点2配置
$ vi /redis/app/redis.conf

bind 192.168.1.102
port 6379
requirepass fgedu@2026
replicaof 192.168.1.100 6379
masterauth fgedu@2026

## 3. 配置哨兵节点
# 哨兵节点1配置
$ vi /redis/app/sentinel.conf

bind 192.168.1.100
port 26379
dir /redis/fgdata
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel auth-pass mymaster fgedu@2026
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

# 哨兵节点2配置
$ vi /redis/app/sentinel.conf

bind 192.168.1.101
port 26379
dir /redis/fgdata
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel auth-pass mymaster fgedu@2026
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

# 哨兵节点3配置
$ vi /redis/app/sentinel.conf

bind 192.168.1.102
port 26379
dir /redis/fgdata
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel auth-pass mymaster fgedu@2026
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

## 4. 启动主从集群
$ systemctl start redis # 在主节点上执行
$ systemctl start redis # 在从节点1上执行
$ systemctl start redis # 在从节点2上执行

## 5. 启动哨兵节点
$ /redis/app/bin/redis-sentinel /redis/app/sentinel.conf –daemonize yes # 在哨兵节点1上执行
$ /redis/app/bin/redis-sentinel /redis/app/sentinel.conf –daemonize yes # 在哨兵节点2上执行
$ /redis/app/bin/redis-sentinel /redis/app/sentinel.conf –daemonize yes # 在哨兵节点3上执行

## 6. 验证哨兵状态
$ /redis/app/bin/redis-cli -h 192.168.1.100 -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.1.100:6379,slaves=2,sentinels=3

## 7. 验证主从状态
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info replication

# 输出示例
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.101,port=6379,state=online,offset=12345,lag=0
slave1:ip=192.168.1.102,port=6379,state=online,offset=12345,lag=0
master_replid:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:12345
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:12345

4.2 故障转移测试

# 故障转移测试

## 1. 模拟主节点故障
$ systemctl stop redis # 在主节点上执行

## 2. 监控哨兵日志
$ tail -f /redis/app/log/redis-sentinel.log

## 3. 检查故障转移状态
$ /redis/app/bin/redis-cli -h 192.168.1.100 -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.1.101:6379,slaves=2,sentinels=3

## 4. 检查新主节点状态
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 info replication

# 输出示例
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.102,port=6379,state=online,offset=12345,lag=0
slave1:ip=192.168.1.100,port=6379,state=online,offset=12345,lag=0
master_replid:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
master_replid2:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
master_repl_offset:12345
second_repl_offset:12345
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:12345

## 5. 测试新主节点的写入能力
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 set test:failover “failover success”

# 输出示例
OK

## 6. 测试从节点的读取能力
$ /redis/app/bin/redis-cli -h 192.168.1.102 -p 6379 -a fgedu@2026 get test:failover
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 get test:failover

# 输出示例
“failover success”
“failover success”

## 7. 恢复原主节点
$ systemctl start redis # 在原主节点上执行

## 8. 检查原主节点状态
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info replication

# 输出示例
# Replication
role:slave
master_host:192.168.1.101
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:12345
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:12345
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:12345

4.3 哨兵管理实战

# 哨兵管理实战

## 1. 查看哨兵配置
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 26379 sentinel config get *

## 2. 修改哨兵配置
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 26379 sentinel config set mymaster down-after-milliseconds 10000

## 3. 查看哨兵状态
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 26379 info sentinel

## 4. 查看主节点信息
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 26379 sentinel master mymaster

## 5. 查看从节点信息
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 26379 sentinel slaves mymaster

## 6. 查看哨兵节点信息
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 26379 sentinel sentinels mymaster

## 7. 手动触发故障转移
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 26379 sentinel failover mymaster

## 8. 停止哨兵节点
$ pkill redis-sentinel

## 9. 启动哨兵节点
$ /redis/app/bin/redis-sentinel /redis/app/sentinel.conf –daemonize yes

4.4 高可用实战

# 高可用实战

## 1. 配置哨兵高可用集群
# 主节点:192.168.1.100:6379
# 从节点1:192.168.1.101:6379
# 从节点2:192.168.1.102:6379
# 哨兵节点1:192.168.1.100:26379
# 哨兵节点2:192.168.1.101:26379
# 哨兵节点3:192.168.1.102:26379

## 2. 客户端连接哨兵
# 使用Redis客户端连接哨兵获取主节点地址
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 26379 sentinel get-master-addr-by-name mymaster

# 输出示例
1) “192.168.1.100”
2) “6379”

## 3. 测试客户端连接
# 连接主节点
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 set test:ha “high availability”

# 输出示例
OK

# 从从节点读取
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 get test:ha

# 输出示例
“high availability”

## 4. 模拟主节点故障
$ systemctl stop redis # 在主节点上执行

## 5. 等待故障转移完成
# 查看新主节点地址
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 26379 sentinel get-master-addr-by-name mymaster

# 输出示例
1) “192.168.1.101”
2) “6379”

## 6. 测试新主节点
# 连接新主节点
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 set test:newmaster “new master”

# 输出示例
OK

# 从从节点读取
$ /redis/app/bin/redis-cli -h 192.168.1.102 -p 6379 -a fgedu@2026 get test:newmaster

# 输出示例
“new master”

## 7. 恢复原主节点
$ systemctl start redis # 在原主节点上执行

## 8. 测试整个集群
# 连接新主节点
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 set test:recovery “recovery success”

# 从所有节点读取
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 get test:recovery
$ /redis/app/bin/redis-cli -h 192.168.1.102 -p 6379 -a fgedu@2026 get test:recovery

# 输出示例
“recovery success”
“recovery success”

更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 最佳实践

Redis哨兵高可用部署实战最佳实践:

  • 哨兵数量:部署3个或以上的哨兵节点,以提高可靠性,学习交流加群风哥微信: itpux-com
  • 部署位置:哨兵节点应部署在不同的物理机器上,避免单点故障
  • 网络配置:确保哨兵节点之间以及哨兵节点与Redis节点之间的网络连接稳定
  • 配置参数:合理配置哨兵的参数,如quorum、down-after-milliseconds等
  • 监控配置:监控哨兵的状态,及时发现问题
  • 故障转移测试:定期测试故障转移流程,确保其可靠性
  • 客户端配置:客户端应通过哨兵获取主节点的地址,而不是硬编码
  • 安全配置:配置哨兵节点的认证和加密

5.2 常见问题

常见问题及解决:

  • 哨兵无法发现主节点:检查网络连接和主节点状态
  • 故障转移失败:检查哨兵配置和从节点状态
  • 哨兵节点之间无法通信:检查网络连接和防火墙规则
  • 客户端无法获取主节点地址:检查哨兵配置和客户端代码
  • 哨兵节点崩溃:检查哨兵日志,找出崩溃原因
  • 故障转移时间过长:调整down-after-milliseconds和failover-timeout参数

5.3 优化技巧

风哥提示:Redis哨兵是实现Redis高可用的重要工具。在实际应用中,需要合理部署和配置哨兵节点,确保集群的可靠性和稳定性。

# 优化技巧

## 1. 哨兵配置优化
– 合理设置quorum值,一般为哨兵节点数量的一半加1
– 合理设置down-after-milliseconds值,平衡故障检测速度和误判概率
– 合理设置parallel-syncs值,平衡故障转移速度和从节点同步压力
– 合理设置failover-timeout值,确保故障转移有足够的时间完成

## 2. 网络优化
– 确保哨兵节点之间的网络延迟低
– 确保哨兵节点与Redis节点之间的网络延迟低
– 配置防火墙规则,只允许哨兵节点之间以及哨兵节点与Redis节点之间的通信
– 考虑使用专线或VPN连接

## 3. 监控优化
– 监控哨兵节点的状态,及时发现问题
– 监控主从集群的状态,确保数据一致性
– 设置合理的告警机制,当集群状态发生变化时及时通知
– 定期检查哨兵日志,找出潜在问题

## 4. 故障转移优化
– 定期测试故障转移流程,确保其可靠性
– 准备好故障转移的回滚方案
– 建立完善的故障处理流程
– 考虑使用Redis Cluster作为更高级的高可用解决方案

## 5. 客户端优化
– 客户端应通过哨兵获取主节点的地址,而不是硬编码
– 客户端应实现重试机制,当主节点故障时重新获取主节点地址
– 客户端应实现读写分离,将读请求发送到从节点
– 客户端应监控连接状态,及时发现连接问题

通过本文档的学习,您应该掌握了Redis哨兵高可用部署实战,能够在生产环境中合理部署和配置哨兵节点,实现Redis集群的高可用性。在实际应用中,需要根据具体业务场景选择合适的高可用方案,确保系统的可靠性和稳定性。

风哥提示:Redis哨兵是实现Redis高可用的重要工具。在实际应用中,需要合理部署和配置哨兵节点,确保集群的可靠性和稳定性。

from Redis视频:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息