深入检出 Redis 主从复制

一、概述

单机、单节点、单实例问题

  • 单点故障
  • 容量有限
  • 压力

image.png
X 轴问题
image.png

  • 主备数据一致性
    • 强一致性:降低可用性
    • 最终一致性:使用可靠的速度快的消息队列集群

二、实现

info replication: 分片信息

1. 主从复制

replicaof: 5.0 以后
**slaveof:**5.0 以前

1
2
# 成为 127.0.0.1 6379 的从节点
slaveof 127.0.0.1 6379

2. 取消主从复制

slaveof no one:

1
slaveof no one

3. 配置方式

3.1. 主节点配置

1
2
3
4
5
6
7
8
port 6379
daemonize yes
# pid 文件
pidfile /var/run/redis-6379.pid
logfile "6379.log"
# 主从复制依赖于 rdb
dbfilename dump-6379.rdb
dir /opt/soft/redis/data/

3.2. 从节点配置

1
2
3
4
5
6
7
8
9
10
11
12
port 6380
daemonize yes
# pid 文件
pidfile /var/run/redis-6380.pid
logfile "6380.log"
# 主从复制依赖于 rdb
dbfilename dump-6380.rdb
dir /opt/soft/redis/data/
slaveof 127.0.0.1 6379
slaveof ip port
# 从节点只读
slave-read-only yes

三、主从链

避免复制风暴
随着负载不断上升,主服务器可能无法很快地更新所有从服务器,或者重新连接和重新同步从服务器将导致系统超载。
为了解决这个问题,可以创建一个中间层来分担主服务器的复制工作。中间层的服务器是最上层服务器的从服务器,又是最下层服务器的主服务器。
image.png

四、复制

1. 全量复制

image.png
全量同步过程:

  1. 获取 runId 和 offset
    1. [1] slave 请求同步: slave 发送 psync runId offset 到 master 请求全量同步。由于不知道 master 的 runId 所以第一次请求发送 psync ? -1
    2. [2] master 返回信息: 返回 master 的 runId 和 offset
    3. [3] slave 保存信息
  2. 获取 RDB 文件 和 写命令
    1. _[4] master 持久化:_maset 异步执行 RDB 持久化(bgsave),同时把这之后执行的写命令加入缓冲区 repl_back_buffer
    2. [5] 发送 RDB 文件
    3. [6] 发送写命令
  3. 丢弃所有数据,载入 RDB 文件并执行写命令
    1. [7] 丢弃旧数据
    2. [8] 载入 RDB 文件和写命令

2. 部分复制

image.png
发送 pysnc runId offset 到 master 获取当前偏移量之后的数据