Skip to content

主从复制、集群环境搭建

更新: 2025/2/24 字数: 0 字 时长: 0 分钟

主从复制

主从复制,是指将一台Redis服务器的数据单向复制到其他的Redis服务器,前者称为主节点(master/leader)以写为主,后者称为从节点(salve/follower)以读为主。默认情况下,每台Redis服务器都是主节点,且一个主节点,每个主节点可以没有从节点或有多个从节点,但一个从节点只能有一个主节点。

QQ截图20220721151225

主要作用

主从复制的主要作用包括:

  1. 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
  2. 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复,实际上是一种服务的冗余。
  3. 负载均衡:在主从复制的基础上,配合读写分离,即写Redis数据时连接主节点,读Redis数据时连接从节点,尤其是在写少读多的场景下,通过多个从节点分担读负载,大大提高Redis服务器的并发量;
  4. 高可用基石:主从复制还是哨兵和集群能够实施的基础,因此说主从复制时Redis高可用的基础。

工程项目

在工程项目中只是用一台Redis是万万不行的,因为一旦宕机整个服务就挂掉了,至少也得是一主二从的Redis集群,原因如下:

  1. 从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大;
  2. 从容量上,单个Redis服务器内存容量有限,不能将所有内存用作Redis存储内存。一般来说,单台Redis最大使用内存不应该超过20G。

因此只要在公司中,主从复制就是必须使用的。

?> 提示:在日常的业务当中,80%的情况都是在进行读操作,因此主从复制,读写分离,可以减缓服务器的压力,架构中经常使用。

集群环境搭建

查看信息

info replication  # 查看当前库的信息

QQ截图20220721154252

修改配置文件

目前我们手上只有一台Redis服务器,接下来我们通过修改配置文件的方式来开启三台Redis服务器,搭建一个伪集群。

首先我们关闭Reids服务器,将Redis的配置文件拷贝为3份;

QQ截图20220721155828

redis79.conf 文件修改的内容如下:

port 6379  # 端口
pidfile /var/run/redis_6379.pid  # pid文件
logfile /var/log/redis/redis6379.log  # 日志文件
dbfilename dump6379.rdb  # rdb文件

redis80.conf 文件修改的内容如下:

port 6380  # 端口
pidfile /var/run/redis_6380.pid  # pid文件
logfile /var/log/redis/redis6380.log  # 日志文件
dbfilename dump6380.rdb  # rdb文件

redis81.conf 文件修改的内容如下:

port 6381  # 端口
pidfile /var/run/redis_6381.pid  # pid文件
logfile /var/log/redis/redis6381.log  # 日志文件
dbfilename dump6381.rdb  # rdb文件

通过 redis-server 启用三个配置文件:

/usr/bin/redis-server /etc/redis79.conf
/usr/bin/redis-server /etc/redis80.conf
/usr/bin/redis-server /etc/redis81.conf

通过命令 ps -ef|grep redis 查看Redis状态:可以看到开启了3个Redis的进程。

QQ截图20220721171103

命令配置

现在我将6379定为主节点,6380、6381定为从节点,上面我们讲到,默认每台Redis服务器都是主节点,**因此我们不用配置主库,只配置从库。**命令如下:

# Redis的6380节点
127.0.0.1:6380> slaveof 127.0.0.1 6379  # 认本机的6379端口为主节点

QQ截图20220721173956

这时,主节点6379的节点也发生了变化:

QQ截图20220721174145

按照上面的命令继续将6381节点认6379节点为主节点,设置好以后,整个就搭建好了一个以6379为主节点,6380、6381为从节点的一主二从的Redis集群。

永久配置

上面的配置是通过命令去实现,这种方式实现的集群时暂时的,想实现永久的配置就需要修改配置文件内容如下:取消红框里面的注释,写上主节点的IP、主节点的端口信息,再重启Redis即可。

QQ截图20220721175124

客户端配置

如果觉得上面的操作太过麻烦,可以使用客户端加 --slave 选项把当前客户端模拟成当前Redis节点的从节点,可以用来获取当前Redis节点的更新操作。效果如下:

redis-cli --slave 
SYNC with master, discarding 72 bytes of bulk transfer... 
SYNC done. Logging commands from master.

再开启另一个客户端做一些更新操作:

127.0.0.1:6379> set hello world 
OK
127.0.0.1:6379> set a b 
OK
127.0.0.1:6379> incr count 
1
127.0.0.1:6379> get hello 
"world"

第一个客户端会收到Redis节点的更新操作:

redis-cli --slave 
SYNC with master, discarding 72 bytes of bulk transfer... 
SYNC done. Logging commands from master. 
"set","hello","world" 
"set","a","b" 
"PING" 
"incr","count"

?> 提示:PING命令是由于主从复制产生的。

集群测试

主从测试

现在我们的Redis主从复制集群已经搭建好了,前面我们讲过主节点只负责写,从节点只负责读,现在我们测试一下:

6379主节点写入一个值:状态成功。

QQ截图20220721175952

6381从节点读取一个值:状态成功。

6381从节点写入一个值:状态失败(从节点不能进行写操作)。

QQ截图20220721180010

断开测试

下面的测试结果基于命令设置的Redis一主二从集群

主节点断开:当主节点断开集群后,从节点依然是从节点,其状态不会发生变化,只是整个集群没有了写服务;当主节点又连上集群时,依然是主节点,依然可以进行写操作。

从节点断开:当一个从节点断开集群后,由于另一个从节点会提供读服务,所以整个集群的读服务依然存在,只是整个集群读服务性能降低了;当两个从节点都断开集群后,就相当于就变成了一个Redis单节点,它就必须要既提供读服务,也提供写服务。

数据复制

在Redis集群中的节点之间会进行数据复制,而数据复制方式有如下两种:全量复制、增量复制。

全量复制

全量复制:将所有的数据全部进行复制,与其他节点进行同步。

例如,目前整个集群有3个节点,一个6379主节点以及两个6380、6381从节点,假如这个时候群集增加了一个新的6382从节点,当它连接到主节点后,会向主节点发送一个同步命令,主节点就会启动后台的存盘进程,同时收集所有接收到的用于修改数据的命令集,在后台执行完毕之后,将传送整个数据文件传送到该从节点,完成一次完全同步。

?> 提示:从节点与主节点断开后,再重新连接主节点,都会进行一次完全同步,所以数据一定可以在从节点中看到。

增量复制

增量复制:主节点将后续所有的修改命令依次传递给从节点,完成同步。

例如,目前整个集群有3个节点,一个6379主节点以及两个6380、6381从节点,现在通过主节点写入了一个string类型的键值对,那么主节点就需要将该命令依次传递给两个从节点,让他们自己执行,完成同步。