redis主从复制流程:

  1. slave node 启动,仅保存 master node的信息,包括 master节点的host和ip

master节点的host ip从 redis.conf 获取

  1. slave node 内部有个定时任务,每秒检查是否有新的master node 要连接和复制,如果发现,就跟master node 建立 socket 网络连接

  2. slave node 发送ping 命令给master node

  3. 如果master node 设置了requirepass, 那么slave节点 需要口令认证 auth 密码

  4. master node第一次进行全量复制,将所有数据发给slave node 且不影响最新的数据操作

  5. master node 后续的持续写命令,同步复制给slave node

redis数据同步相关的核心机制

  1. master 和 slave node 都会维护同一个offset

    master会在自身不断累加offset,slave也会自身不断累加offset,slave 每秒都会上报自身的offset给master,同时master也会保存每个slave的offset

  2. backlog

    master node 有一个backlog,默认 1Mb

    master node 给slave node复制数据时,也会将数据再backlog中同步一份

  3. master run id

    info server,可以看到master run id

    如果根据host + ip 定位master node是不靠谱的,如果重启或者数据出现了变化,那么slave node应该根据不同的run id 区分,run id 不同就做全量复制

    如果需要不更改run id 重启redis , 可以使用redis-cli debug reload 命令

  4. psync

    从节点使用psync 从master node进行复制,psync runid offset

    master node 会根据自身情况返回响应信息,可能是FULLRESYNC runid offset触发全量复制,肯尼个是CONTINUE触发增量复制

redis 全量复制

  1. master执行bgsave, 在本地生成一份rdb快照文件

  2. master node 将rdb 快照文件发送给slave node ,如果rdb复制时间超过60秒(repl-timeout), 那么slave node 就会认为复制失败,可以适当调节这个参数

  3. 对于千兆网卡的机器,一般每秒传输100MB,6G文件,很可能超过60s,

  4. master node 在生成rdb是,会将所有新的命令缓存在内存中,在savle node保存了rdb后,将新的写命令复制给slave node

  5. client-output-buffer-limit slave 256M 64MB 60,如果在复制期间,内存缓冲区持续消耗超过64M,或者一次性超过256Mb ,那么停止复制,复制失败

  6. slave node 收到快照文件后会清空自己的旧数据,然后重新加载rdb到自己的内存中,同时基于旧的数据版本对外提供服务

  7. 如果slave node开启了AOF,那么会立即执行BEGINWRITEAOF ,重写AOF

如果数据量大于4G,一次全量复制很可能超过60s

redis 增量复制

  1. 如果全量复制过程中,master-slave 网络连接断开,那么slave 重新连接master , 就会触发增量复制
  2. master 直接从自己的backlog 中 获取部分丢失的数据,发送给slave node ,默认backlog 大小为1MB
  3. master 就是根据slave 发送的psync 中的offset 来从 backlog 中获取数据的

heartbeat

主从节点互相发送heartbeat信息

master默认是10s 发送一次heartbeat , slave node 每隔 1s 发送一个heartbeat

异步复制

master 每次接受到写命令,先在内部写入,然后异步发送给slave node

什么是99.99%高可用

主备切换,哨兵机制

哨兵机制主要功能

  1. 集群监控 负责监控redis, master 和 slave 进程是否正常工作
  2. 消息通知,如果某个redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员
  3. 故障转移,如果master node 挂了, 会自动转移到slave node 上
  4. 配置中心,如果故障转移发生了,通知clinet客户端新的master 地址

哨兵核心知识

  1. 哨兵至少需要3个实例,保证自己的健壮性
  2. 哨兵 + redis主从部署架构,不保证数据丢失问题,只保证redis集群的高可用

为什么redis哨兵集群只有2个节点无法正常工作?

哨兵集群必须两个节点以上

Configuration : quorun =2 , majority =2

redis 脑裂问题导致数据丢失

master节点因为网络或者其他问题,导致哨兵把slave node 选举为 master节点。产生脑裂问题

减少异步复制和脑裂导致的数据丢失

min-slaves-to-write 1
min-slaves-max-lag 10
## 代表 要求至少有 1 个slave , 数据复制的延迟不能超过 10 s
如果一旦所有数据的复制的延迟超过10s,那么master 不会再接受任何请求