Redis主从复制介绍

Redis的持久化功能在一定程度上保证了数据的安全性,即便是服务器宕机的情况下,也可以保证数据的丢失非常少。通常,为了避免服务的单点故障,会把数据复制到多个副本放在不同的服务器上,且这些拥有数据副本的服务器可以用于处理客户端的读请求,扩展整体的性能。

主从复制的好处:

  • 数据冗余,实现数据的热备份
  • 故障恢复,避免单点故障带来的服务不可用
  • 读写分离,负载均衡。主节点负载读写,从节点负责读,提高服务器并发量
  • 高可用基础,是哨兵机制和集群实现的基础

主从复制,master以写为主,slave以读为主,当master数据变化的时候,自动将新的数据异步同步到其他的slave数据库

主从复制配置

准备三台虚拟机,构成一主二仆的结构

修改配置文件

redis6379.conf为例,步骤如下:

  1. 开启daemonize yes
    1
    2
    # 设置为后台运行
    daemonize yes
  2. 注释掉bind 127.0.0.1
  3. protected-mode no
  4. 指定端口
  5. 指定当前工作目录,dir
  6. pid文件名字,pidfile
  7. log文件名字,logfile
  8. requiredpass,密码
  9. dump.rdb名字
  10. aof文件,appendfilename
  11. 从机访问主机的masterauth

一主二从

修改配置文件方式

  • 修改从机配置文件
    replicaof 主库IP 主库端口
  • 先master后两台slave依次启动

  • 主从关系查看
    主机日志

    从机日志

    命令:info replication命令查看

主从问题

  1. 从机无法进行写操作,只能读
  2. 主机shutdown后,从机不动,原地待命,从机数据可以正常使用,等待主机重启归来
  3. 从机挂掉后,master存活,从机重启后,仍然为master的从机,能够正确活动。
  4. master挂掉后,重启之后主从关系不变,从机仍然为从机,可以进行复制。
  5. 从机切入点问题,从机跟随master后,在开始时会将master的数据全部写入,之后master修改的数据写一条,slave跟一条。

手动命令进行修改主从关系

将.conf配置文件注释掉,replicaof ip 端口,info replication分别查看主从关系信息

手动配置主从信息
salveof 主库IP 主库端口

区别

配置文件的主从关系永久生效,手动命令配置主从关系重启就会失效。

薪火相传

  • 上一个slave可以是下一个slave的master,slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻主master的写压力
  • 中途变更转向:会清除之前的数据,重新建立主从关系并拷贝最新的
  • slaveof 新主库IP 新主库端口

反客为主

slaveof no one 使当前数据库停止与其他数据库的同步关系

复制原理和工作流程

slave启动,同步初请

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

首次连接,全量复制

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

心跳持续,保持通信

repl-ping-replica-period 10

进入平稳,增量复制

  • master继续将新的所有收集到的修改命令自动依次传送给slave,完成同步

从机下线,重连续传

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

复制的缺点

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

master挂了怎么办?
默认情况下,不会在slave节点中自动选一个master

Redis的哨兵就是解决方法

参考:Redis主从复制的配置和实现原理
https://github.com/Romantic-Lei/Learning-in-practice/tree/master/Redis/8.Redis%E5%A4%8D%E5%88%B6(replica)