redis主从复制
文档
- redis单机安装
- redis常用的五种数据类型
- redis数据类型-位图bitmap
- redis数据类型-基数统计HyperLogLog
- redis数据类型-地理空间GEO
- redis数据类型-流Stream
- redis数据类型-位域bitfield
- redis持久化-RDB
- redis持久化-AOF
- redis持久化-RDB+AOF混合模式
- redis事务
- redis管道 -redis pipeline -redis pipelining
- redis发布订阅
官方文档
说明
- redis版本:7.0.0
redis主从复制
基本规则
- 仅配置从节点即可,即在从节点中配置主节点的信息,就可达到同步的目的
- 在配置主从复制的过程中,主节点没有任何配置上的变化
- slave节点配置
replicaof
参数,值为master节点信息 - 如果master节点设置了密码(几乎是必须要配置的),即配置文件中
requirepass
参数设置了值,那么slave节点就要配置masterauth
参数,值为master节点的密码,否则master会拒绝slave的访问请求
配置主从模式
-
配置一主二从,在三台机器分配创建redis服务,参考:redis单机安装
-
如果机器上已安装了redis服务,建议复制全新的配置文件
redis.conf
进行修改,并将修改后的配置文件做为redis服务的启动文件 -
三台机器分别复制
redis.conf
文件,并重命名为redis6379.conf
、redis6380.conf
、redis6381.conf
,相关配置项如下支持后台启动:
daemonize
设置为yes
properties# daemonize no daemonize yes
关闭保护模式:
protected-mode
设置为no
properties# protected-mode yes protected-mode no
注释掉bind配置,
bind 127.0.0.1
表示只能本机访问properties# bind 127.0.0.1 -::1
设置访问密码,
requirepass
设置redis访问密码properties# requirepass foobared requirepass 123456
修改设置pid文件
propertiespidfile /var/run/redis_6379.pid
修改log文件,需提前创建好指定路径
properties# logfile "" logfile "/opt/module/redis/myredis/log/redis7.log"
修改端口号,分配修改为
6379
、6380
、6381
propertiesport 6379
修改dump文件的保存路径,rdb持久化使用的文件,rdb持久化默认开启,rdb文件默认为
dump.rdb
properties# dir ./ dir /opt/module/redis/myredis
-
从节点额外的配置,从节点需要配置主节点的服务器地址、端口号和密码,修改的配置文件仍然是上面指定的配置文件
添加主节点的服务地址和端口号
properties# replicaof <masterip> <masterport> replicaof 192.168.145.132 6379
添加主节点的密码
properties# masterauth <master-password> masterauth 123456
-
启动服务,已启动的关闭后重启,分别指定配置文件
redis6379.conf
、redis6380.conf
、redis6381.conf
shell./redis-server /opt/module/redis/myredis/redis6379.conf
-
连接服务器,分别指定对应的端口,指定密码
shell./redis-cli -a 123456 -p 6379
-
保证三台机器可以互相访问
关闭防火墙命令
shellsystemctl stop firewalld
-
启动成功后,查看主、从节点输出的日志
主节点的相关日志
verilog4378:M 16 Jul 2025 23:58:14.197 * Synchronization with replica 192.168.145.133:6380 succeeded ... 4378:M 16 Jul 2025 23:58:14.197 * Synchronization with replica 192.168.145.134:6381 succeeded ...
从节点的相关日志
verilog43183:S 16 Jul 2025 23:58:09.098 * Connecting to MASTER 192.168.145.132:6379 ...
-
同步成功后,查看主、从节点的主从复制配置信息,redis命令:
info replication
主节点的主从复制配置信息:
properties# Replication role:master connected_slaves:2 slave0:ip=192.168.145.133,port=6380,state=online,offset=546,lag=1 slave1:ip=192.168.145.134,port=6381,state=online,offset=546,lag=1 master_failover_state:no-failover master_replid:0033119d9e4f4137c8612bfdebb7949c04fad4db master_replid2:0000000000000000000000000000000000000000 master_repl_offset:560 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:560
从节点的主从复制配置信息:
properties# Replication role:slave master_host:192.168.145.132 master_port:6379 master_link_status:up master_last_io_seconds_ago:4 master_sync_in_progress:0 slave_read_repl_offset:938 slave_repl_offset:938 slave_priority:100 slave_read_only:1 replica_announced:1 connected_slaves:0 master_failover_state:no-failover master_replid:0033119d9e4f4137c8612bfdebb7949c04fad4db master_replid2:0000000000000000000000000000000000000000 master_repl_offset:938 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:15 repl_backlog_histlen:924
使用命令配置主从模式
- 如果没修改配置文件,也可以使用命令临时配置主从模式
- 在从节点执行命令:
slaveof 192.168.145.132 6379
,表示同步指定节点的数据,即命令中的节点做为主节点,当前节点为从节点,如果当前节点已经是某个主节点的从节点,那么会停止和原主节点的同步关系,转而和当前命令中设置的节点同步 - 需要注意的是,如果主节点有密码,则仍需在从节点的配置文件中配置
masterauth
参数,值为master节点的密码
主从模式传递
-
从节点可以做为其它节点的主节点,例如有3个节点
192.168.145.132:6379
、192.168.145.133:6380
、192.168.145.134:6381
,在192.168.145.133:6380
节点配置主节点192.168.145.132:6379
,在192.168.145.134:6381
节点配置主节点192.168.145.133:6380
,具体配置如下,以命令的形式为例 -
在
192.168.145.133:6380
节点执行命令:slaveof 192.168.145.132 6379
-
在
192.168.145.134:6381
节点执行命令:slaveof 192.168.145.133 6380
-
在
192.168.145.132:6379
节点执行命令:info replication
,输出信息properties# Replication role:master connected_slaves:1 slave0:ip=192.168.145.133,port=6380,state=online,offset=7584,lag=1 master_failover_state:no-failover master_replid:9b33c980c8ba7eaedac481e76fbe9cfd00a7313a master_replid2:0033119d9e4f4137c8612bfdebb7949c04fad4db master_repl_offset:7584 second_repl_offset:3104 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:3104 repl_backlog_histlen:4481
-
在
192.168.145.133:6380
节点执行命令:info replication
,输出信息properties# Replication role:slave master_host:192.168.145.132 master_port:6379 master_link_status:up master_last_io_seconds_ago:9 master_sync_in_progress:0 slave_read_repl_offset:7696 slave_repl_offset:7696 slave_priority:100 slave_read_only:1 replica_announced:1 connected_slaves:1 slave0:ip=192.168.145.134,port=6381,state=online,offset=7696,lag=1 master_failover_state:no-failover master_replid:9b33c980c8ba7eaedac481e76fbe9cfd00a7313a master_replid2:0000000000000000000000000000000000000000 master_repl_offset:7696 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:6374 repl_backlog_histlen:1323
-
在
192.168.145.134:6381
节点执行命令:info replication
,输出信息properties# Replication role:slave master_host:192.168.145.133 master_port:6380 master_link_status:up master_last_io_seconds_ago:10 master_sync_in_progress:0 slave_read_repl_offset:7738 slave_repl_offset:7738 slave_priority:100 slave_read_only:1 replica_announced:1 connected_slaves:0 master_failover_state:no-failover master_replid:9b33c980c8ba7eaedac481e76fbe9cfd00a7313a master_replid2:0000000000000000000000000000000000000000 master_repl_offset:7738 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:6388 repl_backlog_histlen:1351
停止主从同步
-
在从节点执行命令:
slaveof no one
,表示停止当前节点与其它节点同步,停止后,当前节点即为master
节点,执行命令:info replication
,输出信息properties# Replication role:master connected_slaves:0 master_failover_state:no-failover master_replid:e5ecbdf9a927853e469be84d80f191f4c9e414bc master_replid2:9b33c980c8ba7eaedac481e76fbe9cfd00a7313a master_repl_offset:8606 second_repl_offset:8607 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:6388 repl_backlog_histlen:2219
主从模式说明
-
从节点只允许读操作,不能写操作,在从节点执行写操作会报如下错误
shell127.0.0.1:6380> set k1 hello (error) READONLY You can't write against a read only replica.
-
复制点问题。全部数据都会复制,覆盖清除从节点原本的数据
-
主节点宕机问题。主节点宕机后,从节点依然是
slave
状态,并且标记主节点down
,下面是主节点宕机后,从节点执行命令:info replication
,输出信息properties# Replication role:slave master_host:192.168.145.132 master_port:6379 master_link_status:down master_last_io_seconds_ago:-1 master_sync_in_progress:0 slave_read_repl_offset:3103 slave_repl_offset:3103 master_link_down_since_seconds:5 slave_priority:100 slave_read_only:1 replica_announced:1 connected_slaves:0 master_failover_state:no-failover master_replid:0033119d9e4f4137c8612bfdebb7949c04fad4db master_replid2:0000000000000000000000000000000000000000 master_repl_offset:3103 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:15 repl_backlog_histlen:3089
-
主节点恢复后,会恢复主从复制关系
-
从节点宕机后,再次恢复,会再次同步主节点的数据
主从复制流程
slave
节点启动成功连接到master
节点后会发送一个sync
命令slave
节点首次连接master
节点,会全量复制主节点数据,自身原有的数据会被覆盖清除- 全量复制的具体流程:
master
节点接到sync
命令后会开始在后台保存快照,即进行RDB持久化- 同时收集所有新产生的修改操作命令
- RDB持久后结束后,
master
节点将rdb文件和所有缓存的命令发送到slave
节点,以完成异常完全同步
- 全量复制的具体流程:
slave
节点接收到rdb文件后,将其存盘并加载到内存中,从而完成复制初始化- 保持通信,心跳周期
repl-ping-replica-period
,默认10s - 增量复制,
master
节点将新收集到的修改命令自动依次传给slave
节点,完成同步 slave
节点下线后恢复,重新续传- 续传的具体流程:
master
节点会检查backlog
里面的offset
,master
和slave
都会保存一个复制的offset
还有一个masterId
。master
只会把已经复制的offset
后面的数据复制给slave
,类似断点续传 - 官网说明:How Redis replication works
- 续传的具体流程:
主从复制的缺点
- 复制延时,信号衰减。系统繁忙,
slave
节点增多,都会加重延迟问题 - 主节点宕机后,默认不会在从节点中选举新的主节点,即保持从节点状态,从节点不能执行写操作