redis主从复制介绍
redis主从复制过程
- 从库刚加入集群时,replica库通过"SLAVEOF"命令连接master库并发送"SYNC"给master库
- master库收到"SYNC",会立即触发"BGSAVE"后台保存RDB快照,并将RDB快照发送给replica
- replica库接收后会应用RDB快照
- master库会陆续将中间产生的新的操作保存并发送给replica库,到此我们master复制集就正常工作了
- 再此以后,master库只要发生新的操作,都会以命令传播的形式自动发送给replica库
- 所有复制相关信息,从info信息中都可以查到,即使重启任何节点,他的master-replica关系依然都在
- 如果发生master-replica关系断开时,replica库数据没有任何损坏,在下次重连之后,replica库发送"PSYNC"给master库
- master库只会将replica库缺失部分的数据同步给replica库应用,达到快速恢复master-replica架构的目的
在Redis 2.8版本之前,如果master-replica架构中replica库宕机将会再次触发"SYNC",从而全量拷贝主库的数据,这样效率明显很低。于是在Redis 2.8版本之后就新增了"PSYNC"指令以实现可以理解为"断点续传"的功能。
生产环境中,建议开启master库持久化功能,避免因主库意外重启而导致缓存丢失。举个例子,master库有1w条数据,replica库在某一时刻仅有9k数据,还有1k数据未来得及同步master库时,master库意外重启导致KEY为0,此时replica库同步master库数据会将replica库已有的9k缓存数据删除以达到和master库同步的目的。
主从复制的优点
- 主节点负责写数据,从节点负责读数据,进行读写分离,提高读的效率
- 当主节点(Master)宕机时,可手动提升从节点(Slave)为新主节点,减少数据丢失风险。
主从复制的缺点
- 若主节点出现问题,则不能提供服务,需要人工修改配置将从库变为主库。
- 主从复制中主节点的写能力受单机限制,能力有限。
- 单机节点的存储能力也有限。
主从故障如何转移
- 主节点(master)故障时,从节点slave01执行 slaveof no one后成为新主节点;
- 手动切换其他从节点指向新主节点,并从中复制数据;
- 更新客户端连接配置;
- 需要人工干预,无法实现高可用。
redis一主一从
用于主节点故障转移从节点

redis一主多从

部署主从集群
架构
| 主机 | 角色 |
|---|---|
| 10.0.0.123 | 主 |
| 10.0.0.123 | 从 |
| 10.0.0.125 | 从 |
三台机器安装redis
可参考《linux部署redis7.0.7版本》章节:
配置主从
- 主节点配置文件:
cat /data/redis/conf/redis.conf
#基础配置
bind 0.0.0.0
port 6379
loglevel notice
logfile "/data/redis/log/redis.log"
pidfile /data/redis/redis.pid
daemonize yes
tcp-backlog 600
timeout 0
tcp-keepalive 0# 持久化配置
dir /data/redis/data
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 1024mb
aof-load-truncated yes
aof-rewrite-incremental-fsync yes
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
rdbcompression yes
stop-writes-on-bgsave-error yes
rdbchecksum yes # 安全配置
requirepass 1qaz@WSX# 慢查询配置
slowlog-log-slower-than 1000000
slowlog-max-len 50 #参数优化
maxclients 10000
maxmemory 2G
maxmemory-policy allkeys-lru
maxmemory-samples 5
lua-time-limit 5000 # 主从配置
masterauth 1qaz@WSX
min-slaves-to-write 1
min-slaves-max-lag 15
- 从节点配置文件:
cat /data/redis/conf/redis.conf
#基础配置
bind 0.0.0.0
port 6379
loglevel notice
logfile "/data/redis/log/redis.log"
pidfile /data/redis/redis.pid
daemonize yes
tcp-backlog 600
timeout 0
tcp-keepalive 0# 持久化配置
dir /data/redis/data
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 1024mb
aof-load-truncated yes
aof-rewrite-incremental-fsync yes
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
rdbcompression yes
stop-writes-on-bgsave-error yes
rdbchecksum yes # 安全配置
requirepass 1qaz@WSX# 慢查询配置
slowlog-log-slower-than 1000000
slowlog-max-len 50 #参数优化
maxclients 10000
maxmemory 2G
maxmemory-policy allkeys-lru
maxmemory-samples 5
lua-time-limit 5000 # 主从配置
masterauth 1qaz@WSX
slaveof 10.0.0.123 6379
replica-read-only yes
slave-priority 100
repl-disable-tcp-nodelay no
- 主从都重启,如果加入从节点之前,主库里面有数据则不用重启主节点,我这里重启只是为了使配置文件生效
systemctl restart redis
systemctl status redis
- 主库实例查看主从信息
# 主节点:
127.0.0.1:6379> INFO REPLICATION
# Replication
role:master
connected_slaves:2
min_slaves_good_slaves:2
slave0:ip=10.0.0.124,port=6379,state=online,offset=56,lag=1
slave1:ip=10.0.0.125,port=6379,state=online,offset=56,lag=0
master_failover_state:no-failover
master_replid:51b7a89015d1ce75482a6467ff57bf45d8dc404b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:56
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:56# 从节点:
127.0.0.1:6379> INFO REPLICATION
# Replication
role:slave
master_host:10.0.0.123
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_read_repl_offset:98
slave_repl_offset:98
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:51b7a89015d1ce75482a6467ff57bf45d8dc404b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:98
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:98
解除主从
SLAVEOF NO ONE

redis主从复制详解