概述

指将一台redis服务器上的数据,复制到其他redis服务器上,前者称为主服务器(master),后者称为从服务器(slave)。

  • 默认情况下主从关系为一对多关系。
  • 数据复制是单向的,只能从主服务器到从服务器。

作用

1、数据备份:是持久化之外的一种数据备份手段。

2、负载均衡:配合主从读写分离分担单点服务器负载压力,提高redis服务器并发量。

3、高可用基础:是哨兵和集群实施的基础。

开启主从复制

1、配置文件:从服务器配置中加入 slaveof <masterip> <masterport>

2、启动命令:从服务器启动命令 redis-server 后追加 --slaveof <masterip> <masterport>

3、直接使用命令:slaveof <masterip> <masterport>,则该redis实例变为从节点

命令 info replication 可查看复制相关状态。

关闭复制

从节点执行 slaveof no one ,则会断开与主节点复制关系。

其他配置

  • 安全性:

  安全性考虑,可以为主节点配置requirepass密码。从节点配置masterauth与主节点密码一致

  • 从节点只读性

  数据复制是单向的,为避免从节点写数据导致主从数据不一致,从节点设置为只读模式slave-read-only yes

  • 数据传输延迟

  repl-disable-tcp-nodelay no ,默认关闭传输延迟。关闭时,延迟小,但相对耗带宽,适用网络环境良好情况。开启时,主节点合并较小的数据包而节省带宽,但主从延迟增大,适用网络环境复杂带宽紧张情况。

主从复制流程

1、主从连接准备,包括socket连接,socket检查,身份校验等

2、数据同步,从节点发送复制命令psync,主节点接受命令执行bgsave,将RDB文件发送给从节点

3、命令传播,主节点将执行的写命令持续传播给从节点,保持数据一致

数据同步:

1、全量复制:

  • 主节点数据一次性全部发送给从节点。
  • 从节点发起命令 psync ? -1
  • 复制过程中,主节点会将新的写命令追加到复制缓冲区,待RDB文件传输完毕后,继续传输该缓冲区的写命令,最后从服务器执行这些写命令,保证主从数据一致。
  • 全量复制主节点需要进行RDB持久化,该过程比较耗cpu、内从、硬盘资源。
  • 主从传输RDB文件,耗宽带。
  • 从节点清空旧数据,载入新RDB的过程是阻塞的,此间无法响应客户端命令。

2、部分复制

  • 从服务器发起命令psync <runid 服务器运行ID> <offse 复制偏移量>
  • 一般用于处理在主从复制中因网络闪断等原因造成的数据丢失场景,当从节点再次连上主节点后,如果条件允许,主节点会补发丢失数据给从节点。因为补发的数据远远小于全量数据,可以有效避免全量复制的过高开销。

部分复制要素

1、服务器运行ID

  • 每台redis服务器在启动时都会随机生成一个ID作为标识,可通过info server查看run_id。
  • 建立主从关系时,主节点会将自己的run_id发送给从节点,从节点保存该ID,在断线重连时从节点将该ID发送给主节点。
  • 主节点根据从节点发来的run_id判断复制方式,如果run_id与自己的run_id相同,说明之同步过,主节点会尝试用部分复制(具体能否部分复制还要看offset和复制积压缓冲区情况)。如果不同,说明之前没有同步过,这时只能进行全量复制。

2、复制偏移量

  • 主送双方分别保存自己的复制偏移量,主节点每发送/送节点接受N个字节,自己的偏移量加N。通过主从偏移量比较就可以确定双方数据是否一致。
  • 主节点发现从节点发来的offset与自身的不一致,会从自己的复制积压缓冲区查找是否有该偏移量之后的数据,若有就给从节点发送+CONTINUE表示可以进行部分复制。

3、复制积压缓冲区

  • 复制积压缓冲区是一个固定长度的FIFO(先进先出的存储器),当主从关系建立时被创建,之后主节点的响应命令时,额外会将命令写入该缓冲区。
  • 缓冲区大小repl-backlog-size可配置,正确的估算和配置该缓冲区大小,可避免主节点执行全量复制
  • repl-backlog-size = 服务断开重连时间 * 每秒写入数据量

命令传播

  • 该阶段主节点除了向从节点发送写命令,主从之间还维持心跳机制
  • 主节点向从节点发送ping命令,判断从节点连接状态,可配置发送频率 repl-ping-slave-period,默认每10秒
  • 从节点每1秒向主节点发送 replconf ack{offset} 命令,发送自身偏移量,检查数据完整性,如果从节点丢数据,再从主节点复制积压缓冲区拉去糗事的数据。replconf ack命令还起到检测主从网络装态作用,主节点可通过 info replaction 命令查看延迟lag值,表示距离上次接受命令的时间间隔。
  • 主节点通过min-slaves-to-write、min-slaves-max-lag 保证主节点在不安全的情况下不执行写命令。如果从节点数量小于min-slaves-to-write,或所有从节点延迟指都大于min-slaves-max-lag,则主节点拒绝所有写命令
  • 配置repl-timeout,超时判断阈值,应明显大于repl-ping-slave-period,否则很容易判断为超时

最新文章

  1. mkdir,rmdir,cp,rm,mv,cat,touch用法
  2. Beta阶段第二次Scrum Meeting
  3. sublime 关闭自动更新
  4. Web前端入门了解
  5. [转载] 深入 nginx 架构
  6. IOS调试lldb命令常用po
  7. JVM基础和调优(一)
  8. Pascal 线段树 lazy-tag 模板
  9. css代码优化篇
  10. SharePoint网站集功能介绍
  11. Top 10 Mistakes Java Developers Make(转)
  12. JavaScript JSON timer(计时器) AJAX HTTP请求 同源策略 跨域请求
  13. Java线程: 线程调度
  14. 2017年最适用于WIFI HACK的无线网卡推荐
  15. Oracle 12c CDB PDB 安装/配置/管理
  16. 推荐一款MongoDB的客户端管理工具--nosqlbooster
  17. mysql 重启,修改编码utf8mb4,并修改数据库链接,生效
  18. GPT转MBR怎么转?
  19. select标签(分组下拉菜单和列表)
  20. 黄聪:Jquery+DataTables插件,如何在ajax调用服务器数据后,自动给tr添加id属性

热门文章

  1. Android Studio第一次启动的Fetching android sdk component information的问题
  2. 【树状数组】POJ 2155 Matrix
  3. android之GMS认证
  4. 新随笔(三)什么时候使用button,什么时候使用文字链接
  5. luogu2320 鬼谷子的钱袋
  6. KD树——k=1时就是BST,里面的数学原理还是有不明白的地方,为啥方差划分?
  7. 687C
  8. Python 45 长度及颜色单位 、字体样式 、文本样式 、背景样式 、css基础选择器
  9. 修改CAS源码是的基于DB的认证方式配置更灵活
  10. Java中数组要点总结