Redis可用性

发布时间 2023-11-04 12:29:29作者: kiper

主从模式

读写分离,master处理读写命令,slave仅处理读命令。

image

为什么仅有一个masater能处理读? 这是避免引入加锁、实例间协商是否完成修改等操作。

主从同步方式

通过replicaof {master_ip} 6379去请求RDB文件,同步细节如下。

image

  1. 从库给主库发送 psync 命令,表示要进行数据同步。

    psync 命令包含了主库的 runID 和复制进度 offset 两个参数。runID是Redis 实例启动时自动生成的随机 ID唯一标记,第一次复制时主库 runID未知设为“?”。offset为 -1,表示第一次复制。

  2. 主库通过 FULLRESYNC响应命令,返回主库 runID和主库复制进度offset。从库记录此数据。

  3. 主库启动bgsave命令生成RDB文件并发送给从库,从库清空当前内存数据并加载RDB数据。

  4. 主库发送同步期间replication buffer缓存的写命令给从库,从库回放写命令,完成数据同步。

解决主服务器同步压力

Redis宕机恢复提到过bgsave会增加cpu和内存负载,并会短暂阻塞主进程。可以考虑通过将部分从服务器作为二级从服务器的主服务器,分担全量复制的从服务器压力。

网络断连处理

Redis从服务器会定期发送REPLCONF ACK offset从主服务器拉取数据。但当网络波动时,可能会导致offset落后较多。

主服务器在接受写命令时,会缓存到一个环形缓冲区repl_backlog_buffer中,并更新master offset。接受到从服务器同步slave offset后,会判断repl_backlog_buffer是否还覆盖此位移。若包含则将落后的写命令缓存到replication buffer等待从服务器读取同步;否则,通过bgsave生成RDB走全量同步流程。

1. repl_backlog_buffer
   环形缓冲区,主服务器上的一块缓存,用于记录写命令,同步从服务器的备份缓存。可以根据redis写命令tps/网络IO/从服务器同步时间调整大小。

2. replication buffer
   从服务器等于client,此buffer意义同client buffer,故每个从服务器都有单独的replication buffer。
   数据需要写入replication buffer,再通过socket buffer发送出去,所以主服务器的写命令也会同时写入replication buffer。
   只有当从服务器断连后,便会用到repl_backlog_buffer去捞取丢失的命令。

哨兵模式

待写。