单机版的 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 3
min-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 yes
repl-diskless-sync-delay 5
增量同步
在晚期的版本中,slave 故障重启、断后重连 master,都会导致全量的同步。高版本中对这里做了一些优化,会先尝试进行增量同步,如果不行再做一次全量同步。
具体做法是 master 应用一个 replicationid 来标记惟一的本人,同时定义一个 offset 偏移量示意同步解决的数据偏移量。当 slave 连贯到 master 进行同步时,slave 发送它记录的 master 的 replicationid 和本人解决的偏移量到 master,这样 master 只须要查问增量数据传输给 slave。
增量数据是存储在一个缓冲区中的,该缓冲区一次性调配肯定的空间大小(可配),写操作命令会保留在缓冲区内。slave 的增量同步会从该缓冲区查找数据,如果缓冲区设置的较大,则能反对 slave 断连的工夫会越长。当 master 不存在 slave 且超过指定工夫时,该缓冲区也会被主动开释
repl-backlog-size 1mb
repl-backlog-ttl 3600
主从模式配置
slave 配置指定 master 的地址,开启主从模式
replicaof <masterip> <masterport>
当 master 须要明码校验时,从库配置明码
masterauth <master-password>
无硬盘同步模式,设置 yes 开启,当开启时,须要配置执行同步时要期待多少秒再开始同步
repl-diskless-sync no
repl-diskless-sync-delay 5
复制缓冲区大小
repl-backlog-size 1mb
slave 不存在后多少毫秒缓冲区被开释
repl-backlog-ttl 3600
同步时 master 可承受写操作的 slave 个数和同步延迟时间
min-replicas-to-write 3
min-replicas-max-lag 10