Redis④集群:主从复制 & 常用策略


主从复制:主机数据更新后,根据配置和策略自动同步到从机。

  • 主从复制是在多台服务器下的概念,通常是一主多从
  • Master 以写操作为主,Slaver 只能读操作。
  • 作用读写分离,性能扩展、容灾快速恢复

1、一主两从

1.1、搭建

一主两从为例。

一主多从只需在此基础上添加配置个数。

  1. 创建配置文件

    • 作为每个数据库实例的启动配置。

    • 创建 3 个,代表 3 个实例(一主二从)

      # redis6379.conf
      include /opt/etc/redis.conf
      pidfile /var/run/redis_6379.pid
      port 6379
      dbfilename dump6379.rdb
      
      # redis6380.conf
      include /opt/etc/redis.conf
      pidfile /var/run/redis_6380.pid
      port 6380
      dbfilename dump6380.rdb
      
      # redis6381.conf
      include /opt/etc/redis.conf
      pidfile /var/run/redis_6381.pid
      port 6381
      dbfilename dump6381.rdb
      Copy
      
  2. 启动服务器

    redis-server redis6379.conf
    redis-server redis6380.conf
    redis-server redis6381.conf
    
  3. 配置从机:指定主服务器的主机端口号。

    • 在命令行中运行,从服务器重启不再是从属于原来的主服务器。

    • 将从机配置增加到文件中。永久生效。

      slaveof 
      

1.2、说明

  1. 主服务器可以读写操作(通常只写),从服务器只读。
  2. 若主服务器异常关闭,从服务器不会变成新的主服务器。
  3. 复制延时问题:从 Master 到 Slaver 的同步存在延迟。
    • 原因:写操作先在 Master 上执行,再同步更新到 Slaver 上。
    • 系统繁忙、Slaver 数目增加都会加重延迟问题。

1.3、复制原理

初连接

只要重连 Master,就会自动执行全量复制。

  1. Slaver 启动并成功连接到 Master 后,向 Master 发送 sync 同步命令。
  2. Master 接到命令,执行全量复制

同步

  • 全量复制:通常是 Slaver 连接时
    • Master 启动后台存盘进程(folk),对数据进行持久化操作。
      • Master 也会收集写操作命令。
      • 后台进程执行完毕后,将 rdb 文件传输给 Slaver。
    • Slaver 接收 rbd 文件并存盘,加载到内存中并读取备份。
    • 完成一次全量复制(完全同步)
  • 增量复制:通常是 Master 执行写操作后。
    • Master 将所有收集到的写操作命令依次传给 Slaver,完成同步。

2、常用主从策略

原做法:Master 下有多个 Slaver。

image-20220416013132167

2.1、薪火相传

做法:Master 下只有一个直接的 Slaver,Slaver 之间形成链。

  • 示例:Slaver1 作为 Master 下直接的从服务器,Slaver2 作为 Slaver1 的从服务器。

  • 优点:降低 Master 的同步压力,去中心化。

    image-20220416013142511

说明

  • 修改链中的主从关系:会清除之前的数据,同步最新数据。

  • 当某个 Slaver 宕机,之后的 Slaver 无法备份。

  • Master 异常关闭后,无法进行写操作。

2.2、反客为主

做法:在薪火相传的基础上。

  • 当链中某一台 Master 宕机,其直接的 Slaver 升为 Master。

    slaveof no one
    
  • 之后的 Slaver 无需改变。

2.3、哨兵模式(?)

2.3.1、说明

反客为主的自动版

做法:后台监控主服务器是否故障,若故障则自动根据投票数将从库转换为主库。

步骤

  1. 创建 sentinel.conf 文件

    /opt/etc/sentinel.conf
    
  2. 配置哨兵

    • guardname:哨兵服务器名称。

    • master:哨兵监控的主服务器 IP 地址和端口号。

    • n:至少有 n 个哨兵同意才转换。

      sentinel monitor [guardname] [master] [n]
      
  3. 启动哨兵

    redis-sentinel  /opt/etc/sentinel.conf 
    

2.3.2、选举规则

redis.conf

优先级别:值越小优先级越高(默认100)

  • 旧版:slave-priority
  • 新版:replica-priority

选取规则如下顺序

  1. 选择优先级靠前的(redis.config

  2. 选择偏移量大的(与主服务器的数据同步率最高的)

  3. 选择 runid 最小的服务(Redis 服务器实例启动时随机生成的 40 位二进制数)