平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“深入剖析 Redis 的三种集群方式以及实践配置”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
在这个场景下,Redis作为高性能内存数据库,其集群化部署是解决单节点性能瓶颈与实现高可用的关键。本篇将深入剖析三种主流的集群方式:主从复制、哨兵模式(Sentinel)与官方集群(Cluster),同时为您提供详细的搭建指南与设置示例。
实际处理时,主从复制是最基础的集群模式,借助一个主节点(Master)和一个或多个从节点(Slave)实现读写分离。主节点负责处理写操作,从节点负责处理读操作,同时实时从主节点同步数据。
实际处理时,以下以单机伪集群为例,在一台服务器上启动3个Redis实例(1个主节点,2个从节点)。
主节点设置 (redis-master.conf):
# 端口
port 6379
# 后台运行
daemonize yes
# PID文件
pidfile /var/run/redis_6379.pid
# 日志文件
logfile "/usr/local/redis-cluster/logs/redis_6379.log"
# 工作目录
dir /usr/local/redis-cluster/data
# 持久化
dbfilename dump-6379.rdb
# 开启AOF
appendonly yes
appendfilename "appendonly-6379.aof"
从节点1设置 (redis-slave1.conf):
# 端口
port 6380
# 后台运行
daemonize yes
# PID文件
pidfile /var/run/redis_6380.pid
# 日志文件
logfile "/usr/local/redis-cluster/logs/redis_6380.log"
# 工作目录
dir /usr/local/redis-cluster/data
# 持久化
dbfilename dump-6380.rdb
# 开启AOF
appendonly yes
appendfilename "appendonly-6380.aof"
# 指定主节点
replicaof 127.0.0.1 6379
# 主节点密码(如果设置了)
masterauth 123456
从节点2设置 (redis-slave2.conf):
# 端口
port 6381
# 后台运行
daemonize yes
# PID文件
pidfile /var/run/redis_6381.pid
# 日志文件
logfile "/usr/local/redis-cluster/logs/redis_6381.log"
# 工作目录
dir /usr/local/redis-cluster/data
# 持久化
dbfilename dump-6381.rdb
# 开启AOF
appendonly yes
appendfilename "appendonly-6381.aof"
# 指定主节点
replicaof 127.0.0.1 6379
# 主节点密码(如果设置了)
masterauth 123456
redis-server /usr/local/redis-cluster/conf/redis-master.conf
redis-server /usr/local/redis-cluster/conf/redis-slave1.conf
redis-server /usr/local/redis-cluster/conf/redis-slave2.conf
# 连接主节点
redis-cli -p 6379
127.0.0.1:6379> info replication
# 连接从节点
redis-cli -p 6380
127.0.0.1:6380> info replication

在这个场景下,哨兵模式在主从复制的基础上增加了高可用(HA)能力。借助多个哨兵进程坚控主从节点,当主节点故障时,哨兵会自动选举一个从节点升级为新的主节点,同时通知其他从节点切换主节点,实现故障转移。

同样以单机伪集群为例,部署1个主节点、2个从节点和3个哨兵节点。
主节点设置 (redis-master.conf):
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/usr/local/redis-cluster/logs/redis_6379.log"
dir /usr/local/redis-cluster/data
dbfilename dump-6379.rdb
appendonly yes
appendfilename "appendonly-6379.aof"
# 设置密码(可选)
requirepass 123456
从节点1设置 (redis-slave1.conf):
port 6380
daemonize yes
pidfile /var/run/redis_6380.pid
logfile "/usr/local/redis-cluster/logs/redis_6380.log"
dir /usr/local/redis-cluster/data
dbfilename dump-6380.rdb
appendonly yes
appendfilename "appendonly-6380.aof"
# 指向主节点
replicaof 127.0.0.1 6379
# 如果主节点有密码
masterauth 123456
哨兵1设置 (sentinel1.conf):
port 26379
daemonize yes
pidfile /var/run/redis-sentinel_26379.pid
logfile "/usr/local/redis-cluster/logs/sentinel_26379.log"
dir /usr/local/redis-cluster/data
# 坚控主节点
sentinel monitor mymaster 127.0.0.1 6379 2
# 密码(如果主节点有)
sentinel auth-pass mymaster 123456
# 故障转移超时时间
sentinel down-after-milliseconds mymaster 5000
# 故障转移后最多保留的失败次数
sentinel failover-timeout mymaster 10000
# 故障转移时最多同时迁移的key数量
sentinel parallel-syncs mymaster 1
哨兵2设置 (sentinel2.conf):
port 26380
daemonize yes
pidfile /var/run/redis-sentinel_26380.pid
logfile "/usr/local/redis-cluster/logs/sentinel_26380.log"
dir /usr/local/redis-cluster/data
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
哨兵3设置 (sentinel3.conf):
port 26381
daemonize yes
pidfile /var/run/redis-sentinel_26381.pid
logfile "/usr/local/redis-cluster/logs/sentinel_26381.log"
dir /usr/local/redis-cluster/data
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
# 启动Redis节点
redis-server /usr/local/redis-cluster/conf/redis-master.conf
redis-server /usr/local/redis-cluster/conf/redis-slave1.conf
redis-server /usr/local/redis-cluster/conf/redis-slave2.conf
# 启动哨兵
redis-sentinel /usr/local/redis-cluster/conf/sentinel1.conf
redis-sentinel /usr/local/redis-cluster/conf/sentinel2.conf
redis-sentinel /usr/local/redis-cluster/conf/sentinel3.conf
# 连接哨兵查看主节点
redis-cli -p 26379
127.0.0.1:26379> sentinel master mymaster
# 关闭主节点
redis-cli -p 6379 shutdown
# 等待哨兵选举后,再次查看
127.0.0.1:26379> sentinel master mymaster
落到代码里,Redis Cluster是官方提供的分布式解决方案,借助数据分片(Sharding)解决单节点内存限制问题,同时内置高可用能力。它不需中间件,节点间直接通信。
以单机伪集群为例,部署3个主节点和3个从节点。
主节点1设置 (redis-7000.conf):
port 7000
daemonize yes
pidfile /var/run/redis_7000.pid
logfile "/usr/local/redis-cluster/logs/redis_7000.log"
dir /usr/local/redis-cluster/data
dbfilename dump-7000.rdb
appendonly yes
appendfilename "appendonly-7000.aof"
# 开启集群模式
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
# 关闭集群完整性检查(单机测试)
cluster-require-full-coverage no
从节点1设置 (redis-7003.conf):
port 7003
daemonize yes
pidfile /var/run/redis_7003.pid
logfile "/usr/local/redis-cluster/logs/redis_7003.log"
dir /usr/local/redis-cluster/data
dbfilename dump-7003.rdb
appendonly yes
appendfilename "appendonly-7003.aof"
# 开启集群模式
cluster-enabled yes
cluster-config-file nodes-7003.conf
cluster-node-timeout 5000
# 指定主节点
replicaof 127.0.0.1 7000
在这个场景下,依次新建 `redis-7001.conf`, `redis-7002.conf`, `redis-7004.conf`, `redis-7005.conf`, `redis-7006.conf`,同时修改端口号。
redis-server /usr/local/redis-cluster/conf/redis-7000.conf
redis-server /usr/local/redis-cluster/conf/redis-7001.conf
redis-server /usr/local/redis-cluster/conf/redis-7002.conf
redis-server /usr/local/redis-cluster/conf/redis-7003.conf
redis-server /usr/local/redis-cluster/conf/redis-7004.conf
redis-server /usr/local/redis-cluster/conf/redis-7005.conf
redis-server /usr/local/redis-cluster/conf/redis-7006.conf
# 进入Redis源码目录
cd /path/to/redis-5.0.5/src
# 使用官方工具创建集群
./redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
执行命令后,会提示输入 `yes` 来确认分配哈希槽和新建集群。
# 使用 -c 参数连接集群
redis-cli -c -p 7000
# 设置key
127.0.0.1:7000> set name "redis-cluster"
# 读取key(可能重定向到其他节点)
127.0.0.1:7000> get name
-> Redirected to [12182] located at 127.0.0.1:7002
"redis-cluster"
127.0.0.1:7002>
| 特性 | 主从复制 | 哨兵模式 | 官方集群 |
|---|---|---|---|
| 读写分离 | |||
| 数据分片 | |||
| 高可用 | (自动故障转移) | (内置) | |
| 部署复杂度 | 低 | 中 | 高 |
| 适用场景 | 读多写少、轻松扩展 | 需高可用、读写分离 | 大数据量、高并发 |
到此这篇关于深入剖析 Redis 的三种集群方式以及实战设置的文章就介绍到这了,更多相关Redis 三种集群内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多兼容脚本之家!