使用 Redis Sentinel + Cluster 实现高可用
症状
目标:使用 Sentinel 为 Redis 搭建具备自动故障转移的 master-replica 部署;若需要横向扩展,则切换到 Redis Cluster 模式。
1. 配置 master 和副本
运行一个 master 和至少两个副本。副本通过 REPLICAOF 跟随 master(也可在 redis.conf 中写入 'replicaof <host> <port>')。为实现持久化启用 AOF 或 RDB;建议使用 requirepass/masterauth 进行认证。
Redis
# at runtime on the replica nodes:
REPLICAOF 10.0.0.10 6379
# to make it persistent, redis.conf:
# replicaof 10.0.0.10 6379
# masterauth secret
INFO replication2. 用 monitor 和 quorum 配置 Sentinel
在每个 Sentinel 节点的 sentinel.conf 中定义要监控的 master 和 quorum。quorum 是判定 master 为 'down' 所需的最少 Sentinel 数。生产环境中建议在 3 台独立服务器上部署 3 个 Sentinel(防止脑裂)。
Redis
# sentinel.conf:
sentinel monitor mymaster 10.0.0.10 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 13. 启动 Sentinel 进程
在每个节点上启动 Sentinel。Sentinel 会自动发现彼此和副本;它们在运行时将配置写入文件。因此 sentinel.conf 必须可写。
Redis
redis-sentinel /etc/redis/sentinel.conf
# or:
redis-server /etc/redis/sentinel.conf --sentinel4. 通过 Sentinel 查询状态并测试故障转移
用 SENTINEL 命令查询当前的 master 和副本。应用应通过向 Sentinel 发送 'get-master-addr-by-name' 来获知当前 master。通过计划内故障转移验证自动切换。
Redis
SENTINEL master mymaster
SENTINEL get-master-addr-by-name mymaster
SENTINEL replicas mymaster
# planned switchover:
SENTINEL failover mymaster5. 替代方案:用 Redis Cluster 对数据分区
若单个 master 的内存/吞吐量不够,使用 Redis Cluster:数据被划分为 16384 个哈希槽并分布到多个 master 上;每个 master 都有自己的副本。应用必须使用支持集群的客户端。用 redis-cli --cluster create 搭建。
Redis
redis-cli --cluster create \
10.0.0.11:6379 10.0.0.12:6379 10.0.0.13:6379 \
10.0.0.21:6379 10.0.0.22:6379 10.0.0.23:6379 \
--cluster-replicas 16. 验证集群状态
集群创建后,确认所有槽都已分配且节点已互联。cluster_state 应为 'ok',全部 16384 个槽都应显示为已分配。用 CLUSTER 命令监控节点和槽的分布。
Redis
redis-cli --cluster check 10.0.0.11:6379
redis-cli -c -h 10.0.0.11 CLUSTER INFO
redis-cli -c -h 10.0.0.11 CLUSTER NODES