[准备面试|Redis]- 主从复制

140 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情

前言

本系列主要从基础知识,而后进阶,再逐步深入 Redis 的原理分析,以保证对 Redis 的学习深入浅出,学以致远并输出自己对 Redis 学习和了解的成果。本系列将划分四个部分:

主从复制

使用 Redis 复制进行持久化功能,保证了重启服务器时数据不丢失,但若只存储在一台服务器上,一旦服务器硬盘出现故障就会导致数据丢失。

所以,Redis 提供可以配置主从数据库,然后通过执行复制(replication)功能,将数据从主数据库同步到从数据库中。

一般主数据库进行写操作,从数据库进行读操作。读写分离,可以提高服务的负载能力。一主多从适合读多写少的场景,但一个主库无法满足时可以使用集群的功能。

主从复制原理

  • 从数据库启动后,向主库发送 sync 命令。
  • 主库接收 sync 命令后在后台进行 RDB 持久化,期间收到的命令会缓存起来
  • 主库快照完成后,将快照文件和缓存命令发送给从库
  • 从库接收快后,会载入快照文件并执行缓存命令(整个过程就是复制初始化)
  • 之后主库接收写命令都会同步给从库

主从库连接断开后重连,会发生什么?

  • 在2.6版本之前,都是重新进行复制初始化
  • 在 2.8 版本开始支持有条件的增量数据传输,仅将断线期间执行的命令传送给从数据库,提高了 Redis 复制的实用性。

复制策略

Redis 采用乐观复制的复制策略。容忍在一定时间内主从数据库的内容是不同,但两者的数据最终会同步。

Redis 的有两个配置限制只有当数据至少同步给指定数量的从数据库时,主数据库才可以写入。

min-slaves-to-write 3  // 三个及以上从库连上主库时,主库才可写
min-slaves-max-lag 10 // 允许从库最长市区连接的时间

主库关闭持久化,从库开启持久化

持久化是个耗时的操作,为了提高性能,主库禁止持久化保证服务写入,从库开启持久化。

  • 从库奔溃重启,则可从主库自动同步过来保证数据不丢失

  • 主库奔溃时,则需要手动通过从库中恢复数据,操作命令

    slaveof no one  // 将从库提升为主库
    slaveof IP PORT // 将奔溃重启后的主库设置为从库