概述
技术有利有弊,一些问题和限制尽量的去避免。
同步数据集的过程:(全量复制和部分复制)
复制过程是从节点请求,主节点发送数据。
概念
- 全量复制
从节点首次连接主节点时,必定会全量复制;
从节点会发送runid和offset
主节点人为或者意外重启后runid会改变,那么必然也会全量复制
offset不在积压缓冲区内时也会全量复制 - 部分复制
网络等原因导致部分数据丢失,从节点的offset在主节点积压缓冲区内保存的offset范围内时,会部分复制。 - runid
redis每次重启runid都会变化。
但是debug reload不该改变runid和offset,所以人为重启时debug reload会避免全量复制。 - 复制积压缓冲区
默认大小1M;
主节点上的固定大小的队列;
会存储复制偏移量offset和一些命令;
先进先出,缓冲区满时较早的缓存会被挤出缓冲区。 - 复制偏移量
info relpication=》xx_repl_offset
主从节点都会维护自己的复制偏移量;
从节点每秒上传自己的偏移量,如果主从节点偏移量差异太大会引起复制。
主从复制的问题以及解决办法
- 脏读
全量复制的过程中,主节点可以对外提供服务,但是从节点应该程序控制不对外提供服务,避免脏读。 - 全量复制过程
bgdave的过程
网络传输过程
从节点清空数据的过程
从节点加载数据的过程。 - 部分复制过程(为部分复制了解决全部复制的过程)
从节点发送自己的offset,offset在缓冲区内则进行部分复制,否则进行全量复制;
runid重启会变,runid变了也会全量复制;
积压缓冲区大小可以调节。例如:网络中断平均60s,主节点每秒100kb,则缓冲区建议6M,或者12M(2倍)。 - 嘻嘻嘻
- xxx
一些配置
从库设置
slave-serve-stale-data 默认yes 从节点设置。
当主从复制过程中或主机失去连接:
yes 从库还是会继续响应客户端请求
no 除了info和slaveof,其他命令都会报错:sync with master in progress.
slave-priority 100 越小优先级越高,哨兵中被设为主库
主库设置
repl-disable-tcp-nodelay no 多延迟40ms,节省带宽。建议不动
repl-ping-slave-period 10 10s
repl-backlog-size 1mb
relp-backlog-ttl 3600 3600s
min-slaves-to-write 3 从机个数小于3主节点不能写
min-slaves-max-lag 10 10s
读写分离的问题
读写分离的适用场景:
读写分离适合读多写少,需要容忍一些延迟。
一般主从会结合哨兵。哨兵帮助我们监控主从节点。
- 复制数据延迟
shell脚本或者定时器监控偏移量offset。延迟比较大时避免客户端读取延迟高的从节点。 - 异步复制会导致数据丢失
这两个参数会控制主节点
min-slaves-to-write 3 从机个数小于3主节点不能写
min-slaves-max-lag 10 10s 从节点数据复制和同步延迟最大的延迟时间,主节点不能写 - 复制过程中希望从节点不可读
slave-serve-stale-data no 设置为no即可,默认为yes。 - 全量复制避免
主从的maxmemory不一致:从节点变为主节点时就会出问题。 内存分配 bytes。
内存不够会导致退出,保证机器内存足够。
maxmemory不要太大;
选择低谷时间复制。 - 单机主从复制风暴
主节点有多个时就用到Redis的集群了。
修改部署架构:主节点下面的从节点作为其他从节点的主节点。重点 master-slave/master-slave*n - 避免导致主节点被占死,导致不能写入。
redis是单线程架构,通常一个机器会部署多个Redis实例,充分利用CPU。但是主节点尽量不要部署在一台机器,因为单台机器重启会导致大量密集的全量复制。 - xxx
- xx
- xx
- xx
- xx
- xx