Redis高可用方案
Redis 高可用方案
1. 主从复制(Master-Slave)
主从复制是 Redis 最基本的高可用方案:
- 一个主节点(master)对应多个从节点(slave)
- 主节点负责写操作,从节点负责读操作
- 主从数据异步复制,提供读写分离能力
优点:
- 实现简单,配置方便
- 支持读写分离,提升系统性能
缺点:
- 不具备自动故障转移能力
- 主节点故障时需要手动切换
2. Sentinel(哨兵)机制
在主从复制基础上的高可用解决方案:
- 监控:监控主从节点运行状态
- 通知:通知系统管理员或其他程序
- 自动故障转移:主节点故障时自动选举新主节点
优点:
- 自动故障检测和转移
- 客户端配置简单,连接 Sentinel 即可
- 支持多个 Sentinel 实例
配置示例:
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
3. Redis Cluster
Redis 集群方案,支持数据自动分片:
- 无中心节点,完全分布式
- 支持多个主节点,每个主节点可以有多个从节点
- 数据自动分片到不同节点
特点:
- 高可用:某个主节点故障时,其从节点会自动提升为主节点
- 可扩展:支持在线增加/删除节点
- 分片存储:数据自动分散到多个节点,突破单机容量限制
最低配置要求:
- 至少 3 个主节点
- 建议每个主节点配置一个从节点
4. 选择建议
- 单机低成本:主从复制
- 自动故障转移:Sentinel
- 大规模集群:Redis Cluster
根据实际业务场景选择合适的方案:
- 数据量不大,主要追求高可用:Sentinel
- 数据量大,需要扩展性:Redis Cluster
- 简单场景,成本敏感:主从复制
5. Cluster 部署
5.1 节点IP
- 192.168.31.103(6679(master),6680(slave))
- 192.168.31.141(6679,6680)
- 192.168.31.45(6679,6680)
5.2 部署过程(cmd)
masterPort=6679
slavePort=6680
mkdir -p /opt/redis/${masterPort}
mkdir -p /opt/redis/${slavePort}
cp /etc/redis/redis.conf /opt/redis/${masterPort}/
cp /etc/redis/redis.conf /opt/redis/${slavePort}/
echo "cluster-enabled yes" >> /opt/redis/${masterPort}/redis.conf
echo "cluster-enabled yes" >> /opt/redis/${slavePort}/redis.conf
echo "masterauth clusterTest" >> /opt/redis/${masterPort}/redis.conf
echo "masterauth clusterTest" >> /opt/redis/${slavePort}/redis.conf
echo "requirepass clusterTest" >> /opt/redis/${masterPort}/redis.conf
echo "requirepass clusterTest" >> /opt/redis/${slavePort}/redis.conf
sed -i "s/^bind .*/bind 0.0.0.0/" /opt/redis/${masterPort}/redis.conf /opt/redis/${slavePort}/redis.conf
sed -i "s/^daemonize .*/daemonize yes/" /opt/redis/${masterPort}/redis.conf /opt/redis/${slavePort}/redis.conf
sed -i "s/^port .*/port ${masterPort}/" /opt/redis/${masterPort}/redis.conf
sed -i "s#^pidfile .*#pidfile /opt/redis/${masterPort}/redis.pid#" /opt/redis/${masterPort}/redis.conf
sed -i "s#^logfile .*#logfile /opt/redis/${masterPort}/redis.log#" /opt/redis/${masterPort}/redis.conf
sed -i "s#^dir .*#dir /opt/redis/${masterPort}#" /opt/redis/${masterPort}/redis.conf
sed -i "s/^port .*/port ${slavePort}/" /opt/redis/${slavePort}/redis.conf
sed -i "s#^pidfile .*#pidfile /opt/redis/${slavePort}/redis.pid#" /opt/redis/${slavePort}/redis.conf
sed -i "s#^logfile .*#logfile /opt/redis/${slavePort}/redis.log#" /opt/redis/${slavePort}/redis.conf
sed -i "s#^dir .*#dir /opt/redis/${slavePort}#" /opt/redis/${slavePort}/redis.conf
chown -R redis:redis /opt/redis
redis-server /opt/redis/6679/redis.conf
redis-server /opt/redis/6680/redis.conf
redis-cli -a clusterTest --cluster create \
192.168.31.103:6679 192.168.31.103:6680 \
192.168.31.141:6679 192.168.31.141:6680 \
192.168.31.45:6679 192.168.31.45:6680 \
--cluster-replicas 1
5.3 验证
# 信息
redis-cli -c -h 192.168.31.103 -p 6679 -a clusterTest --no-auth-warning cluster info
# 节点主从情况
redis-cli -c -h 192.168.31.103 -p 6679 -a clusterTest --no-auth-warning cluster nodes
# 槽
redis-cli -c -h 192.168.31.103 -p 6679 -a clusterTest --no-auth-warning cluster slots
6. 哨兵模式
6.1 节点IP
- 192.168.31.103(6379(master),sentinel)
- 192.168.31.141(6379(slave),sentinel)
- 192.168.31.45(6379(slave),sentinel)
6.2 部署过程(cmd)
- master
mkdir -p /opt/redis/6379/data
cat > /opt/redis/6379/redis.conf < EOF
bind 0.0.0.0
daemonize yes
logfile /opt/redis/6379/redis.log
dir /opt/redis/6379/data
masterauth sentinelTest
requirepass sentinelTest
appendonly yes
EOF
redis-server /opt/redis/6379/redis.conf
- slave
mkdir -p /opt/redis/6379/data
cat > /opt/redis/6379/redis.conf < EOF
bind 0.0.0.0
daemonize yes
logfile /opt/redis/6379/redis.log
dir /opt/redis/6379/data
replicaof 192.168.31.103 6379 # 此处注意
masterauth sentinelTest
requirepass sentinelTest
appendonly yes
EOF
redis-server /opt/redis/6379/redis.conf
- sentinel
mkdir -p /opt/redis/sentinel
cat > /opt/redis/sentinel/sentinel.conf << EOF
port 26379
daemonize no
pidfile /opt/redis/sentinel/redis-sentinel.pid
logfile /opt/redis/sentinel/sentinel.log
dir /tmp
sentinel monitor mymaster 192.168.31.103 6379 2
sentinel down-after-milliseconds mymaster 30000
acllog-max-len 128
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
SENTINEL resolve-hostnames no
SENTINEL announce-hostnames no
EOF
redis-sentinel /opt/redis/sentinel/sentinel.conf
本文来自博客园,作者:ヾ(o◕∀◕)ノヾ,转载请注明原文链接:https://www.cnblogs.com/Jupiter-blog/p/18751077
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构