单机版的redis存在三个次要问题

  • 单机故障
  • 容量受限
  • 单机负载瓶颈,波及socket连接数、CPU资源、IO压力等

针对这些问题redis提供了集群的形式来进行解决。在redis中有三种集群模式:主从模式、哨兵模式和Cluster集群模式。这篇文章咱们来讲一下主从模式的实现原理。

架构简介

简略来说是已主多从,master做为redis的主实例,反对数据的读写,他会定时的将数据同步给slave从库。这样咱们能够将大部分的读操作转移到slave从库上,在读取方面解决了单点故障问题,同时slave的可伸缩行能够升高单机负载,进步性能。

主从模式下,咱们能够敞开master的长久化性能,由slave来负责长久化,这样能够升高master的IO,大大晋升性能。但须要留神,当master呈现故障重启时,因为master没有可供复原的aof或rdb文件,因而一旦重启数据会全副革除。而slave会同步master数据将本地的长久化文件也做删除。这种状况下,要敞开master的主动重启性能,避免出现相似问题。但这样依然是很危险的,倡议同时开启master和slave的长久化性能。

同步原理

在redis的主从模式中,数据同步是一个低提早、高性能的异步处理过程。
全量同步
slave在首次胜利连贯到master之后会触发一次全量的同步操作,具体过程如下

  • slave连贯到master胜利之后,发送PSYNC命令,申请master进行数据同步
  • master收到同步命令fork一个子过程,并将以后的内存数据生成RDB文件,写入磁盘;同时master会接着接管写操作并保留到长期缓冲区
  • master将RDB文件全量发送给slave
  • slave接管并写入磁盘,而后从rdb文件加载到内存
  • master将缓冲区中的所有命令发送给slave

对于master端同步过程是由子过程来解决的,因而是非阻塞的,同步期间redis依然可接管客户端的申请。
在数据安全性上,为了保障同步的安全性,当连贯的slave数量小于m,且延迟时间小于ns时,master可用失常接管写解决,否则告诉客户端谬误。

min-slaves-to-write 3min-slaves-max-lag 10

全量同步时master会进行RDB写盘而后再发送到slave,这种形式交disk-back形式。它的长处是当有多个slave申请同步时,只须要生成一次RDB文件就能够服务多个slave,但对于磁盘IO较差的状况会比拟蹩脚。
Redis另外提供了一种形式diskless,同步时master将内存中的数据生成RDB数据后间接写入到socket字节流传给slave,而不会进行磁盘IO。很显著这种形式缩小了磁盘的IO操作,须要留神的是处理过程中,其余slave的同步申请无奈被解决,只能排队期待。在该模式下咱们个别会设置一个工夫用于master的期待,当master接管到一个同步申请时,会先进行m秒的期待,看是否有其余slave也有同步需要,对多个slave进行并行同步。

repl-diskless-sync yesrepl-diskless-sync-delay 5

增量同步
在晚期的版本中,slave故障重启、断后重连master,都会导致全量的同步。高版本中对这里做了一些优化,会先尝试进行增量同步,如果不行再做一次全量同步。
具体做法是master应用一个replicationid来标记惟一的本人,同时定义一个offset偏移量示意同步解决的数据偏移量。当slave连贯到master进行同步时,slave发送它记录的master的replicationid和本人解决的偏移量到master,这样master只须要查问增量数据传输给slave。
增量数据是存储在一个缓冲区中的,该缓冲区一次性调配肯定的空间大小(可配),写操作命令会保留在缓冲区内。slave的增量同步会从该缓冲区查找数据,如果缓冲区设置的较大,则能反对slave断连的工夫会越长。当master不存在slave且超过指定工夫时,该缓冲区也会被主动开释

repl-backlog-size 1mbrepl-backlog-ttl 3600

主从模式配置

slave配置指定master的地址,开启主从模式

replicaof <masterip> <masterport>

当master须要明码校验时,从库配置明码

masterauth <master-password>

无硬盘同步模式,设置yes开启,当开启时,须要配置执行同步时要期待多少秒再开始同步

repl-diskless-sync norepl-diskless-sync-delay 5

复制缓冲区大小

repl-backlog-size 1mb

slave不存在后多少毫秒缓冲区被开释

repl-backlog-ttl 3600

同步时master可承受写操作的slave个数和同步延迟时间

min-replicas-to-write 3min-replicas-max-lag 10