文章插图
全量复制
- master 执行 bgsave ,在本地生成一份 rdb 快照文件 。
- master node 将 rdb 快照文件发送给 slave node,如果 rdb 复制时间超过 60秒(repl-timeout),那么 slave node 就会认为复制失败,可以适当调大这个参数(对于千兆网卡的机器,一般每秒传输 100MB,6G 文件,很可能超过 60s)
- master node 在生成 rdb 时,会将所有新的写命令缓存在内存中,在 slave node 保存了 rdb 之后,再将新的写命令复制给 slave node 。
- 如果在复制期间,内存缓冲区持续消耗超过 64MB,或者一次性超过 256MB,那么停止复制,复制失败 。
- slave node 接收到 rdb 之后,清空自己的旧数据,然后重新加载 rdb 到自己的内存中,同时基于旧的数据版本对外提供服务 。
- 如果 slave node 开启了 AOF,那么会立即执行 BGREWRITEAOF,重写 AOF 。
- 如果全量复制过程中,master-slave 网络连接断掉,那么 slave 重新连接 master 时,会触发增量复制 。
- master 直接从自己的 backlog 中获取部分丢失的数据,发送给 slave node,默认 backlog 就是 1MB 。
- master 就是根据 slave 发送的 psync 中的 offset 来从 backlog 中获取数据的 。
主从节点互相都会发送 heartbeat 信息 。
master 默认每隔 10秒 发送一次 heartbeat,slave node 每隔 1秒 发送一个 heartbeat 。
异步复制
master 每次接收到写命令之后,先在内部写入数据,然后异步发送给 slave node 。
redis 如何才能做到高可用如果系统在 365 天内,有 99.99% 的时间,都是可以哗哗对外提供服务的,那么就说系统是高可用的 。
一个 slave 挂掉了,是不会影响可用性的,还有其它的 slave 在提供相同数据下的相同的对外的查询服务 。
但是,如果 master node 死掉了,会怎么样?没法写数据了,写缓存的时候,全部失效了 。slave node 还有什么用呢,没有 master 给它们复制数据了,系统相当于不可用了 。
redis 的高可用架构,叫做 failover 故障转移,也可以叫做主备切换 。
master node 在故障时,自动检测,并且将某个 slave node 自动切换为 master node 的过程,叫做主备切换 。这个过程,实现了 redis 的主从架构下的高可用 。
后面会详细说明 redis 基于哨兵的高可用性 。
推荐阅读
- 10分钟彻底理解Redis持久化和主从复制
- redis实践,30分钟优化一个十万并发的领券系统
- SpringMVC架构实现原理
- 六种常用的微服务架构设计模式
- 微信支付软件架构重构之旅
- 重中之重基础-Redis介绍
- 架构设计:文件服务的设计与实现
- 大白话告诉你Hadoop架构原理
- 从微信小程序开发者工具源码看小程序架构设计实现原理
- 如何一步步构建大型网站架构