主从复制概述
有了AOF和RDB,如果Redis发生了宕机,它们可以分别通过回放日志和重新读入RDB文件的方式恢复数据,从而保证尽量少丢失数据,提升可靠性。但是如果Redis实例宕机了,就无法提供服务了。
既然⼀台宕机了⽆法提供服务,那多台呢?是不是就可以解决了。Redis 提供了主从模式,通过主从复制,将数据冗余⼀份复制到其他 Redis 服务器。
前者称为主节点 (master),后者称为从节点 (slave);数据的复制是单向的,只能由主节点到从节点。
默认情况下,每台 Redis 服务器都是主节点;且⼀个主节点可以有多个从节点 (或没有从节点),但⼀个从节点只能有⼀个主节点。
Redis读写分离
多实例保存同一份数据,这么多副本,它们之间的数据如何保持一致呢?数据读写操作可以发给所有的实例吗?
实际上,Redis提供了主从库模式,以保证数据副本的一致,主从库之间采用的是读写分离的方式。
-
读操作:主库、从库都可以接收;
-
写操作:首先到主库执行,然后,主库将写操作同步给从库。
我们可以假设主从库都可以执⾏写指令,假如对同⼀份数据分别修改了多次,每次修改发送到不同的主从实例上,就导致是实例的副本数据不⼀致了。如果为了保证数据⼀致,Redis 需要加锁,协调多个实例的修改,Redis 自然不能这么设计。
怎么搭建主从复制架构
可以通过 replicaof(Redis 5.0 之前使⽤ slaveof)命令形成主库和从库的关系。
在从节点开启主从复制,有 3 种⽅式:
-
配置⽂件在从服务器的配置⽂件中加⼊ replicaof <masterip> <masterport>
-
启动命令redis-server 启动命令后⾯加⼊ --replicaof <masterip> <masterport>
-
客户端命令启动多个 Redis 实例后,直接通过客户端执⾏命令: replicaof <masterip> <masterport> ,则该 Redis 实例成为从节点。⽐如假设现在有实例 1(171.18.88.1)、实例 2(171.18.88.2)和实例 3(171.18.88.3),在实例 2 和实例 3 上分别执⾏以下命令,实例 2 和 实例 3 就成为了实例 1 的从库,实例 1 成为 Master。
主从复制原理
复制分为三种情况:1. 第⼀次主从库全量复制;2. 主从正常运⾏期间的同步;3. 主从库间⽹络断开重连同步。
第⼀次主从库全量复制
主从库第⼀次复制过程⼤体可以分为 3 个阶段:连接建⽴阶段(即准备阶段)、主库同步数据到从库阶段、发送同步期间新写命令到从库阶段;