Redis 主从架构分析( 二 )


Redis 主从架构分析

文章插图
 
全量复制
  • 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,那么停止复制,复制失败 。
client-output-buffer-limit slave 256MB 64MB 60
  • 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
主从节点互相都会发送 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 基于哨兵的高可用性 。




推荐阅读