7-1 什么是主从复制

单机有什么问题?

  • 机器故障(如何保证高可用)
  • 容量瓶颈
  • QPS瓶颈

    主从复制的作用

  • 数据副本(高可用)

  • 读写分离,扩展读的性能

    主从复制的形式

  • 一主一从。

  • 一主多从。
  • 树形。

一个master可以由多个slave,但是一个slave只能由一个master。
数据流是单向的,只能由master到slave。
master和slave原则上不应在一台物理机上,那样就失去了高可用的意义。

7-2 主从复制配置

有两种方式:

  1. slaveof命令。
  2. 配置。

    命令实现

    让一个节点称为另一个节点的Slave

    让6380称为6379的slave:
    image.png
    注意:

  3. 执行slaveof命令,会先清空当前从节点的数据,再从主节点复制。

  4. 这里的slaveof命令会立即返回,但复制并没有完成。redis会在后台继续完成复制工作,复制时间长短取决于数据量大小和带宽。

    取消复制

    让6380不再作为6379的slave:

image.png
注意:

  • 执行完该命令后,并不会清空从节点数据,只是从主节点断开连接,不再从主节点复制数据。

    配置实现

    1. slaveof ip port # 设置主节点
    2. slave-read-only yes # 让从节点只负责读

    查看复制状态

    在redis-cli中执行:
    1. info replication

    7-3 runid和复制偏移量

    run_id

    每次一个redis节点启动之后,该节点都会随机生成一个标识该节点的run_id,可以通过info命令查看到。当节点重启之后,该run_id会发生变化。在主从复制中,当从节点发现主节点的run_id发生了变化,则说明主节点可能发生了重启,那么会执行一次全量复制,以保证数据一致性。

    复制偏移量

    复制偏移量是一个整数,表示一个节点的数据状态(或者叫进度)。当修改了节点数据之后,这个数值会增大。主从节点之间,会尽力保证该值相等。如果相等,则说明主从节点的数据状态一致。
    可通过info命令查看。

    7-4 全量复制

    image.png

    7-5 部分复制

    全量复制的开销

  1. bgsave时间
  2. RDB文件网络传输时间
  3. 从节点清空数据的时间
  4. 从节点加载RDB的时间
  5. 从节点可能的AOF重写时间

    部分复制

    image.png

    7-6 故障处理

salve宕机

让客户端的读不要指向宕机的节点。

master宕机

选择一个slave,使其成为master

自动故障转移

sentinel提供了节点状态监控、自动转移故障、通知客户端可用节点等等功能。见下一章。

7-7 主从复制场景问题

读写分离

  • 复制数据的延迟
  • 读到过期数据(3.2之后已经解决了该问题)。Redis删除过期数据可能是惰性删除的,即下次访问时才判断是否需要删除该数据。而主从复制中,从节点负责读,但它又没有删除权限,这导致过期数据无法被删除。
  • 从节点故障。

    主从配置不一致

    例如maxmemory不一致:丢失数据。

    规避全量复制

    产生全量复制的场景:
  1. 初始化时全量复制。
  2. run_id不匹配。
  3. 复制积压缓冲区不足。

    规避复制风暴