redis数据库操作

86 阅读6分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第32天,点击查看活动详情

Redis多机数据库-复制

在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制另一个服务器,我们称呼被复制的服务器为主服务器,而对主服务器进行复制的服务器被称为从服务器
2.8之前称之为旧版复制
2.8之后称之为新版复制

旧版复制功能实现

  • 同步
    • 同步操作作用于将从服务器的数据库状态更新至主服务器目前所处的数据库状态
    • 执行步骤
      • 从服务器向主服务器发送SYNC命令
      • 收到SYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令
      • 当主服务器的BGSAVE命令执行完毕时,主服务器会将BGSAVE生成的RDB文件发送给从服务器,从服务器接收并载入这个文件,将自己的数据库状态更新至主服务器执行BGSAVE命令时的数据库状态
      • 主服务器将记录在缓存区里面的所有写命令发送给从服务器,从服务器执行这些写命令,将自己的数据库状态更新至主服务器数据库当前所处状态
  • 命令传播
    • 命令传播操作用于在主服务器的数据库状态被修改,导致主从服务器的数据库状态出现不一致时,让主从服务器的数据库重新回到一致状态
    • 每当主服务器执行客户端发送的写命令时,主服务器的数据库就有可能被修改并导致主从服务器状态不再一致,为了让主从服务器再次回到一致状态,主服务器会将自己执行的写命令发送给从服务器执行保证主从一致
  • 缺陷
    • 当出现断线等意外操作的时候,不会将差异命令传播过去,而是会重新进行同步,再执行一次SYNC
    • 当每次需要执行SYNC命令,主从服务器需要执行以下动作
      • 主服务器需要执行BGSAVE命令来生成RDB文件,这个生成操作会耗费主服务器大量的CPU、内存和磁盘I/O资源
      • 主服务器需要将自己生成的RDB文件发送给从服务器,这个发送操作会耗费主从服务器大量的网络资源(带宽和流量),并对主服务器响应命令请求的时间产生影响
      • 接收到RDB文件的从服务器需要载入相应的文件,并且在载入期间,从服务器会因为阻塞没有办法处理命令请求

新版复制功能实现

  • 同步
    • PSYNC
    • 完整重同步
      • 处理初次复制情况
      • 执行步骤和SYNC命令的执行步骤基本一致,主服务器创建并发送RDB文件,以及向从服务器发送保存在缓冲区里边的写命令进行同步
    • 部分重同步
      • 处理断线后重复制情况
      • 当从服务器在断线后重新连接主服务器时,如果条件允许,主服务器可以将主从服务器连接断开期间执行的写命令发送给从服务器,从服务器只需接收并执行这些写命令就可以将数据库更新至主服务器目前所处状态
  • 部分重同步的构成
    • 主服务器的复制偏移量
      • 复制的双方会分别维护一个复制偏移量
      • 主服务器每次向从服务器传播N个字节的数据时,就将自己的复制偏移量加上N
      • 从服务器每次收到主服务器传播来的N个字节的数据时,就将自己的复制偏移量加上N
      • 判断主从度武器是否处于一致状态,根据偏移量是否相等就可以判断
    • 主服务器的复制积压缓冲区
      • 复制积压缓冲区是由主服务器维护的一个固定长度先进先出队列,默认大小为1MB
    • 服务器的运行ID

PSYNC命令的实现

  • 流程
    • 从服务器接到客户端发来的SLAVEOF命令
    • 是否为从服务器的第一次执行复制
        • 向主服务器发送PSYNC ? -1命令
        • 向主服务器发送PSYNC
        • 主服务器是否返回+CONTINUE ?
        • 如果是就执行部分重同步,结束复制
    • 主服务器返回+ FULLESYNC 执行完整重同步

复制的实现

主服务器通过向从服务器传播命令来更新从服务器的状态,保持主从服务器一致
从服务器通过向主服务器发送命令来进行心跳检测以及命令丢失检测
  • 步骤1 设置主服务器的地址和端口
    • 设定从服务器为 127.0.0.1:12345 主服务器为 127.0.0.1:6379
    • eg
          127.0.0.1:12345> SLAVEOF 127.0.0.1 6379
          OK
      
  • 步骤2 建立套接字连接
    • 在SLAVEOF命令执行后,从服务器将根据命令所设置的IP地址和端口,创建连向主服务器的套接字连接
  • 步骤3 发送PING命令
    • 作用
      • 通过发送PING命令检查套接字的读写状态是否正常
      • 检查主服务器能否正常处理命令请求
    • 返回
      • 不能在规定的时间读取并返回,从服务器断开并重新创建连向主服务器的套接字
      • 返回错误,表示主服务器暂时没有办法处理从服务器的命令请求,从服务器断开并重新创建连向主服务器的套接字
      • 返回PONG,表示主从服务器之间的网络连接正常,主服务器可以正常处理从服务器发送的命令请求
  • 步骤4 身份验证
    • 根据从服务器是否设置masterauth判断是否需要进行身份验证
  • 步骤5 发送端口信息
    • 向主服务器发送从服务器的监听端口号
    • REPLCONF listening-port
  • 步骤6 同步
    • 从服务器向主服务器发送PSYNC命令,执行同步操作,并将自己的数据库更新至主服务器目前所处的状态
    • 如果PSYNC命令执行的是完整重同步操作,那么主服务器需要成为从服务器的客户端,才能保证在缓冲区的写命令发送给从服务器执行
    • 如果PSYNC命令执行的是部分重同步操作,那么主服务器需要成为从服务器的客户端,才能向从服务器发送保存在复制积压缓冲区里面的写命令
  • 步骤7 命令传播
    • 主服务器一直将自己执行的写命令发送给从服务器,而从服务器只要一直接收并执行从服务器发来的写命令就可以保持主从服务器数据的一致

心跳检测

从服务器发送心跳检测到主服务器查看主从连接是否正常,默认每秒一次
  • 作用
    • 检测主从服务器的网络连接状态
    • 辅助实现min-slaves选项
    • 检测命令丢失