Redis如何保证服务少中断?
- Redis通过增加副本的冗余量,也就是将一份数据同时保存在多个实例上,如果有一个实例出现了故障,其他实例也可以提供服务,不影响业务使用。
Redis 主要提供主从库模式,来保证数据副本的一致性,主从库之间采用的是读写分离的模式。
读操作 : 主库,从库都可以接收
写操作 : 首先到主库进行执行,之后通过写操作由主库同步给从库
主从库采用读写分离,所有数据的修改只会在主库上进行,不用协调三个实例。主库有了新的数据后,会同步给从库,这样,主从库的数据就是一致的。
主从库之间如何进行第一次同步
- 启动多个实例后,它们通过replicaof 命令形成主库和从库之间的关系,之后按照三个阶段完成数据的第一次同步
- 首先,从库给主库发送psync 命令表示要进行数据同步,主库根据这个命令的参数来启动复制。psync 包含了主库的runID 和复制进度 两个参数
runid
是redis 实例启动的时候随机生成的标志id ,从库和主库第一次建立连接,不知道主库的runid ,所以将runid 设置为 ?- 主库收到命令psync 命令后,会用fullresync 命令同时带上两个参数,主库runid 和主库目前的复制进度
offest
- 第二次建立复制的时候会采用
全量复制
,也就是说将主库中所有的数据都复制给从库,主库将所有的数据同步给从库,从库收到数据之后,在本地完成数据加载,依赖于rdb文件 - 从库在和主库同步之前,会清空自己之前的数据,然后在进行数据的加载
- 为了保证主从数据库的数据一致性,主库会在内存中使用replication buffer ,记录RDB文件生成后收到的所有写操作
- 第三阶段,主库会将replication buffer 中的修改操作发给从库,从库再重新执行这些操作。主从库就实现了同步操作
如何分担全量复制的时候主库的压力
我们可以通过 主-从-从
模式将主库生成RDB和传输RDB的压力以级联的方式分散到从库中。
我们部署主从集群的时候,可以手动选择一个从库,用于级联其他的从库。我们可以在选择一些从库,让她们在刚才所选择的从库中,建立主从关系
那么主从之间如果出现网络中断或者网络阻塞
- 如果主从库断连后,主库会把断连期间收到的写命令,写到replication buffer , 同时也会把这些操作命令也写入到repl_backlog_buffer 缓冲区中
- 主库会记录自己写到的位置,从库会记录自己已经读到的位置
- 在链接上之后,主库会把自己记录的命令发给从库,使得从库进行增量复制
因为repl_backlog_buffer是一个环形缓冲区,如果从库读取的速率比较慢,就有可能导致主库覆盖掉从库没有读取的操作,导致主从库不一致
,我们可以调整repl_backlog_size 参数去进行考虑