Redis 复制(Replication)

简介

http://redis.io/docs/management/replication (opens in a new tab)

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

作用

  • 读写分离
  • 容灾恢复
  • 数据备份
  • 水平扩容支持高位并发

操作步骤

  • 配从(库)不配主(库)

  • 权限细节

    • master 如果配置了 requirepass 参数,需要密码登录;

    • 那么 slave 就要配置 master auth 来设置校验密码,否则的话 master 会拒接 slave 的访问请求。

      masterauth <master-password>
  • 基本操作命令

    • info replication

      可以查看复制节点的主从关系和配置信息

    • replicaof <master-ip> <master-port>

      一般写入进 redis.conf 配置文件内

    • slaveof <new master-ip> <new master-port>

      • 每次与 master 断开之后,都需要重新连接,除非你配置进 redis.conf 文件
      • 在运行期间修改 slave 节点的信息,如果该数据库已经是某个主从数据库的从数据库,那么会停止和原主数据库的同步关系转而和新的主数据库同步
    • slaveof no one

      使当前数据库停止与其他数据库的同步,转成主数据库

示例

架构说明

一个 master 和两个 slave,拷贝多个 redis.conf 文件(redis6379.conf,redis6380.conf,redis6381.conf)

口诀

  • 机器间网络相互 ping 通且注意防火墙配置
  • 命令
    • 主从复制(配从库不配主库):replicaof <master-ip> <master-port>
    • 修改主库:slaveof <new master-ip> <new master-port>
    • 由从库改为主库:slaveof no one

修改配置文件细节操作(以 redis6379.conf 为例)

# 开启 daemonize yes
daemonize yes
 
# 注释掉 bind 127.0.0.1
# bind 127.0.0.1 -::1
 
# protected-mode no
protected-mode no
 
# 指定端口
port 6379
 
# 指定当前工作目录,dir
dir /myredis
 
# pid 文件名字,pidfile
pidfile /var/run/redis_6379.pid
 
# log 文件名字,logfile
logfile "/myredis/6379.log"
 
# requirepass
requirepass <password>
 
# dump.rdb 名字
dbfilename dump6379.rdb
 
# aof 文件,appendfilename,可选非必须
appendonly yes
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
 
# 从机访问主机的通行密码 masterauth(从机必须配置,主机不需要配置)
replicaof <master-ip> <master-port>
masterauth <master-password>

常用技巧

一主二从

配置文件固定写死
  • 配置文件执行 replicaof <master-ip> <master-port>

  • 配从库不配主库

    replicaof <master-ip> <master-port>
    masterauth <master-password>
  • 先启动 master 机器再启动 slave 机器

  • 主从关系查看

    • 日志

      • 主机日志

        ...
        Synchronization with replica <slave0-ip>:<slave0-port> succeeded
        ...
        Synchronization with replica <slave1-ip>:<slave1-port> succeeded
        ...
      • 备机日志

        ...
        Connecting to MASTER <master ip>:<master port>
        ...
        Successful partial resynchronization with master.
        ...
    • 命令

      info replication

命令操作手动执行
  • 在从机上执行命令 slaveof <master-ip> <master-port>
  • 当从机重启,主从关系不存在。
主从问题演示
  • 从机可以执行写命令吗?

    从机只可以读取不可以写。

    (error) READONLY You can't write against a read only replica.
  • 从机切入点问题

    slave 是从头开始复制还是从切入点开始复制?
    master 启动,写到 k3
    slave1 跟着 master 同时启动,跟着写到 k3
    slave2 写到 k3 后才启动,那之前的是否也可以复制?

    Y,首次全量复制,后续跟随,master 写,slave 跟。

  • 主机 shutdown 后,从机会上位吗?

    从机不动,原地待命,从机数据可以正常使用;等待主机重启。

  • 主机 shutdown 后,重启后主从关系还在吗?从机还能否顺利复制吗?

    主从关系不变,从机可以顺利复制。

  • 某台从机 shutdown 后,master 继续,从机重启后能跟上大部队吗?

    可以。

配置和命令的区别

配置持久稳定;命令当次生效。

链式主从

  • 上一个 slave 可以是下一个 slave 的 master ,slave 同样可以接收其他 slaves 的连接和同步请求,那么该 slave 作为了链条中下一个的 master,可以有效减轻主 master 的写压力;

  • 中途变更转向:会清楚之前的数据,重新拷贝最新的,命令 slaveof <new-master-ip> <new-master-port>

从机转主

slaveod no one,使当前数据库停止与其他数据库的同步,转成主数据库。

复制原理和工作流程

  • slave 启动,同步初请

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

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

    master 发出 PING 包的周期,默认是 10 秒,repl-ping-replica-period 10

  • 进入平稳,增量复制

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

  • 从机下线,重连续传

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

复制的缺点

  • 复制延迟,信号衰减

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

    Redis 主从示意图

  • master 宕机如何办?

    默认情况下,不会在 slave 节点中自动重选一个 master;每次都要人工干预,重启 Redis Server。无人值守安装变成刚需。