一、Redis replication复制模式是什么?

在软件的架构中,主从模式(Master-Slave)是使用较多的一种架构。主(Master)和从(Slave)分别部署在不同的服务器上,当主节点服务器写入数据时,同时也会将数据同步至从节点服务器,通常情况下,主节点负责写入数据,而从节点负责读取数据。主从复制,master以写为主,Slave以读为主,当master数据变化的时候,自动将新的数据异步同步到其它slave数据库。

参考地址:https://redis.io/docs/management/replication/

二、Redis replication复制能做什么?

redis复制能够实现的有:

  • 读写分离
  • 容灾恢复
  • 数据备份
  • 水平扩容支撑高并发

主从模式的结构图如下:

Redis replication复制模式详解_redis

如上图所示,Redis 主机会一直将自己的数据复制给 Redis 从机,从而实现主从同步。在这个过程中,只有 master 主机可执行写命令,其他 salve 从机只能只能执行读命令,这种读写分离的模式可以大大减轻 Redis 主机的数据读取压力,从而提高了Redis 的效率,并同时提供了多个数据备份。主从模式是搭建 Redis Cluster 集群最简单的一种方式。

三、Redis replication复制如何使用呢?

Redis replication复制模式在配置的时候遵循,配置从库Slave,而不去配置Master主库,但是需要注意的时候,如果master主机如果配置了requirepass参数,需要密码登陆,那么slave就要配置masterauth参数来设置校验密码,否则的话master会拒绝slave的访问请求。

基本操作命令如下:

命令

含义

info replication

可以查看复制节点的主从关系和配置信息

replicaof 主库IP 主库端口

一般写入进redis.conf配置文件内

slaveof 主库IP 主库端口

每次与master断开之后,都需要重新连接,除非你配置进redis.conf文件;

在运行期间修改slave节点的信息,如果该数据库已经是某个主数据库的从数据库,
那么会停止和原主数据库的同步关系转而和新的主数据库同步;

 slaveof no one

 使当前数据库停止与其他数据库的同步,转成主数据库

四、案例演示

4.1.案例架构说明

准备一个Master主机两个Slave从机,3台虚机,每台都安装redis数据库,设备要求:

类型

IP地址和端口

启动是配置文件名称

Master

192.168.42.132:6379

redis6379.conf

Slave1

192.168.42.134:6380

redis6380.conf

Slave2

192.168.42.135:6381

redis6381.conf

注意:

  • 由于Master使用的是之前案例演示的时候所用redis,建议将配置文件删除掉,重新拷贝一份干净的配置文件,避免干扰。
  • 同时三个虚拟机之间网络需要相互ping通且注意防火墙配置

4.2.修改配置文件细节操作

以redis6379.conf为例,步骤为:

  • 修改配置文件daemonize yes,开启redis后台运行

Redis replication复制模式详解_数据_02

  • 因为需要远程连接,则要注释掉bind 127.0.0.1

Redis replication复制模式详解_数据_03

  • 修改protected-mode为no,设置禁用保护模式

Redis replication复制模式详解_重启_04

  • 指定redis端口

Redis replication复制模式详解_数据_05

  • 指定当前工作目录 dir

Redis replication复制模式详解_重启_06

  • 修改pid文件名字  pidfile

Redis replication复制模式详解_redis_07

  • 修改log文件名字 logfile

Redis replication复制模式详解_重启_08

  • 设置requirepass密码

Redis replication复制模式详解_重启_09

  • 修改dump.rdb文件的名字

Redis replication复制模式详解_redis_10

  • 修改aof文件路径appendfilename

Redis replication复制模式详解_数据_11

  • 从机访问主机的通行密码masterauth,必须设置,主机则是不需要设置!!!

Redis replication复制模式详解_数据_12

4.3.常见案例一:主从演示

4.3.1.方案1:配置文件永久配置(上述操作)

4.3.1.1.配置主从连接

通过( replicaof 主库IP 主库端口 ) 可以零时指定连接的master主机(这里之前已经在配置文件设置过永久修改,可以不做),配置从库连接主库,主库不需要配置(之前已经设置),如下图:

Redis replication复制模式详解_数据_12

4.3.1.2.先启动master后,在分别启动两台slave

需要注意

  • 由于master主机的需要让两台slave从机连接,所以需要设置master主机的端口允许访问,切记!!!
  • 其次从机由于改过端口,所以在连接的时候需要指定端口
[root@localhost myredis]# redis-server /myredis/redis6380.conf
# 修改过端口,访问的时候,必须指定端口
[root@localhost myredis]# redis-cli -a 123456 -p 6380
4.3.1.3.主从关系查看
日志查看

查看主机日志:

Redis replication复制模式详解_重启_14

备机日志

Redis replication复制模式详解_redis_15

 

Redis replication复制模式详解_重启_16

命令查看:info replication命令查看

查看主机日志:

Redis replication复制模式详解_redis_17

 查看从机

Redis replication复制模式详解_重启_18

 

Redis replication复制模式详解_重启_19

4.3.1.4.主从关系常见文件解析
1.从机可以执行写命令吗?

这个是不可以的,从机只能读取主机的数据,演示如下:在6381端口的slave机器上写入数据,

Redis replication复制模式详解_数据_20

2.从机切入点问题:slave是从头开始复制还是从切入点开始复制?

案例演示:

  • 先让master启动,从k20写到k22
  • slave1跟着master同时启动,跟着写到k22
  • slave2等写到k22后才启动,那之前的是否也可以复制?

演示的结论是slave首次启动一次性读取所有的数据,后续跟随master写入,slave跟着读取

3.主机master被shutdown后,从机slave会变成主机吗?

从机不动,原地待命,从机数据可以正常使用;等待主机重启动归来

4.主机shutdown后,重启后主从关系还在吗?从机还能否顺利复制?

主机shutdown后,重启后主从关系还是存在的,从机依然可以能顺利读取主机中的数据。

5.某台从机down后,master继续,从机重启后它能的数据是否可以恢复到和主机保持一致?

从机重启后,数据是依然可以恢复,保持跟主机一致的。重启后一次性读取主机的所有信息,后续跟随主机

4.3.2.方案2:命令操作手动指定(零时,重启后会失效)

为了进行演示,两台salve从机停机在配置文件中去掉连接主机的配置项,让3台机器目前都是主机状态,各不从属。

Redis replication复制模式详解_数据_21

使用 info replication 命令查看3台机器,应该都是主机状态,这里建议两台从机修改配置后重启一下虚拟机,在查看

Redis replication复制模式详解_重启_22

Redis replication复制模式详解_redis_23

通过命令将6380、6381两台机器设置为从机slave,在两个redis中分别执行如下命令:
SLAVEOF master主机ip 端口

如下图给slave 6380设置主机是master主机为192.168.42.132端口是6379:

Redis replication复制模式详解_数据_24

分别查看6380、6381设置后的状态,查看后如下图:

Redis replication复制模式详解_重启_25

Redis replication复制模式详解_redis_26

用命令实现主从复制,2台slave从机重启后,主从关系不存在

重启两台从机,然后使用命令:info replication 查看,如下图:

Redis replication复制模式详解_重启_27

Redis replication复制模式详解_redis_28

4.4.常见案例二:上一个slave可以是下一个slave的master

上一个slave可以是下一个slave的master,slave同样可以接收其他slave的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻主master的写压力,架构如下图:

Redis replication复制模式详解_重启_29

先回复到一个主机两个从机的持久化配置,然后再中途变更转向,让6381去连接到6380,将6380当做自己的master,这时候会清除之前的数据,重新建立拷贝最新的,命令如下:

# 修改6381的主机为6380
SLAVEOF 192.168.42.134 6380

查看6381

Redis replication复制模式详解_重启_30

查看6380

这时候6380虽然既属于master又属于slave,但是注意它是没有写功能的,仅仅只是链路上的一个

Redis replication复制模式详解_数据_31

查看7379

Redis replication复制模式详解_数据_32

4.5.常见案例三:让某个slave变成一个独立的master主机

模式图如下,使当前数据库停止与其他数据库的同步,转成主数据库,让6381成为一个独立的master主机:

Redis replication复制模式详解_数据_33

在6381上执行如下命令即可:

SLAVEOF no one

查看如下图:

Redis replication复制模式详解_重启_34

五、redis复制的原理以及工作流程

redis复制工作流程如下:

1.slave启动,初次会同步请求

  • slave启动成功连接到master后会发送一个sync命令
  • slave首次全新连接master,一次完全同步(全量复制)将被自动执行,slave自身原有数据会被master数据覆盖清除

2.首次连接进行全量复制

  • master节点收到sync命令后会开始在后台保存快照(即RDB持久化,主从复制时会触发RDB),同时收集所有接收到的用于修改数据集命令缓存起来,master节点执行RDB持久化完后,master将rdb快照文件和所有缓存的命令发送到所有slave,以完成一次完全同步。
  • 而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中,从而完成复制初始化

3.通过心跳机制保持通信

通过 repl-ping-replica-period 10 参数设置报错连接的心跳,master发出PING包的周期,默认是10秒,表示每隔10s钟检查一个连接状态,称之为心跳,配置文件中如下图:

Redis replication复制模式详解_redis_35

4.进入平稳期会增量复制

Master继续将新的所有收集到的修改命令自动依次传给slave,然后完成同步。

5.当slave从机下线,然后再次上线,重连续传

  • master会检查backlog里面的offset,master和slave都会保存一个复制的offset还有一个masterId,
  • offset是保存在backlog中的。Master只会把已经复制的offset后面的数据复制给Slave,类似断点续传

六、redis复制机制的缺点

存在复制延时,信号衰减的情况

  • 由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。

master如果出现了宕机就很麻烦

  • 默认情况下,不会在slave节点中自动重选一个作为master,那么master宕机了,就需要每次都要人工干预去重启master,但是这样肯定不行,长期使用就需要有一套无人值守的机制来解决这个问题。