Redis主从复制(Master/Slave)
摘抄并用于自查笔记 https://www.cnblogs.com/daofaziran/p/10978628.html
Redis 主从复制原理总结
和 mysql 的主从复制的原因一样,redis 虽然读取和写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,redis 支持主从复制,redis 的主从结构可以采用一主多从或者级联结构,redis 主从复制可以根据是否是全量分为全量同步和增量同步。
全量同步
redis 全量复制一般发生在 slave 初始化阶段,这时 slave 需要将 master 上的所有数据都复制一份。具体步骤如下:
- 从服务器连接主服务器,发送 SYNC 命令
- 主服务器接收到 SYNC 命令后,开始执行 bgsave 命令生成 RDB 文件,并使用缓冲区记录此后执行的所有写命令
- 主服务 bgsave 执行完成后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令
- 从服务器收到快照文件后丢弃所有旧数据,载入收到快照
- 主服务器快照发送完成后开始向从服务器发送缓冲区中的写命令
- 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令
增量同步
redis 增量复制指的是 slave 初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。
redis 主从同步策略
主从刚连接的时候,进行全量同步;全量同步结束后,进行增量同步。如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。
主从复制的一些特点
- 采用异步复制
- 一个主 redis 可以含有多个从 redis
- 每个从 redis 可以接收来自其他从 redis 服务器的连接
- 主从复制对于主 redis 服务器来说是非阻塞的,这意味着当从服务器在进行主从复制同步过程中,主 redis 仍然可以处理外界的访问请求
- 主从复制对于从 redis 来说也是非阻塞的,这意味着即使从 redis 在进行主从复制过程中也是可以接收外界的查询请求,只不过此时 redis 返回的是以前的老数据,如果不想这样,那么在启动 redis 时,可以在配置文件中进行设置,那么从 redis 在复制同步过程中,来自外界的查询请求都会返回错误给客户端
- 主从复制提高了 redis 服务的扩展性,避免单个 redis 服务器的读写访问压力过大的问题,同时也可以给数据备份及冗余提供一种解决方案
- 为了避免主 redis 服务器写磁盘压力带来的开销,可以配置让主 redis 不再将数据持久化到磁盘,而是通过连接让一个配置的从 redis 服务器及时的将相关数据持久化到磁盘,不过,这样会存在一个问题,就是主 redis 服务器一旦重启,因为主 redis 服务器数据为空,这时候通过主从同步可能导致从 redis 服务器上的数据也被清空
部分重新同步
主服务器端为复制流维护一个内存缓冲区,主从服务器都维护一个复制偏移量(replication offset)和 master run id,当从服务器连接断开又重连主服务器后,请求继续复制,如果主从服务器的两个 master run id 相同,并且指定的偏移量在内存缓冲区还有效,复制就会从上次中断的点开始继续。如果其中一个条件不满足,就会进行完全重新同步。