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. 选择建议

  1. 单机低成本:主从复制
  2. 自动故障转移:Sentinel
  3. 大规模集群: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
posted @   ヾ(o◕∀◕)ノヾ  阅读(18)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示