概述

技术有利有弊,一些问题和限制尽量的去避免。
同步数据集的过程:(全量复制和部分复制)
复制过程是从节点请求,主节点发送数据。

概念

  • 全量复制
    从节点首次连接主节点时,必定会全量复制;
    从节点会发送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主从复制缓冲区满了_偏移量

  • 避免导致主节点被占死,导致不能写入。
    redis是单线程架构,通常一个机器会部署多个Redis实例,充分利用CPU。但是主节点尽量不要部署在一台机器,因为单台机器重启会导致大量密集的全量复制。
  • xxx
  • xx
  • xx
  • xx
  • xx
  • xx