Redis主从复制
- 在Redis集群中,让若干个Redis服务器去复制另一个Redis服务器,我们定义被复制的服务器为主服务器(master)
- 对主服务器进行复制的服务器则被称为从服务器(slave)
- 这种模式叫做主从复制模式
- 数据流向是单向的,只能是从master到slave;一个slave只能有一个master
作用
- 为数据提供多个副本,实现高可用
- 实现读写分离(主节点负责写数据,从节点负责读数据,主节点定期把数据同步到从节点保证数据的一致性),主从复制配合读写分离可以分担单个服务器负载提高Redis服务器并发量实现负载均衡
- 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复,但实际上是一种服务的冗余
实现
主从复制的开启,完全是在从节点发起的,不需要我们在主节点做任何事情, 从节点开启主从复制,有3种方式
- 配置文件
在从服务器的配置文件中加入:slaveof< masterip>< masterport> - 启动命令
启动命令redis-server后加入:slaveof< masterip>< masterport> - 客户端命令
Redis服务器启动后直接通过客户端执行命令:slaveof< masterip>< masterport>,则该Redis实例成为从节点
断开复制
- 通过slaveof< masterip>< masterport>命令建立主从复制关系以后,可以通过slaveof no one断开
- 从节点断开复制后,不会删除已有的数据,只是不再接受主节点新的数据变化
实现原理
主从复制主要可分为:连接建立阶段(即准备阶段)、数据同步阶段、命令传播阶段
建立链接阶段
主要作用是在主从节点之间建立连接,为数据同步做好准备
数据同步阶段
从节点数据的初始化,具体执行的方式是:从节点向主节点发送psync命令(Redis2.8以前是sync命令),开始同步,根据主从节点当前状态的不同,同步方式可能是全量复制或部分复制
全量复制
于初次复制或其它无法进行部分复制的情况,将主节点中的所有数据都发送给从节点,是一个非常重型的操作
- 从节点判断无法进行部分复制,向主节点发送全量复制的请求;或从节点发送部分复制的请求,但主节点判断无法进行全量复制
- 主节点收到全量复制的命令后,执行bgsave,在后台生成RDB文件,并使用一个缓冲区(称为复制缓冲区)记录从现在开始执行的所有写命令
- 主节点的bgsave执行完成后,将RDB文件发送给从节点;从节点首先清除自己的旧数据,然后载入接收的RDB文件,将数据库状态更新至主节点执行bgsave时的数据库状态
- 主节点将前述复制缓冲区中的所有写命令发送给从节点,从节点执行这些写命令,将数据库状态更新至主节点的最新状态
- 如果从节点开启了AOF,则会触发bgrewriteaof的执行,从而保证AOF文件更新至主节点的最新状态
部分复制
- 用于网络中断等情况后的复制,只将中断期间主节点执行的写命令发送给从节点
- 与全量复制相比更加高效。需要注意的是,如果网络中断时间过长,造成主节点没有能够完整地保存中断期间执行的写命令,则无法进行部分复制,仍使用全量复制
命令传播阶段
主节点将自己执行的写命令发送给从节点,从节点接收命令并执行,从而保证主从节点数据的一致性