主从复制
构建一个高可用的系统,全年未宕机时间>99.999%
| 配置 | 作用 |
|---|---|
| requirepass ****** | 设置数据库密码 |
| masterauth ****** | 记住主数据库的密码 |
| slaveof ip port | 从机连接到主机 |
| repl-backlog-size 1mb | slave端失连缓冲区,当一个slave要重连时,不需要完全同步,执行局部同步即可。backlog设置的越大,slave可以失连的时间就越长。 |
| slave-read-only yes | 从机只读 |
| slave-serve-stale-data no | 从机在主从复制的时候不提供服务 |
| min-slaves-to-write 2 | 当slave数量少于某个值,master停止写入 |
| min-slaves-max-lag 8 | 当所有slave的延迟大于等于10s时,master停止写入 |
| repl-backlog-size | 修改复制缓冲区大小,避免因为太小而丢数据反复全量复制,推荐设置为 2延迟时间每秒master写入量 |
| repl-timeout 60 | master的CPU占用过高/slave频繁断开slave接到了耗时很长的查询命令,master发现slave不响应,master设置合理的超时时间,超时则释放slave |
| repl-ping-slave-period | slave与master断开连接:master的ping丢包,ping频率低,超时时间很短,应该提高ping的频率,一般超时时间为ping的5-10倍 |
| slave-server-atale-data yes/no | 多个slave获取相同数据不同步:如果slave延迟过大,暂时屏蔽slave的数据访问,开启后仅响应info,slaveof等少数命令,慎用,建议slave和master在一个机房 |
复制缓冲区buffer类似aof格式,它有offset(偏移量)标记不同slave同步到哪个位置
首先slave创建socket连接master
全量复制发生在首次连接:slave发psync ?-1,主机发runid和offset,从机保存主机信息,主机发rdb和buffer,从机更新数据和持久化文件。
部分复制的流程:slave网络中断,数据丢失,向主节点发送psync offset runid,master通过自己的offset和slave的offset进行比对,找出缺失的命令,发给slave,如果缺失的命令过多或无法恢复,则进行全量复制。
命令传输阶段:正常运行时,master收到命令累加offset,slave收到命令累加offset,slave每秒心跳将offset告诉master,master每10秒心跳检测slave是否在线,master发现偏移量不一致则将复制缓冲区中相差的命令向slave传输。
redis4.0中:当slave掉线重连,发送psync2,其中包括原masterId和新msterId,主机检测Id1和Id2是否符合自己的id,如果有一个符合则考虑部分复制,否则认为不是自己的slave全量复制。
放两张图
哨兵
集群
参考资料
https://blog.csdn.net/chenssy/article/details/105760344