主从复制
是什么
在往往高并发的情况下,往往只是查询数据,而不是修改数据,用于主从机来缓解读写压力
所以采用主从复制机制,redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。
以下为级联结构
在一个主机下连接三个从机,而从机下再关联两个从机,主机负责写,而从机负责读,而主服务器将写的内容的快照同步到从机上,从而主从数据一致
这里分为两种
全量复制和增量复制
全量复制:发生再从机slave的初始化阶段,这时候需要将主机Msater上的所有数据都复制一遍,Redis通过psync命令进行全量复制。
- 从机连接主机,然后发送SYNC同步命令
- 主服务器接收到sync命令后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令
- 主服务器BGSAVE执行完后,向所有从机发送快照RDB文件,并在发送期间继续记录被执行的写文件
- 从机收到快照文件后丢弃所有的旧数据,载入收到的快照
- 主机快照发送完毕后开始向从机发送缓冲区中的写命令
- 从机完成对快照的载入,开始接收命令请求,并执行来自主机缓冲区的写命令。
- 如果从机开启了AOF,那么会触发bgrewriteaof的执行,从而保证AOF文件更新到主节点的最新状态
增量复制
Redis增量复制时指Slave(从机)初始化后正常工作时主服务器发生的写操作同步到从机的过程,即主机每执行一个写命令就会向从机发送相同的写命令,从机接收并执行写命令。但也可以用于网络中断时的数据同步
增量复制需要了解三个概念
1、复制偏移量
主机和从机分别维护一个复制偏移量,代表主机向从机传递的节点数,主机每次向从机传送N个字节数据时,主机的偏移量增加N,从机每次收到主机的N个字节数据时,从机的偏移量增加N
2、复制积压缓冲区
复制挤压缓冲区是由主机进行维护的、固定长度、先进先出队列、默认大小1MB,当主机开始有从机建立时,作用是备份主节点最近发送给从机的数据。这里无论主机有多少个从机,都只有一个缓冲区。
在命令传输阶段,主机除了将写命令发送给从系欸点,还会发送一份给缓冲区,作为备份使用。缓冲区中保存这写命令,以及其中每个字节对应的复制偏移量。由于复制挤压缓冲区定长而且先进先出,所以它保存的时最节点最近执行的写命令,时间较早的写命令会被挤出缓冲区。
3、服务器运行ID(runid)
每个Redis节点,在启动时都会自动生成一个随机ID(每次启动都会不一样),由40个随机的16进制字符组成,runid时唯一识别的redis节点,通过info Server命令,可以查看节点的runid。
它的作用:主从第一次复制时,主机会将自己的runID发送给从机,从机会将这个runID保存起来,当断线重连时,从机会将这个runID发送给主机,主机根据runID判断能否进行部份复制。
- 如果从节点保存的runid与主节点现在的runid相同,说明主从节点之前同步过,主节点会继续尝试使用部分复制(到底能不能部分复制还要看offset和复制积压缓冲区的情况);
- 如果从节点保存的runid与主节点现在的runid不同,说明从节点在断线前同步的Redis节点并不是当前的主节点,只能进行全量复制。
psync流程图
解释:
- 首先需要判断是否是从机第一次进行复制,判断依据:从机是否执行过slaveo或者最近执行了skaveof no one,则从机发送命令为psync?-1,向从节点请求全量复制
- 如果执行过slaveof,则发送命令psync,runid是上次复制的主节点的runid,offset为上次复制截止时从机保存的复制偏移量。
- 这里还会判断主机的runid和从机发送的runid是否相等,相等且从机offset之后的数据在复制积压缓冲区都存在,则回复+CONTINUE,表示可以进行增量复制。
- runid不同时,或者offset后的数据不在复制积压缓冲区中了(在队列中被挤出了),则回复+FULLRESYNC 表示需要进行全量复制。
优点
- 采取异步复制,什么叫异步复制?即 非阻塞复制,redis2.8开始,从机会周期的应答从复制流中处理的数据量
- 一个主机可以有多个从机
- 每个redis可以接收来自其他redis服务器的连接
- 主从复制提高了redis服务的可扩展性,避免单个redis服务器的读写访问压力过大的问题,同时也可以处理数据备份和冗余提供一种解决方案
- 主从复制对于主机是非阻塞的,即从机在进行主从复制同步过程中,主机仍可以接收处理外界的访问请求
- 主从复制对于从机也是非阻塞的,即从机在进行主从复制的过程中也可进行外界的查询请求,但是这时候查询到的数据是以前老的数据,因为可能还没有加载主机新的快照信息,可以在配置文件中设置repl-disable-tcp-nodelay 默认是no,如果改为yes,那么主机就会将数据包进行合并从而减少带宽,但是发送频率会降低,从而节点数据延迟增加,一致性变差,只有在应用对redis数据不一致性容忍性高,且主节点之间网络不好的时候,才会设置为yes
- 可以分配一个从服务器及进行保存的工作,从而为主服务器消除了把数据写到磁盘的过程损耗
缺点
如果主服务器宕机,那么所有从服务器都会失效,所以需要手动设置主机,费时费力。所以就推出了哨兵模式,当主节点宕机时,哨兵会投票选出新的主机。