1. 首页 > Redis教程 > 正文

Redis教程FG039-Redis高可用架构设计与实现

本文档风哥主要介绍Redis高可用架构设计与实现,包括高可用概念、高可用架构、高可用原则、高可用规划、高可用最佳实践、高可用工具、主从复制架构、哨兵架构、集群架构以及实战案例等内容,风哥教程参考Redis官方文档等内容编写,适合DBA人员和开发人员在生产环境中使用。

Part01-基础概念与理论知识

1.1 高可用概念

高可用(High Availability,HA)是指系统在面对各种故障时,能够保持服务的连续性和可用性。对于Redis来说,高可用意味着即使在节点故障、网络中断等情况下,Redis服务仍然能够正常运行,数据不会丢失。

  • 可用性:系统能够正常提供服务的时间占总时间的比例
  • 可靠性:系统在规定的时间内完成规定功能的能力
  • 容错性:系统在出现故障时能够继续运行的能力
  • 恢复性:系统在故障后能够快速恢复的能力

1.2 高可用架构

# 高可用架构

## 1. 主从复制架构
– 主节点:处理所有写操作,将数据复制到从节点
– 从节点:复制主节点的数据,处理读操作
– 优点:实现简单,提高读性能
– 缺点:主节点故障时需要手动切换

## 2. 哨兵架构
– 哨兵节点:监控主从节点的状态,当主节点故障时自动进行故障转移
– 主节点:处理所有写操作,将数据复制到从节点
– 从节点:复制主节点的数据,处理读操作
– 优点:自动故障转移,提高可用性
– 缺点:部署复杂,性能开销较大

## 3. 集群架构
– 多个主节点:数据分片存储,每个主节点负责一部分槽位
– 从节点:复制主节点的数据,当主节点故障时作为备用
– 优点:高可用,高扩展性,负载均衡
– 缺点:部署复杂,管理难度较大

1.3 高可用原则

Redis高可用的基本原则:

  • 冗余:通过多个节点的冗余,确保系统在部分节点故障时仍然能够正常运行
  • 自动故障转移:当主节点故障时,自动将从节点提升为新的主节点
  • 数据一致性:确保所有节点的数据保持一致
  • 负载均衡:合理分配负载,提高系统的性能和可靠性
  • 监控与告警:实时监控系统状态,及时发现和处理问题

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

Part02-生产环境规划与建议

2.1 高可用规划

高可用规划建议:

  • 架构选择:根据业务需求和系统规模选择合适的高可用架构
  • 节点数量:根据数据量和性能要求确定节点数量
  • 硬件配置:根据业务需求配置合适的硬件资源
  • 网络规划:确保节点之间的网络连接稳定
  • 监控与告警:建立完善的监控和告警机制

2.2 高可用最佳实践

# 高可用最佳实践

## 1. 主从复制最佳实践
– 使用至少3个节点:1个主节点,2个从节点
– 配置合理的复制参数:如repl-backlog-size
– 监控复制状态:确保复制正常
– 定期测试故障转移:确保在主节点故障时能够正常切换

## 2. 哨兵最佳实践
– 使用至少3个哨兵节点:确保哨兵的高可用
– 配置合理的哨兵参数:如sentinel down-after-milliseconds
– 监控哨兵状态:确保哨兵正常运行
– 定期测试故障转移:确保在主节点故障时能够自动切换

## 3. 集群最佳实践
– 使用至少6个节点:3个主节点,3个从节点
– 配置合理的集群参数:如cluster-node-timeout
– 监控集群状态:确保集群正常运行
– 定期测试故障转移:确保在主节点故障时能够自动切换
– 合理分配槽位:确保负载均衡

## 4. 通用最佳实践
– 定期备份数据:确保数据安全
– 监控系统状态:及时发现和处理问题
– 配置合理的内存限制:避免内存溢出
– 优化网络配置:提高节点之间的通信效率
– 定期升级Redis版本:修复安全漏洞和性能问题

2.3 高可用工具

# 高可用工具

## 1. Redis内置工具
– Redis Sentinel:Redis的高可用性解决方案,用于监控主从节点和自动故障转移
– Redis Cluster:Redis的集群解决方案,用于数据分片和高可用

## 2. 第三方工具
– Keepalived:用于实现VIP(虚拟IP)的高可用
– HAProxy:用于负载均衡和高可用
– Consul:用于服务发现和配置管理
– Etcd:用于分布式键值存储和服务发现

## 3. 云服务工具
– AWS ElastiCache:AWS的托管Redis服务,提供高可用
– Azure Cache for Redis:Azure的托管Redis服务,提供高可用
– Alibaba Cloud Redis:阿里云的托管Redis服务,提供高可用
– Tencent Cloud Redis:腾讯云的托管Redis服务,提供高可用

学习交流加群风哥QQ113257174

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

3.1 主从复制架构

# 主从复制架构

## 1. 配置主节点
# 编辑主节点配置文件
$ vi /redis/app/redis.conf

# 主节点配置
bind 192.168.1.100
port 6379
dir /redis/fgdata
pidfile /redis/app/redis.pid
logfile /redis/app/log/redis.log
requirepass fgedu@2026

# 启动主节点
$ systemctl start redis

## 2. 配置从节点
# 编辑从节点配置文件
$ vi /redis/app/redis.conf

# 从节点配置
bind 192.168.1.101
port 6379
dir /redis/fgdata
pidfile /redis/app/redis.pid
logfile /redis/app/log/redis.log
requirepass fgedu@2026
replicaof 192.168.1.100 6379
masterauth fgedu@2026

# 启动从节点
$ systemctl start redis

## 3. 验证主从复制
# 查看主节点状态
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info replication

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

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

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

## 4. 测试主从复制
# 在主节点上设置数据
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 set user:1001 “张三”

# 输出示例
OK

# 在从节点上查看数据
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 get user:1001

# 输出示例
“张三”

3.2 哨兵架构

# 哨兵架构

## 1. 配置主从复制
# 参考主从复制架构的配置步骤

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

# 哨兵配置
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

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

## 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.100:6379,slaves=1,sentinels=1

## 4. 测试故障转移
# 停止主节点
$ systemctl stop redis

# 查看哨兵日志
$ tail -f /redis/app/log/redis-sentinel.log

# 输出示例
12345:X 01 Aug 12:00:00.000 # +sdown master mymaster 192.168.1.100 6379
12345:X 01 Aug 12:00:00.000 # +odown master mymaster 192.168.1.100 6379 #quorum 1/2
12345:X 01 Aug 12:00:00.000 # +new-epoch 1
12345:X 01 Aug 12:00:00.000 # +try-failover master mymaster 192.168.1.100 6379
12345:X 01 Aug 12:00:00.000 # +vote-for-leader 67890 1
12345:X 01 Aug 12:00:00.000 # +elected-leader master mymaster 192.168.1.100 6379
12345:X 01 Aug 12:00:00.000 # +failover-state-select-slave master mymaster 192.168.1.100 6379
12345:X 01 Aug 12:00:00.000 # +selected-slave slave 192.168.1.101:6379 slave 192.168.1.101:6379 @ mymaster 192.168.1.100 6379
12345:X 01 Aug 12:00:00.000 * +failover-state-send-slaveof-noone slave 192.168.1.101:6379
12345:X 01 Aug 12:00:00.000 * +failover-state-wait-promotion slave 192.168.1.101:6379
12345:X 01 Aug 12:00:00.000 # +promoted-slave slave 192.168.1.101:6379 slave 192.168.1.101:6379 @ mymaster 192.168.1.100 6379
12345:X 01 Aug 12:00:00.000 # +failover-state-reconf-slaves master mymaster 192.168.1.100 6379
12345:X 01 Aug 12:00:00.000 * +slave-reconf-sent slave 192.168.1.102:6379 slave 192.168.1.102:6379 @ mymaster 192.168.1.100 6379
12345:X 01 Aug 12:00:00.000 * +slave-reconf-inprog slave 192.168.1.102:6379 slave 192.168.1.102:6379 @ mymaster 192.168.1.100 6379
12345:X 01 Aug 12:00:00.000 * +slave-reconf-done slave 192.168.1.102:6379 slave 192.168.1.102:6379 @ mymaster 192.168.1.101 6379
12345:X 01 Aug 12:00:00.000 # +failover-end master mymaster 192.168.1.100 6379
12345:X 01 Aug 12:00:00.000 # +switch-master mymaster 192.168.1.100 6379 192.168.1.101 6379
12345:X 01 Aug 12:00:00.000 * +slave slave 192.168.1.100:6379 slave 192.168.1.100:6379 @ mymaster 192.168.1.101 6379
12345:X 01 Aug 12:00:00.000 * +slave slave 192.168.1.102:6379 slave 192.168.1.102:6379 @ mymaster 192.168.1.101 6379
12345:X 01 Aug 12:00:00.000 # +sdown slave 192.168.1.100:6379 slave 192.168.1.100:6379 @ mymaster 192.168.1.101 6379

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

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

# 重启原主节点
$ systemctl start redis

# 查看原主节点状态
$ /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:300
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:300
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:300

3.3 集群架构

# 集群架构

## 1. 配置集群节点
# 创建6个Redis实例配置文件
$ for port in 7000 7001 7002 7003 7004 7005; do
mkdir -p /redis/fgdata/$port
cp /redis/app/redis.conf /redis/fgdata/$port/
sed -i “s/port 6379/port $port/g” /redis/fgdata/$port/redis.conf
sed -i “s/dir \/redis\/fgdata/dir \/redis\/fgdata\/$port/g” /redis/fgdata/$port/redis.conf
sed -i “s/bind 127.0.0.1/bind 192.168.1.100/g” /redis/fgdata/$port/redis.conf
sed -i “s/protected-mode yes/protected-mode no/g” /redis/fgdata/$port/redis.conf
sed -i “s/# cluster-enabled yes/cluster-enabled yes/g” /redis/fgdata/$port/redis.conf
sed -i “s/# cluster-config-file nodes-6379.conf/cluster-config-file nodes-$port.conf/g” /redis/fgdata/$port/redis.conf
sed -i “s/# cluster-node-timeout 15000/cluster-node-timeout 15000/g” /redis/fgdata/$port/redis.conf
sed -i “s/requirepass foobared/requirepass fgedu@2026/g” /redis/fgdata/$port/redis.conf
sed -i “s/# masterauth /masterauth fgedu@2026/g” /redis/fgdata/$port/redis.conf
done

## 2. 启动集群节点
# 启动6个Redis实例
$ for port in 7000 7001 7002 7003 7004 7005; do
/redis/app/bin/redis-server /redis/fgdata/$port/redis.conf
done

## 3. 创建集群
# 创建集群,1主1从
$ /redis/app/bin/redis-cli –cluster create 192.168.1.100:7000 192.168.1.100:7001 192.168.1.100:7002 192.168.1.100:7003 192.168.1.100:7004 192.168.1.100:7005 –cluster-replicas 1 -a fgedu@2026

## 4. 验证集群状态
# 查看集群状态
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 7000 -a fgedu@2026 cluster info

# 输出示例
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:1000
cluster_stats_messages_pong_sent:990
cluster_stats_messages_sent:1990
cluster_stats_messages_ping_received:990
cluster_stats_messages_pong_received:1000
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:1995

# 查看集群节点信息
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 7000 -a fgedu@2026 cluster nodes

# 输出示例
1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z:7000@17000 master – 0 1627824000000 1 connected 0-5460
2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1:7001@17001 master – 0 1627824000000 2 connected 5461-10922
3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1a:7002@17002 master – 0 1627824000000 3 connected 10923-16383
4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1a2:7003@17003 slave 1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z 0 1627824000000 1 connected
5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1a2b:7004@17004 slave 2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1 0 1627824000000 2 connected
6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1a2b3:7005@17005 slave 3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1a 0 1627824000000 3 connected

## 5. 测试集群
# 在集群中设置数据
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 7000 -a fgedu@2026 set user:1001 “张三”

# 输出示例
OK

# 在集群中获取数据
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 7001 -a fgedu@2026 get user:1001

# 输出示例
“张三”

# 测试故障转移
# 停止一个主节点
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 7000 -a fgedu@2026 shutdown

# 查看集群状态
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 7001 -a fgedu@2026 cluster info

# 输出示例
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:7
cluster_my_epoch:2
cluster_stats_messages_ping_sent:1050
cluster_stats_messages_pong_sent:1040
cluster_stats_messages_sent:2090
cluster_stats_messages_ping_received:1040
cluster_stats_messages_pong_received:1050
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:2095

# 查看集群节点信息
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 7001 -a fgedu@2026 cluster nodes

# 输出示例
1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z:7000@17000 master,fail – 1627824000000 1627824060000 1 disconnected
2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1:7001@17001 master – 0 1627824065000 2 connected 5461-10922
3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1a:7002@17002 master – 0 1627824065000 3 connected 10923-16383
4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1a2:7003@17003 master – 0 1627824065000 7 connected 0-5460
5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1a2b:7004@17004 slave 2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1 0 1627824065000 2 connected
6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1a2b3:7005@17005 slave 3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1a 0 1627824065000 3 connected

# 验证故障转移是否成功
# 从输出可以看到,原来的从节点4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1a2:7003已经被提升为新的主节点,负责槽位0-5460

# 重启原主节点
$ /redis/app/bin/redis-server /redis/fgdata/7000/redis.conf

# 查看集群状态
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 7000 -a fgedu@2026 cluster info

# 输出示例
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:7
cluster_my_epoch:1
cluster_stats_messages_ping_sent:1100
cluster_stats_messages_pong_sent:1090
cluster_stats_messages_sent:2190
cluster_stats_messages_ping_received:1090
cluster_stats_messages_pong_received:1100
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:2195

# 查看集群节点信息
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 7000 -a fgedu@2026 cluster nodes

# 输出示例
1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z:7000@17000 slave 4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1a2 0 1627824120000 7 connected
2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1:7001@17001 master – 0 1627824125000 2 connected 5461-10922
3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1a:7002@17002 master – 0 1627824125000 3 connected 10923-16383
4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1a2:7003@17003 master – 0 1627824125000 7 connected 0-5460
5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1a2b:7004@17004 slave 2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1 0 1627824125000 2 connected
6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1a2b3:7005@17005 slave 3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1a 0 1627824125000 3 connected

# 验证集群是否恢复正常
# 从输出可以看到,原来的主节点1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z:7000现在成为了从节点,复制新的主节点4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1a2:7003

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

Part04-生产案例与实战讲解

4.1 主从复制实战

# 主从复制实战

## 1. 场景描述
– 生产环境中需要提高Redis的读性能
– 需要实现数据备份,确保数据安全
– 简单的高可用方案

## 2. 解决方案
– 部署主从复制架构
– 主节点处理写操作,从节点处理读操作
– 定期备份数据

## 3. 实战操作
# 配置主节点
$ vi /redis/app/redis.conf

bind 192.168.1.100
port 6379
dir /redis/fgdata
pidfile /redis/app/redis.pid
logfile /redis/app/log/redis.log
requirepass fgedu@2026

# 启动主节点
$ systemctl start redis

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

bind 192.168.1.101
port 6379
dir /redis/fgdata
pidfile /redis/app/redis.pid
logfile /redis/app/log/redis.log
requirepass fgedu@2026
replicaof 192.168.1.100 6379
masterauth fgedu@2026

# 启动从节点1
$ systemctl start redis

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

bind 192.168.1.102
port 6379
dir /redis/fgdata
pidfile /redis/app/redis.pid
logfile /redis/app/log/redis.log
requirepass fgedu@2026
replicaof 192.168.1.100 6379
masterauth fgedu@2026

# 启动从节点2
$ systemctl start redis

# 验证主从复制
$ /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=100,lag=0
slave1:ip=192.168.1.102,port=6379,state=online,offset=100,lag=0
master_replid:1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:100
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:100

# 测试主从复制
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 set user:1001 “张三”

# 输出示例
OK

$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 get user:1001

# 输出示例
“张三”

$ /redis/app/bin/redis-cli -h 192.168.1.102 -p 6379 -a fgedu@2026 get user:1001

# 输出示例
“张三”

# 配置读写分离
# 在应用中配置主节点处理写操作,从节点处理读操作
# 例如,使用Redis Sentinel或自定义客户端实现读写分离

4.2 哨兵实战

# 哨兵实战

## 1. 场景描述
– 生产环境中需要实现Redis的高可用
– 当主节点故障时,自动进行故障转移
– 确保服务的连续性

## 2. 解决方案
– 部署哨兵架构
– 哨兵节点监控主从节点的状态
– 当主节点故障时,自动将从节点提升为新的主节点

## 3. 实战操作
# 配置主从复制
# 参考主从复制实战的配置步骤

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

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

# 启动哨兵节点1
$ /redis/app/bin/redis-sentinel /redis/app/sentinel.conf &

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

port 26380
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
$ /redis/app/bin/redis-sentinel /redis/app/sentinel2.conf &

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

port 26381
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
$ /redis/app/bin/redis-sentinel /redis/app/sentinel3.conf &

# 验证哨兵状态
$ /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

# 测试故障转移
# 停止主节点
$ systemctl stop redis

# 查看哨兵日志
$ tail -f /redis/app/log/redis-sentinel.log

# 输出示例
12345:X 01 Aug 12:00:00.000 # +sdown master mymaster 192.168.1.100 6379
12345:X 01 Aug 12:00:00.000 # +odown master mymaster 192.168.1.100 6379 #quorum 2/2
12345:X 01 Aug 12:00:00.000 # +new-epoch 1
12345:X 01 Aug 12:00:00.000 # +try-failover master mymaster 192.168.1.100 6379
12345:X 01 Aug 12:00:00.000 # +vote-for-leader 67890 1
12345:X 01 Aug 12:00:00.000 # +elected-leader master mymaster 192.168.1.100 6379
12345:X 01 Aug 12:00:00.000 # +failover-state-select-slave master mymaster 192.168.1.100 6379
12345:X 01 Aug 12:00:00.000 # +selected-slave slave 192.168.1.101:6379 slave 192.168.1.101:6379 @ mymaster 192.168.1.100 6379
12345:X 01 Aug 12:00:00.000 * +failover-state-send-slaveof-noone slave 192.168.1.101:6379
12345:X 01 Aug 12:00:00.000 * +failover-state-wait-promotion slave 192.168.1.101:6379
12345:X 01 Aug 12:00:00.000 # +promoted-slave slave 192.168.1.101:6379 slave 192.168.1.101:6379 @ mymaster 192.168.1.100 6379
12345:X 01 Aug 12:00:00.000 # +failover-state-reconf-slaves master mymaster 192.168.1.100 6379
12345:X 01 Aug 12:00:00.000 * +slave-reconf-sent slave 192.168.1.102:6379 slave 192.168.1.102:6379 @ mymaster 192.168.1.100 6379
12345:X 01 Aug 12:00:00.000 * +slave-reconf-inprog slave 192.168.1.102:6379 slave 192.168.1.102:6379 @ mymaster 192.168.1.100 6379
12345:X 01 Aug 12:00:00.000 * +slave-reconf-done slave 192.168.1.102:6379 slave 192.168.1.102:6379 @ mymaster 192.168.1.101 6379
12345:X 01 Aug 12:00:00.000 # +failover-end master mymaster 192.168.1.100 6379
12345:X 01 Aug 12:00:00.000 # +switch-master mymaster 192.168.1.100 6379 192.168.1.101 6379
12345:X 01 Aug 12:00:00.000 * +slave slave 192.168.1.100:6379 slave 192.168.1.100:6379 @ mymaster 192.168.1.101 6379
12345:X 01 Aug 12:00:00.000 * +slave slave 192.168.1.102:6379 slave 192.168.1.102:6379 @ mymaster 192.168.1.101 6379
12345:X 01 Aug 12:00:00.000 # +sdown slave 192.168.1.100:6379 slave 192.168.1.100:6379 @ mymaster 192.168.1.101 6379

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

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

# 重启原主节点
$ systemctl start redis

# 查看原主节点状态
$ /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:300
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:300
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:300

# 验证服务是否正常
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 set test:key value

# 输出示例
OK

$ /redis/app/bin/redis-cli -h 192.168.1.102 -p 6379 -a fgedu@2026 get test:key

# 输出示例
“value”

4.3 集群实战

# 集群实战

## 1. 场景描述
– 生产环境中需要处理大量数据
– 需要高可用性和高扩展性
– 需要负载均衡

## 2. 解决方案
– 部署Redis集群架构
– 数据分片存储,每个主节点负责一部分槽位
– 从节点作为备用,当主节点故障时自动提升为新的主节点

## 3. 实战操作
# 配置集群节点
$ for port in 7000 7001 7002 7003 7004 7005; do
mkdir -p /redis/fgdata/$port
cp /redis/app/redis.conf /redis/fgdata/$port/
sed -i “s/port 6379/port $port/g” /redis/fgdata/$port/redis.conf
sed -i “s/dir \/redis\/fgdata/dir \/redis\/fgdata\/$port/g” /redis/fgdata/$port/redis.conf
sed -i “s/bind 127.0.0.1/bind 192.168.1.100/g” /redis/fgdata/$port/redis.conf
sed -i “s/protected-mode yes/protected-mode no/g” /redis/fgdata/$port/redis.conf
sed -i “s/# cluster-enabled yes/cluster-enabled yes/g” /redis/fgdata/$port/redis.conf
sed -i “s/# cluster-config-file nodes-6379.conf/cluster-config-file nodes-$port.conf/g” /redis/fgdata/$port/redis.conf
sed -i “s/# cluster-node-timeout 15000/cluster-node-timeout 15000/g” /redis/fgdata/$port/redis.conf
sed -i “s/requirepass foobared/requirepass fgedu@2026/g” /redis/fgdata/$port/redis.conf
sed -i “s/# masterauth /masterauth fgedu@2026/g” /redis/fgdata/$port/redis.conf
done

# 启动集群节点
$ for port in 7000 7001 7002 7003 7004 7005; do
/redis/app/bin/redis-server /redis/fgdata/$port/redis.conf
done

# 创建集群
$ /redis/app/bin/redis-cli –cluster create 192.168.1.100:7000 192.168.1.100:7001 192.168.1.100:7002 192.168.1.100:7003 192.168.1.100:7004 192.168.1.100:7005 –cluster-replicas 1 -a fgedu@2026

# 验证集群状态
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 7000 -a fgedu@2026 cluster info

# 输出示例
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:1000
cluster_stats_messages_pong_sent:990
cluster_stats_messages_sent:1990
cluster_stats_messages_ping_received:990
cluster_stats_messages_pong_received:1000
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:1995

# 查看集群节点信息
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 7000 -a fgedu@2026 cluster nodes

# 输出示例
1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z:7000@17000 master – 0 1627824000000 1 connected 0-5460
2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1:7001@17001 master – 0 1627824000000 2 connected 5461-10922
3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1a:7002@17002 master – 0 1627824000000 3 connected 10923-16383
4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1a2:7003@17003 slave 1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z 0 1627824000000 1 connected
5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1a2b:7004@17004 slave 2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z1 0 1627824000000 2 connected
6f7

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

联系我们

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

微信号:itpux-com

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