redis主从复制流程:
- slave node 启动,仅保存 master node的信息,包括 master节点的host和ip
master节点的host ip从 redis.conf 获取
-
slave node 内部有个定时任务,每秒检查是否有新的master node 要连接和复制,如果发现,就跟master node 建立 socket 网络连接
-
slave node 发送ping 命令给master node
-
如果master node 设置了requirepass, 那么slave节点 需要口令认证 auth 密码
-
master node第一次进行全量复制,将所有数据发给slave node 且不影响最新的数据操作
-
master node 后续的持续写命令,同步复制给slave node
redis数据同步相关的核心机制
-
master 和 slave node 都会维护同一个offset
master会在自身不断累加offset,slave也会自身不断累加offset,slave 每秒都会上报自身的offset给master,同时master也会保存每个slave的offset
-
backlog
master node 有一个backlog,默认 1Mb
master node 给slave node复制数据时,也会将数据再backlog中同步一份
-
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 命令
-
psync
从节点使用psync 从master node进行复制,psync runid offset
master node 会根据自身情况返回响应信息,可能是FULLRESYNC runid offset触发全量复制,肯尼个是CONTINUE触发增量复制
redis 全量复制
-
master执行bgsave, 在本地生成一份rdb快照文件
-
master node 将rdb 快照文件发送给slave node ,如果rdb复制时间超过60秒(repl-timeout), 那么slave node 就会认为复制失败,可以适当调节这个参数
-
对于千兆网卡的机器,一般每秒传输100MB,6G文件,很可能超过60s,
-
master node 在生成rdb是,会将所有新的命令缓存在内存中,在savle node保存了rdb后,将新的写命令复制给slave node
-
client-output-buffer-limit slave 256M 64MB 60,如果在复制期间,内存缓冲区持续消耗超过64M,或者一次性超过256Mb ,那么停止复制,复制失败
-
slave node 收到快照文件后会清空自己的旧数据,然后重新加载rdb到自己的内存中,同时基于旧的数据版本对外提供服务
-
如果slave node开启了AOF,那么会立即执行BEGINWRITEAOF ,重写AOF
如果数据量大于4G,一次全量复制很可能超过60s
redis 增量复制
- 如果全量复制过程中,master-slave 网络连接断开,那么slave 重新连接master , 就会触发增量复制
- master 直接从自己的backlog 中 获取部分丢失的数据,发送给slave node ,默认backlog 大小为1MB
- master 就是根据slave 发送的psync 中的offset 来从 backlog 中获取数据的
heartbeat
主从节点互相发送heartbeat信息
master默认是10s 发送一次heartbeat , slave node 每隔 1s 发送一个heartbeat
异步复制
master 每次接受到写命令,先在内部写入,然后异步发送给slave node
什么是99.99%高可用
主备切换,哨兵机制
哨兵机制主要功能
- 集群监控 负责监控redis, master 和 slave 进程是否正常工作
- 消息通知,如果某个redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员
- 故障转移,如果master node 挂了, 会自动转移到slave node 上
- 配置中心,如果故障转移发生了,通知clinet客户端新的master 地址
哨兵核心知识
- 哨兵至少需要3个实例,保证自己的健壮性
- 哨兵 + 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 不会再接受任何请求