## 一、什么是主从复制
### 1、单机有什么问题
* 机器故障
* 容量瓶颈
* QPS瓶颈
### 2、主从复制的作用
* 数据副本
* 扩展读性能
### 3、一主多从
## 二、主从复制配置
### 1、命令实现
![](https://box.kancloud.cn/ffddf97389495a8bd761d7ea0e7d817b_934x366.png =450x180)
* 在6380 服务器上执行 slaveof 0.0.0.0 6379
* 取消复制,不想成为任何服务器的从 -- 在6380 服务器上执行 slaveof no one
### 2、配置实现
~~~
slaveof ip port
slave-read-only yes //只做读操作,保障保障与主服务器数据一致
~~~
### 3、比较
| 方式 | 命令 | 配置 |
| --- | --- | --- |
| 优点 | 无需重启 | 统一配置 |
| 缺点 | 不便于管理 | 需要重启 |
## 三、runid和复制偏移量
### 1、runid
* redis每次启动的时候都会有一个随机的id来保障redis的标识,重启后消失。
* 查看runid
```
redis-cli -p 6979 info server | grep run
run_id:dsfsdf34234wfdsdf23432fdsdf
```
### 2、偏移量
* 一个数据写入量的字节,记录写了多少数据。主服务器会把偏移量同步给从服务器,当主从的偏移量一致,则数据是完全同步的。
* 如果主从服务的偏移量大于从服务器,则主从不同步。
~~~
redis-cli -p 6979 info replication //查看命令
slave_repl_offset:1978 // 偏移量参数
~~~
## 四、全量复制和部分复制
### 1、全量复制
* 流程
* slave 向 master 传递命令 psync? -1 (因为第一次通信不知道master的runid和偏移量,所以传-1)
* master 向 slave 返回runid 和偏移量
* slave 保存 master 的信息
* master 执行 bgsave 生产RDB快照
* master 做send RDB 操作 向 slave 同步快照信息
* master 做 send buffer 操作 , 向 slave 同步 生成快照过程中的 缓存命令
* slave 加载 RDB文件及数据
* 开销
* bgsave时间
* RDB文件网络传输时间
* 从节点清空数据时间
* 从节点加载RDB的时间
* 可能的AOF重写时间
![](https://box.kancloud.cn/faba5668620f687f257cdc069f066e57_849x480.png =425x240)
### 2、部分复制
* redis 2.8后的功能,当网络发生抖动断开后,会用到部分复制的功能
* 当网络发生抖动,slave会与master断开
* master 写命令时,会写一份复制缓冲区的命令
* 当slave在此连接master时 ,传递命令 psync {offset} {runid} ,告诉 master 自己当前的偏移量是多少
* master 向 slave 返回CONTINUE 把 缺失的内容 传递过去。
![](https://box.kancloud.cn/afcde1f61a86395226fb6159fcb5bdda_725x462.png =360x230)
## 五、故障处理
## 六、主从复制常见问题
### 1、读写分离
* 读流量分摊到从节点
* 可能遇到问题:
* 复制数据延迟
* 读到过期数据
* 从节点故障
* 规避全量复制
* 第一次全量复制
* 第一次不可避免
* 小主节点、低峰
* 节点运行ID不匹配
* 主节点重启(运行ID变化)
* 故障转义,例如哨兵或集群
* 复制积压缓冲区不足
* 网络中断,部分复制无法满足
* 增大复制缓冲区配置rel_backlog_size,网络“增强”。
* 规避复制风暴
* 单主节点复制风暴
* 问题:主节点重启,多从节点复制
* 更换复制拓扑
*