## 一、什么是主从复制 ### 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,网络“增强”。 * 规避复制风暴 * 单主节点复制风暴 * 问题:主节点重启,多从节点复制 * 更换复制拓扑 *