关系数据库通常会使用一个主服务器向多个从服务器发送更新,并使用从服务器来处理所有读请求,Redis也采用了同样的方法来实现自己的复制特性,并将其用做扩展性能的一种手段。
一、特点:
1、异步复制:Redis默认使用的是异步复制,其特点低延迟和高性能,是绝大多数Redis用例的自然复制模式。从Redis服务器会异步的确认其从主服务器周期接收到的数据量。客户端可以使用WAIT命令来请求同步复制特定的数据。
2、一个master可以有多个slave;slave可以接受其它salve的链接。除了多个slave可以连接到同一个master外,slave之间也可以像层叠状的结构连接到其它slave。
3、非阻塞复制:Redis复制在master是非阻塞的。这意味着master在一个或多个slave进行初次同步或者部分重同步时,可以继续处理查询请求;复制在slave大部分也是非阻塞的。当slave进行初次同步时,它可以使用旧数据集处理查询请求,需要在redis.conf中配置。也可以配置如果复制流断开,Redis slave会返回一个error给客户端。但是在初次同步之后,旧的数据集必须被删除,同时加载新的数据集。
4、可以使用复制来避免master将全部数据集写入磁盘造成的开销:一种典型的技术时配置你的master Redis.conf以避免对磁盘进行持久化,然后连接一个slave,其配置为不定期保存或启用AOF。注意:这个设置需要小心处理,因为重新启动master程序将从一个空数据集开始:如果一个slave视图与它同步,那么这个slave也会被清空。
5、原理:master启动会生成一个run id,首次同步时会发送给slave,slave同步命令会带上run id以及offset,显然,slave启动(初次,重启)内存中没有run id,所以master收到后会全量同步,发生网络抖动时,slave发生的同步命令会带上run id以及offset,master就知道去缓存中对应的偏移量开始到结尾那一段的命令发送给slave进行增量同步。在正常运行过程中,master每收到一个数据变更命令都会发送到所有slave上。
二、主从复制流程:
主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。
1、全量同步:Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:
(1)从服务器连接或者重连接主服务器,发送SYNC命令;
(2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
(3)主服务器BGSAVE执行完后,向所有从服务器(之所以是向所有从服务器发送应该是因为初始化是几乎同时收到SYNC命令,归根到底是向所有发送了SYNC命令的slave发送RDB文件,master不会重复生成rdb这个动作,因为bgsave和bgrewriteaof不会同时执行,如果执行bgsave发现有子进程在执行bgsave,则会立即返回)发送快照文件,并在发送期间继续用缓存区记录被执行的写命令;
(4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照; 这里注意,从服务器在与主服务器进行初始连接时,数据库中原有的所有数据都将丢失,并被替换成主服务器发来的数据。
(5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
(6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
完成上面几个步骤后就完成了从服务器数据初始化的所有操作,从服务器此时可以接收来自用户的读请求。
2、增量同步:Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程,同时记入缓存中,如果slave临时掉线了,接上来后可以同步这段时间的数据。
增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。
注意:Redis不支持主主复制。
三、主从链:从服务器也可以拥有自己的从服务器,形成主从链。
四、更换故障主服务器: