本文档风哥主要介绍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
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
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
