redis集群
Redis集群是一个分布式、去中心化的Redis实现方案,它通过将数据自动分片(Sharding)存储在多个节点上,并提供内置的主从复制、故障检测和故障转移机制,来实现:
- 大规模数据存储: 突破单机内存限制,支持海量数据。
- 高性能: 通过分片将负载分散到多个节点,提高整体吞吐量。
- 高可用性: 当主节点故障时,其从节点能自动升级为主节点,继续提供服务,最大限度减少中断。
- 无缝扩展: 可以相对容易地通过添加新节点来增加集群的容量或性能。
核心机制:
- 数据分片: 使用哈希槽(Hash Slot,共16384个)将数据划分。每个主节点负责一部分槽位。
- 节点通信: 节点间通过Gossip协议交换信息(如节点状态、槽位映射)。
- 故障转移: 基于Raft共识算法(选举新主节点),由主节点投票决定故障主节点的从节点升级。
- 客户端交互: 客户端通常连接任意节点。如果请求的键不在该节点负责的槽位上,节点会返回重定向指令(MOVED/ASK),告知客户端应连接的正确节点。
简而言之:Redis集群是Redis官方提供的,用于构建大规模、高性能、高可用Redis服务的分布式解决方案。
创建Redis集群

集群规划
至少6台主机(3主3从),要求:
- 所有节点禁用数据持久化(无
save
配置) - 无密码(省略
requirepass
)
准备虚拟机
|---------|---------------|--------|-----------|
| 主机名 | IP 地址 | 端口 | 角色 |
| redis51 | 192.168.88.51 | 6379 | Redis 服务器 |
| redis52 | 192.168.88.52 | 6379 | Redis 服务器 |
| redis53 | 192.168.88.53 | 6379 | Redis 服务器 |
| redis54 | 192.168.88.54 | 6379 | Redis 服务器 |
| redis55 | 192.168.88.55 | 6379 | Redis 服务器 |
| redis56 | 192.168.88.56 | 6379 | Redis 服务器 |
配置所有节点
# 每台主机执行相同操作
[root@redis51 ~]# yum -y install redis
[root@redis51 ~]# vim /etc/redis.conf
bind <本机IP> # 如 192.168.88.51,或者0.0.0.0监听本地所有ip
port 6379
cluster-enabled yes # 启用集群
cluster-config-file nodes-6379.conf # 集群配置文件
cluster-node-timeout 15000 # 节点超时时间(ms)
# 修改一个配置文件bind 0.0.0.0,其他远程拷贝过去
[root@redis51 ~]# for i in {52..56}; do scp /etc/redis.conf 192.168.88.$i:/etc/; done
[root@redis51 ~]# for i in {52..56}; do ssh root@192.168.88.$i "systemctl restart redis"; done
[root@redis51 ~]# systemctl start redis
[root@redis51 ~]# ss -antlpu | grep redis-server # 应看到6379和16379端口
创建集群(任意节点执行)
# CLUSTER RESET # 重置集群状态(默认 HARD 模式)
[root@redis51 ~]# redis-cli --cluster create \
192.168.88.51:6379 192.168.88.52:6379 \
192.168.88.53:6379 192.168.88.54:6379 \
192.168.88.55:6379 192.168.88.56:6379 \
--cluster-replicas 1 # 1个从节点/主节点
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.88.54:6379 to 192.168.88.51:6379
Adding replica 192.168.88.55:6379 to 192.168.88.52:6379
Adding replica 192.168.88.56:6379 to 192.168.88.53:6379
M: 0a9801b5e6c3041da90bb77d54b8b7ae0a39cda6 192.168.88.51:6379
slots:[0-5460],[15629] (5461 slots) master
M: 64495886f286b7cd54f8206d0dbc2e89f7eaed81 192.168.88.52:6379
slots:[5461-10922],[15629] (5462 slots) master
M: 08573c46bf41de51ca46cf765a61ab65f626300e 192.168.88.53:6379
slots:[10923-16383] (5461 slots) master
S: bd72c965735b34aa51bc98fbaaac77e2789bec90 192.168.88.54:6379
replicates 0a9801b5e6c3041da90bb77d54b8b7ae0a39cda6
S: 8728362b23b055efcf2ebe7a2b5764b304a21ef7 192.168.88.55:6379
replicates 64495886f286b7cd54f8206d0dbc2e89f7eaed81
S: bf040fb40793c668cdf8495cee5a76200e6e3e0a 192.168.88.56:6379
replicates 08573c46bf41de51ca46cf765a61ab65f626300e
Can I set the above configuration? (type 'yes' to accept):
输出提示分配Slot和主从关系,输入 yes
确认。
查看集群信息
[root@redis51 ~]# redis-cli --cluster info 192.168.88.51:6379
192.168.88.51:6379 (8cc0228e...) -> 0 keys | 5461 slots | 1 slaves.
192.168.88.53:6379 (08573c46...) -> 0 keys | 5461 slots | 1 slaves.
192.168.88.52:6379 (64495886...) -> 1 keys | 5462 slots | 1 slaves.
[OK] 1 keys in 3 masters.
0.00 keys per slot on average.
# 更详细的信息
[root@redis51 ~]# redis-cli --cluster check 192.168.88.51:6379
192.168.88.51:6379 (8cc0228e...) -> 0 keys | 5461 slots | 1 slaves.
192.168.88.53:6379 (08573c46...) -> 0 keys | 5461 slots | 1 slaves.
192.168.88.52:6379 (64495886...) -> 1 keys | 5462 slots | 1 slaves.
[OK] 1 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.88.51:6379)
M: 8cc0228e6f2a036840c951d853fb1ef0bbfa9bd7 192.168.88.51:6379
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: 08573c46bf41de51ca46cf765a61ab65f626300e 192.168.88.53:6379
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: bd72c965735b34aa51bc98fbaaac77e2789bec90 192.168.88.54:6379
slots: (0 slots) slave
replicates 8cc0228e6f2a036840c951d853fb1ef0bbfa9bd7
M: 64495886f286b7cd54f8206d0dbc2e89f7eaed81 192.168.88.52:6379
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: bf040fb40793c668cdf8495cee5a76200e6e3e0a 192.168.88.56:6379
slots: (0 slots) slave
replicates 08573c46bf41de51ca46cf765a61ab65f626300e
S: 8728362b23b055efcf2ebe7a2b5764b304a21ef7 192.168.88.55:6379
slots: (0 slots) slave
replicates 64495886f286b7cd54f8206d0dbc2e89f7eaed81
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
测试Redis集群
连接集群(自动重定向)
数据会根据算法存在某一个主节点上,数据在对应的从节点上有。
[root@redis51 ~]# redis-cli -c -h 192.168.88.51 -p 6379 # -c 启用集群模式
192.168.88.51:6379> set school tarena
-> Redirected to 192.168.88.52:6379(Slot 8455) # 数据分片存储
# 根据crc算法分配数据存放节点
192.168.88.55:6379> set school tarena
-> Redirected to slot [8455] located at 192.168.88.52:6379
OK
192.168.88.52:6379> set teacher zhsan
-> Redirected to slot [12541] located at 192.168.88.53:6379
OK
192.168.88.53:6379> set class one
-> Redirected to slot [7755] located at 192.168.88.52:6379
OK
# 查看集群中所有数据
[root@host51 ~]# redis-cli --cluster call 192.168.88.56:6379 keys \*
>>> Calling keys *
192.168.88.56:6379: teacher
192.168.88.55:6379: school
class
192.168.88.54:6379:
192.168.88.53:6379: teacher
192.168.88.52:6379: class
school
192.168.88.51:6379:
[root@host51 ~]#
验证主从复制
# 在Slave节点查看数据(应自动同步)
redis-cli -c -h 192.168.88.55 -p 6379 # host55是host51的Slave
192.168.88.55:6379> keys * # 应看到host51的数据
测试高可用
# 停止Master(host53)
ssh host53 'systemctl stop redis'
# 查看集群状态(原Slave host54升主)
redis-cli --cluster info 192.168.88.51:6379
# 恢复host53,自动变为新Master的Slave
配置主从复制
什么是主从复制
主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主
Redis主从同步
多个Redis服务器数据实时同步的解决方案
工作原理
1、从服务器向主服务器发送sync命令
2、主服务器接收到sync命令后,开辟子进程,触发rdb持久化对已有数据做完整备份
3、主服务器同时开辟内存buffer空间,收集当前执行的所有的写操作的指令
4、完整备份完成后将rdb文件发送给从服务器
5、从服务器热加载rdb文件实现数据恢复
6、接收主服务器发送过来的buffer区域内记录的写操作的指令并进行复现
环境准备
准备三台linux虚拟机,具体配置如图,分别在三台虚拟机中安装redis并启动。
|---------------|---------|-----------|-----------------|
| IP 地址 | 主机名 | 角色 | 说明 |
| 192.168.88.61 | redis61 | Redis 服务器 | 关闭 selinux 和防火墙 |
| 192.168.88.62 | redis62 | Redis 服务器 | 关闭 selinux 和防火墙 |
| 192.168.88.63 | redis63 | Redis 服务器 | 关闭 selinux 和防火墙 |
[root@redis61 ~]# yum -y install redis
[root@redis61 ~]# systemctl start redis
[root@redis61 ~]# ss -antlpu | grep redis # 查看redis端口信息
配置一主一从
主服务器配置(host61):
# 修改redis配置文件,更改监听ip及地址
[root@redis61 ~]# vim /etc/redis.conf
bind 192.168.88.61
port 6379
# 重启redis
[root@redis61 ~]# systemctl restart redis
# 连接redis命令控制台
[root@redis61 ~]# redis-cli -h 192.168.88.61 -p 6379
# 验证角色为master
192.168.88.61:6379> info replication
# 也可以直接在linux终端以非交互式执行redis命令
[root@redis61 ~]# redis-cli info replication
从服务器配置(host62):
[root@redis62 ~]# vim /etc/redis.conf
bind 192.168.88.62
port 6379
[root@redis62 ~]# systemctl restart redis
[root@redis62 ~]# redis-cli -h 192.168.88.62 -p 6379
# 将当前Redis节点设置为192.168.88.61:6379的从节点(副本节点)
# 配置后当前节点会从主节点复制数据,实现主从复制架构
192.168.88.62:6379> replicaof 192.168.88.61 6379
# 将当前的Redis配置(包括刚才设置的主从关系)写入到配置文件中
# 确保Redis重启后配置依然生效,避免重启后丢失主从配置
192.168.88.62:6379> config rewrite
192.168.88.62:6379> info replication # 验证角色为slave
验证可以再主服务器写入数据,在从服务器上确认数据是否同步。
配置一主多从
将host63加入为host61的从服务器
[root@redis63 ~]# vim /etc/redis.conf
bind 192.168.88.63
port 6379
[root@redis63 ~]# systemctl restart redis
[root@redis63 ~]# redis-cli -h 192.168.88.62 -p 6379
# 将当前Redis节点设置为192.168.88.61:6379的从节点(副本节点)
# 配置后当前节点会从主节点复制数据,实现主从复制架构
192.168.88.63:6379> replicaof 192.168.88.61 6379
# 将当前的Redis配置(包括刚才设置的主从关系)写入到配置文件中
# 确保Redis重启后配置依然生效,避免重启后丢失主从配置
192.168.88.63:6379> config rewrite
192.168.88.63:6379> info replication # 验证角色为slave
配置主从从(级联)结构
将host63改为host62的从服务器
从服务器默认是只读的
[root@redis63 ~]# redis-cli -h 192.168.88.63 -p 6379
192.168.88.63:6379> replicaof no one # 重置为独立服务器
# 可以修改配置文件,
[root@redis63 ~]# vim /etc/redis.conf
# replicaof <masterip> <masterport>
286 replicaof 192.168.88.62 6379
[root@redis63 ~]# systemctl restart redis
# 也可以命令行配置master
192.168.88.63:6379> replicaof 192.168.88.62 6379
# 此命令会在/etc/redis.conf配置文件中追加一行 replicaof 192.168.88.61 6379
192.168.88.63:6379> config rewrite
配置带验证的主从复制
主机host61设置Redis密码为123456
从机host62配置连接主机的密码
主服务器设置密码:/etc/redis.conf 507行
[root@redis61 ~]# redis-cli -h 192.168.88.61 -p 6379
192.168.88.61:6379> config set requirepass 123456
# 此命令会在/etc/redis.conf配置文件中追加一行requirepass "123456"
192.168.88.61:6379> config rewrite
从服务器配置密码:
[root@redis62 ~]# redis-cli -h 192.168.88.62 -p 6379
192.168.88.62:6379> config set masterauth 123456
# 此命令会在/etc/redis.conf配置文件中追加一行masterauth "123456"
192.168.88.62:6379> config rewrite
192.168.88.62:6379> info replication # 验证状态为up
配置哨兵服务

准备新虚拟机redis69配置ip为192.168.88.69,安装redis,运行哨兵服务。测试故障切换
沿用之前redis61,redis62的主从配置。
哨兵配置(redis69):
[root@redis69 ~]# vim /etc/redis-sentinel.conf
# 绑定的IP地址,指定Sentinel实例监听的网络接口
bind 192.168.88.69
# 端口号,Sentinel实例运行的端口(默认26379)
port 26379
# 是否以守护进程模式运行(后台运行),yes表示启用守护进程模式
daemonize yes
# 监控主服务器配置:
# 格式:sentinel monitor <主服务器名称> <主服务器IP> <主服务器端口> <quorum数量>
# mymaster:自定义的主服务器名称
# 192.168.88.61 6379:被监控的主服务器IP和端口
# 1:表示至少需要1个Sentinel同意,才能判定主服务器主观下线并进行故障转移
sentinel monitor mymaster 192.168.88.61 6379 1
# 指定主服务器及其从服务器的密码:sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster YourSuperStrongPassword123!
[root@redis69 ~]# systemctl start redis-sentinel
测试故障切换:
- 停止redis61的Redis服务
- 检查redis62是否升级为master
- 重启redis61,验证其自动变为slave
redis数据持久化
Redis 数据持久化:
概念:Redis 数据备份的方式,不是把 Redis 的数据存放到硬盘!!!
分类:
rdb (拍照片):定期将内存中的 Redis 数据快照到硬盘
特性:速度快,文件体积小,适合大规模数据备份恢复,但丢失数据量大
触发方式:
1、手工执行 bgsave 命令
2、Redis 服务正常退出
3、触发配置文件中的 save 规则
aof (写日记):记录 Redis 执行过的所有的写操作指令
特性:速度慢,文件体积大,数据备份恢复速度慢,但数据丢失量小
RDB
RDB 文件是 Redis 在某个时间点生成的数据集的二进制快照。
备份 RDB 文件本质上就是复制这个 .rdb文件(默认名为 dump.rdb)到一个安全的位置(例如:不同的磁盘、网络存储、云存储等)。
恢复则是用这个备份的 .rdb文件替换当前 Redis 实例使用的 .rdb文件,并在 Redis 重启时加载它。
修改存盘频率:
[root@redis61 ~]# vim /etc/redis.conf
save 120 10 # 设置存盘间隔为120秒且10个key改变时自动存盘
[root@redis61 ~]# rm -rf /var/lib/redis/*
[root@redis61 ~]# systemctl start redis
触发存盘
192.168.88.61:6379> mset a 1 b 2 c 3 d 4 x 1 y 2 z 3 k 6 i 7 z 9 f 22 zz 99 cc 66
使用RDB文件数据备份与恢复:
[root@redis61 ~]# cp /var/lib/redis/dump.rdb /opt/
[root@redis61 ~]# redis-cli flushall # 清空数据
# 先停再拷贝
[root@redis61 ~]# systemctl stop redis
[root@redis61 ~]# cp /opt/dump.rdb /var/lib/redis/
[root@redis61 ~]# chown -R redis:redis /var/lib/redis/
[root@redis61 ~]# systemctl start redis
AOF
AOF(Append Only File)备份的本质与 RDB 完全不同。它不是保存数据的快照,而是记录对数据库状态进行修改的所有写命令,并以日志的形式追加存储到文件中。
启用AOF:
# 热部署,无需重启服务,自动配置文件里添加aof-use-rdb-preamble yes
127.0.0.1:6379> CONFIG set appendonly yes
OK
127.0.0.1:6379> config rewrite
OK
127.0.0.1:6379> mset a 1 b 2 c 3
使用AOF文件备份与恢复:
[root@redis70 ~]# cp /var/lib/redis/appendonly.aof /opt/
[root@redis70 ~]# redis-cli flushall
OK
[root@redis70 ~]# cat /var/lib/redis/appendonly.aof | wc -l
30
[root@redis70 ~]# systemctl stop redis
[root@redis70 ~]# cp /opt/appendonly.aof /var/lib/redis/
cp: overwrite '/var/lib/redis/appendonly.aof'? y
[root@redis70 ~]# cat /var/lib/redis/appendonly.aof | wc -l
27
[root@redis70 ~]# chown -R redis:redis /var/lib/redis/appendonly.aof
[root@redis70 ~]# systemctl start redis
如果启用了 AOF (appendonly yes),Redis 重启时默认优先加载 AOF 文件,因为 AOF 通常能保证更高的数据持久性(记录所有写操作)。这就是为什么在恢复 RDB 时建议临时禁用或移除 AOF 文件,否则你恢复的 RDB 数据会被 AOF 文件中的数据覆盖掉!