什么是主从复制
1、 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。
2、 前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点
默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有),但一个从节点只有一个主
主从复制的作业主要包括
- 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式
- 故障恢复: 当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
- 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量
- 高可用基石:除了上述作用外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
主从库采用的是读写分离的方式
读写分离的主从库方案
-
原理
分为全量复制和增量复制
全量复制:发生在第一次复制时
增量复制:只会把主从库网络断连期间主库收到的命令,同步给从库 -
全量复制的三个阶段
第一阶段是 主从库建立连接、协商同步的过程
主要是为全量复制做准备。从库和主库建立起连接,并告诉主库即将进行同步,主库确认回复后,主从库间就可以开始同步了
具体来说,从库给主库发送psync命令,表示要进行数据同步,主库根据这个命令的参数来启动复制。psync命令包含了主库的runID和复制进度offset两个参数。runID是每个Redis实例启动时都会自动生成的一个随机ID,用来唯一标记这个实例。当从库和主库第一次复制时,因为不知道主库的runID,所以将runID设为“?”。offset,此时设为-1,表示第一次复制。主库收到psync命令后,会用fullresync响应命令带上两个参数,主库的runID和主库的复制进度offset,返回给从库。从库收到响应后,会记录下这两个参数。 注意:fullresync响应表示第一次复制采用的全量复制,也就是说,主库会把当前所有的数据都复制给从库
第二阶段 主库将所有数据同步给从库
从库收到数据后,在本地完成数据加载。这个过程依赖于内存快照生成的RDB文件。
具体来说,主库执行bgsave命令,生成RDB文件,接着将文件发给从库。从库接收到RDB文件后,会先清空当前数据库,然后加载RDB文件。 这是因为从库在通过replcaof命令开始和主库同步前,可能保存了其他数据。为了避免之前数据的影响,从库需要先把当前数据库清空。在主库将数据同步给从库的过程中,主库不会被阻塞,仍然可以正常接收请求。否则,Redis的服务就被中断了。但是,这些请求中的写操作并没有记录到刚刚生成的RDB文件中。为了保证主从库的数据一致性,主库会在内存中专门的relication buffer,记录RDB文件生成后收到的所有写操作
第三阶段 主库会把第二阶段执行过程中新收到的写命令,再发送给从库
具体的操作是,当主库完成RDB文件发送后,就会把此时replication buffer中的修改操作发送给从库,从库再重新执行这些操作。
至此,主从库就实现同步了
网友评论