Redis主从复制

文章目录

    • 1. 简介
    • 2. 环境搭建
    • 3. 环境测试
    • 4. 总结

1. 简介

一句话就是master以写为主,Slave以读为主,当master数据变化时,自动将新的数据异步同步到其它slave数据库
Redis主从复制_第1张图片
它主要实现了下面这些特性:

  • 读写分类:写在master写,读在slave读
  • 容灾恢复
  • 数据备份
  • 水平扩容,支持高并发

master如果配置了requirepas参数,需要密码登陆,那么slave就要配置masterauth来设置校验密码,否则的话master会拒绝slave的请求

关于主从复制的重要命令如下:

命令 作用
info replication 可以参考复制节点的主从关系和配置信息
replicaof 主库ip 主裤端口 一般写入进redis.conf配置文件内(配置从数据库从属某个主数据库,长久的)
salvoes 主库ip 主库端口 每次于master断开连接之后,都需要重新连接,除非你写入配置文件,在运行期间修改slave节点的信息,如果该数据库已经是某个主数据库的从数据库,那么会停止与原主数据库的同步关系转而和新的主数据库同步,重新认大哥(配置从数据库从属某个主数据库,临时性的)
slave of no one 使当前数据库停止与其他数据库同步,转成主数据库,自立为王

2. 环境搭建

采用的环境使用一个master两个slave。

Redis主从复制_第2张图片

准备三个centos 7 实例,这里可以在原有的机器上复制,我这里将三个虚拟机分别取名为master,slave1和slave2。基本信息如下:

名称 ip地址 端口
master 192.168.31.250 6379
slave1 192.168.31.251 6380
slave2 192.168.31.252 6381

修改从库的配置文件(改从库不改主库的原则)

vim /usr/local/redis_new/redis.conf
  • 开启daemonize yes(服务端后台运行)

在这里插入图片描述

  • 注释调绑定ip bind 127.0.0.1

Redis主从复制_第3张图片

  • 关闭保护模式

Redis主从复制_第4张图片

  • 指定端口

在这里插入图片描述
在这里插入图片描述

  • 指定当前工作目录

在这里插入图片描述

  • pid文件名字,pidfile

在这里插入图片描述

  • log文件名称,logfile

r

  • 设置密码

在这里插入图片描述

  • dump.rdb名字

在这里插入图片描述

前面从机和主机是都需要配置的,下面的配置就是从机需要配置,主机不需要配置的

  • 配置从机从属于主机的信息

在这里插入图片描述

  • 配置从机访问主机的密码

在这里插入图片描述

3. 环境测试

至此主机和从机都配置好了,下面开始测试

首先启动master后两台slave启动(注意从机启动一定要指定端口)
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 查看连接接状态

Redis主从复制_第5张图片

从日志中可以看到关系建立成功了

我们也可以从从机日志中分析

Redis主从复制_第6张图片
我们使用命令也可以查看连接状态

info replication

主机上执行该命令

Redis主从复制_第7张图片

从机上执行该命令

Redis主从复制_第8张图片至此主从关系已经配置完毕了,下面测试一下主机写数据的情况。

首先我在主机上删除原来库中的所有数据,会发现两个从机的数据也被删除了。

Redis主从复制_第9张图片

在主机上写入一个值,观察从机的变化

在这里插入图片描述
可以发现两个从机都可以拿到这个数据。
在这里插入图片描述
Redis主从复制_第10张图片

关键问题

  1. 从机只能读数据而不能写数据

在这里插入图片描述

  1. 启动的晚的从机,也会同步到该从机启动之前主机操作的数据
  1. 主机宕机后,从机并不会成为主机,从机数据可以正常使用,它会一直等待主机重启

Redis主从复制_第11张图片

前面介绍的slave1和slave2都是master的直接相连的从机,但如果与master直接连接的重机过大,mater的负担会变得很大,这样就衍生出了另一个模式,如下图。

Redis主从复制_第12张图片
上一个slave可以是下一个slave的master,slave同样也可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个master,可以有效减轻master的写压力。此时中途更换转向的那个机器会清除之前的数据,重新建立连接拷贝最新的数据。

Redis主从复制_第13张图片
可以发现slave2的主机已经变为了salve1

Redis主从复制_第14张图片
但注意此时slave 2还是不能写数据,因为此时slave1还是master的从,它只是充当一个中间桥梁的作用。

slaveof no one然后当前redis服务独立出来成为自己的master。

Redis主从复制_第15张图片

4. 总结

  1. Slave启动成功连接到master后会发送一个Sync命令,slave首次全新连接master,一次完全同步(全量复制)将被自动执行,slave自身原有的数据会被master数据覆盖消除。
  2. master节点收到sync命令后会开始在后台保存快照(即RDB持久化,主从复制时会触发RDB),同时收集所有接收到的用于修改数据集命令缓存起来,master节点执行RDB持久化完成后,master将rdb快照文件和素有缓存的命令发送到所有的slave,以完成一次完全同步,而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中,从而完成复制初始化。
  3. master每10s钟向slave发送一个心跳包,来检测slave是否存活
  4. Master继续将新的所有收集到的修改命令自动依此传给slave,完成同步
  5. master会检查backlog里面的offset,master和slave都会保存一个复制的offset还有一个masterID,offset是保存在backlog中的。master只会把已经复制的offset后面的数据复制给slave,类似断点续传。

缺点

  1. 由于所有写操作都是在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使得这个问题更加严重
  2. 默认情况下,如果主节点宕机了,不会从从节点中选一个节点作为新的节点,而是一直等待主节点恢复运行。

你可能感兴趣的:(Redis,redis,数据库,缓存)