Redis学习(十四)主从复制的工作原理、集群搭建(一主二从)
目录
- 一、Redis的主从复制简介
- 1.1 什么是主从复制?
- 1.2 主从复制的优缺点
- 1.3 主从复制场景应用
- 二、Redis的主从复制工作原理
- 2.1 全量复制
- 2.2 增量复制
- 三、主从复制搭建(主从复制引入)
- 3.1 搭建步骤
- 3.2 测试主从复制
Redis一共有三大集群模式:
主从复制模式(Master-Slave)
、哨兵模式(Sentinel)
、Cluster模式
,这里我们主要介绍主从复制模式的工作原理和搭建。
一、Redis的主从复制简介
1.1 什么是主从复制?
主从模式(Master-Slave)
是 Redis 的一种基本集群模式,它通过将一个Redis节点(主节点)的数据复制到一个或多个其他Redis节点(从节点)来实现数据的冗余和备份。
- 主节点 负责处理客户端的写操作;
- 从节点 会实时同步主节点的数据,客户端可以从从节点读取数据,实现读写分离,提高系统性能。

1.2 主从复制的优缺点
优点:
- 配置简单,易于实现。
- 实现数据冗余,提高数据可靠性。
- 读写分离,提高系统性能。
缺点:
- 主节点故障时,需要手动切换到从节点,故障恢复时间较长。
- 主节点承担所有写操作,可能成为性能瓶颈。
- 无法实现数据分片,受单节点内存限制。
1.3 主从复制场景应用
主从复制模式适用于以下场景:
- 数据备份和容灾恢复: 通过从节点备份主节点的数据,实现数据冗余。
- 读写分离: 将读操作分发到从节点,减轻主节点压力,提高系统性能。
- 在线升级和扩展: 在不影响主节点的情况下,通过增加从节点来扩展系统的读取能力。
总结:主从复制模式适合数据备份、读写分离和在线升级等场景,但在主节点故障时需要手动切换,不能自动实现故障转移。如果对高可用性要求较高,可以考虑使用哨兵模式或Cluster模式。
二、Redis的主从复制工作原理
Redis 的主从复制可以根据是否全量分为:全量复制 和 增量复制。
2.1 全量复制
主从复制
是指将一台 Redis 服务器的数据,复制到其他的 Redis 服务器。前者称为 主节点(master)
,后者称为 从节点(slave)
。
注意:数据的复制是单向的,只能由主节点到从节点。
Redis 的全量复制发生在 Slave(从节点)初始化阶段,即 从库第一次连接到主库时,此时 slave 需要将 master 主机上的所有数据都复制一份。
全量复制的具体过程如下:
- 从库跟主库建立
socket
连接,发送SYNC
同步命令。 - 主库收到
SYNC
同步命令后,开始执行BGSAVE
命令生成.rdb
文件,并使用缓冲区记录此后的所有写命令。 - 主库
BGSAVE
执行完成之后,向所有从库发送快照,并在发送快照期间继续记录被执行的写命令。 - 从库收到快照文件后,丢弃所有的旧数据,载入收到的快照。
- 主库快照发送完毕之后开始向从库发送缓冲区中的写命令。
- 从库完成对快照的载入,开始接收命令请求,并执行来自主库缓冲区的写命令。
2.2 增量复制
增量复制
是指 Redis 的 slave(从节点)初始化后开始正常工作后,主库每执行一个写命令就会向从库发送一个相同的写命令,从库接收并执行收到的写命令的过程。对应主从复制中的第7步:
- 主库通过
socket
长连接持续把写命令发送给从库,保证主从数据一致性。
注意:增量复制和全量复制都是单向的,只能由主节点到从节点。
三、主从复制搭建(主从复制引入)
3.1 搭建步骤
开始搭建集群!6379 为主节点,6380、6381 为从节点。
搭建集权的完整步骤如下:
- 拷贝
redis.conf
配置文件,我们一共需要三台redis-server
,所以拷贝三份即可。
cp redis.conf redis6379.conf
cp redis.conf redis6380.conf
cp redis.conf redis6381.conf
-
修改配置文件,因为每个
redis-server
都是不同的实例,所以需要修改配置文件。修改内容如下:
- 修改 port 端口;
- 修改 pidfile 文件名;
- 后台启动服务配置;
- 修改 RDB 或 AOF 文件存放位置(具体看你用的持久化是 RDB 还是 AOF);
- 修改 logfile 文件存放位置;
- 修改 replication 中的配置
replicaof masterip masterport
(配置文件是永久有效的,命令是临时有效:slaveof masterip masterport
);
如下为修改后的具体配置信息:
主节点:redis6379.conf
# 改动内容如下:
bind 0.0.0.0 # 我这里是为了允许任意远程登录
protected-mode no # 关闭保护模式
port 6379 # 服务启动端口
daemonize yes # 后台启动
pidfile /var/run/redis_6379.pid # 指定pidfile文件
logfile "/myredis/redis6379.log" # 指定Logfile文件
dbfilename dump6379.rdb # 指定rdb文件名
dir /myredis/ # 指定工作目录
requirepass 123456 # 设定redis服务器的密码
从节点1:redis6380.conf
注意:Redis 从
2.8.0
版本开始正式支持replicaof
命令,在此之前使用的是slaveof
命令,功能相同但名称不同。
# 改动内容如下:
bind 0.0.0.0 # 我这里是为了允许任意远程登录
protected-mode no # 关闭保护模式
port 6380 # 服务启动端口
daemonize yes # 后台启动
pidfile /var/run/redis_6380.pid # 指定pidfile文件
logfile "/myredis/redis6380.log" # 指定Logfile文件
dbfilename dump6380.rdb # 指定rdb文件名
dir /myredis/ # 指定工作目录
replicaof 127.0.0.1 6379 # 指定从机的主机
masterauth 123456 # 从机的主机的密码验证requirepass 123456 # 设定redis服务器的密码
从节点2:redis6381.conf
# 改动内容如下:
bind 0.0.0.0 # 我这里是为了允许任意远程登录
protected-mode no # 关闭保护模式
port 6381 # 服务启动端口
daemonize yes # 后台启动
pidfile /var/run/redis_6381.pid # 指定pidfile文件
logfile "/myredis/redis6381.log" # 指定Logfile文件
dbfilename dump6381.rdb # 指定rdb文件名
dir /myredis/ # 指定工作目录
replicaof 127.0.0.1 6379 # 指定从机的主机
masterauth 123456 # 从机的主机的密码验证requirepass 123456 # 设定redis服务器的密码
-
启动每个服务,并且查看不同 redis-server 的配置信息
info replication
。执行命令如下:
# 命令格式:redis-server 配置文件路径
redis-server redis6379.conf
redis-server redis6380.conf
redis-server redis6381.conf
启动后,rdb 文件和 log 文件如下所示:
使用 ps -ef | grep redis
查看一下进程:
(Windows下使用 tasklist | findstr redis
)

登录到三台服务器上观察下:
主节点:6379端口
redis-cli -a 123456 -p 6379

从节点1:6380端口
redis-cli -a 123456 -p 6380

从节点2:6381端口
redis-cli -a 123456 -p 6381

3.2 测试主从复制
集群搭建好之后,我们测试一下基础的操作:
# 查看所有key
keys *
# 主节点写操作测试
set k1 v1
set k2 v2
# 主/从节点读操作测试
get k1
get k2
# 从节点写操作测试
set k3 v3
测试结果如下,可以发现:主节点用于读写数据,从节点用于读数据,不能写数据。
至此,一主二从的主从复制模式已经搭建完毕了,但是正常业务中,并不是这么简单的。
整理完毕,完结撒花~🌻
参考地址:
1.Redis的主从复制和哨兵模式,https://developer.aliyun.com/article/1614267
2.彻底搞懂Redis主从复制原理及实战,https://www.cnblogs.com/cooffeeli/p/redis_master_slave.html
3.详解Redis三大集群模式,轻松实现高可用! https://www.cnblogs.com/yidengjiagou/p/17345831.html