前言
Redis体系学习整理,点我点我
解决问题:
1:单点问题,机器宕机,服务不可用,数据丢失。
2:容量瓶颈。 简而言之,保障Redis的HP和HA
主从复制三大步骤
如果我们要自己设计一个主从同步的系统,你会怎么处理?
大家都能想到,最简单的思路也是三步
- 机器建立连接
- 数据复制
- 后续新指令维护
我们来看下Redis的具体步骤。因为都是人设计出来其实思路是一致的。
- 链接阶段:Slave 向Master建立链接
- 数据同步阶段:讲Master的数据同步到Slave
- 全量复制
- 增量复制
- 命令传播阶段:后续指令持续同步
下面我们单独针对各个阶段进行说明
链接阶段
slave主动去和master建立socket链接。
- Slave自我介绍 发送IP + Port 给Master
- Master接收到消息。返回master的运行ID(run_id )具体作用下面介绍
- 根据master的结果,开始建立socket
- 建立完成,互相检测心跳(Ping master IP)。当然Slave频率是远远大于Master的。
对应命令
客户端式:slaveof [IP] [port] 成为执行机器的从服务器:如果该机器之前是其他master的slave那么会丢弃之前的数据集。
启动服务时:redis-service – slaveof 127.0.0.1 6379
配置式(推荐): redis.conf文件中添加配置 slaveof [IP] [port]
QA:
Q:为什么是Slave发起连接,发起同步请求,更频繁的检测心跳呢?
A:其实很简单,因为Master太忙了 【手动狗头~】不仅要处理各种数据,还要管理和响应Slave。
数据同步阶段
这一步涉及RDB和AOF相关的知识: 不熟悉的同学,先点这里去了解一下
-
Slave发送同步请求
- 1.0 sync
- 2.8 psync
- 4.0 psync < runid > < offset >
- 第一次请求因为没有runid 会传默认值 0 -1。master接受到默认参数时,判断为首次链接,会开辟 复制积压缓冲区 用来把RDB后的数据进行存储,防止指令丢失。
- 复制积压缓冲区的结构如下:偏移值,就是指令中的offset,master根据复制偏移量来决定同步的数据信息。
-
全量复制
- master收到同步请求,运行 bgsave,得到RDB文件。后续指令存入复制积压缓冲区。
- RDB文件通过Socket同步给Slave
- Slave接收到RDB文件。开始清除老数据flashdb。然后根据RDB文件恢复数据。
-
增量复制
- master从指令积压缓冲区得到 AOF文件。发送给Slave
- Slave 接收数据。执行bgrewriter,然后开始执行恢复。
到这一步,数据就基本同步完毕了。
命令传播阶段
- 互相Ping 心跳包
- 根据复制积压缓冲区的数据,进行后续的增量复制。
注意事项和遗留问题
注意事项
- 生产环境主库数据巨大,新增从库应并开流量高峰期,避免阻塞影响高可用
- 复制缓冲区大小默认是1mb。 如果你发现CPU持续走高,可能就是缓冲区大小设置的不合理。 在全复制时,如果检测到复制积压缓冲区满了,系统会进行2次(3次甚至更多次)的全量复制。
- 内存分配比例,要留30%左右给 bgsave和创建缓冲区。
- 多Slave错峰同步,避免带宽压崩。
遗留问题:
master宕机的怎么办?
数据不一致主从延迟怎么办?
相关解释在集群和哨兵模式中进行介绍
主从同步今天就总结到这里~