Redis核心技术-高可靠-主从复制

前言

  Redis的高可靠性主要体现在数据尽量少丢失服务尽量少中断

  数据尽量少丢失:服务发生故障宕机后,存储在Redis中的数据尽可能的少丢失或者不丢失。Redis通过AOF、RDB持久化保证。

  服务尽量少中断:服务发生故障宕机后,Redis可以快速恢复提供服务。Redis通过主从复制冗余数据保证。

Redis主从模式

  主从模式采用读写分离方式,主库负责写、更新、删除操作,执行完后同步到从库,主从库都可以负责读取操作。

  Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步增量同步

主从结构:一主多从

  一主多从,一个master,多个slave和master直连。
在这里插入图片描述

主从结构:级联结构

  级联结构,slave可以通过其他slave同步数据,目的是为了减轻master bgsave命令执行、传输RDB文件网络开销。
在这里插入图片描述

主从复制方式:全量同步

  全量同步,一般发生在新的从实例上,master需要fork子线程生成RDB并且向slave传输RDB文件(占用网络带宽),如果存在多个slave,master的压力比较大。
在这里插入图片描述
  网络情况是复杂的,从节点正在复制主节点时,如果出现网络闪断和其他异常,从节点会让主节点补发丢失的命令数据,主节点只需要将复制缓冲区的数据发送到从节点就能够保证数据的一致性,相比较全量复制,成本小很多。

  前提是master offset偏移量和slave偏移量相差有没有超过复制积压缓冲区大小,否则还是全量复制。

主从复制方式:增量同步

  增量同步,Redis增量同步是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。

  增量同步的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令(命令暂存在repl_backlog_buffer,大小有repl_backlog_size变量控制),从服务器接收并执行收到的写命令。

  主从连接检查方式,使用心跳。
  主节点默认每隔 10 秒对从节点发送 ping 命令,可修改配置 repl-ping-slave-period 控制发送频率。
  从节点在主线程每隔一秒发送 replconf ack{offset} 命令,给主节点上报自身当前的复制偏移量。
  主节点收到 replconf 信息后,判断从节点超时时间,如果超过 repl-timeout 60 秒,则判断节点下线。

主从复制的配置

#master连接密码
masterauth <master-password>
masteruser <username>

# 主从同步配置。
# 1) redis主从同步是异步的,但是可以配置在没有指定slave连接的情况下使master停止写入数据。
# 2) 连接中断一定时间内,slave可以执行部分数据重新同步。
# 3) 同步是自动的,slave可以自动重连且同步数据。
# redis (5.0之后的配置)
replicaof <masterip> <masterport>
# redis (5.0之前的配置)
slaveof <masterip> <masterport>

# 当一个slave失去和master的连接,或者同步正在进行中,slave的行为有两种可能:
# 1) 如果 replica-serve-stale-data 设置为 "yes" (默认值),
#slave会继续响应客户端请求,可能是正常数据,也可能是还没获得值的空数据。
# 2) 如果 replica-serve-stale-data 设置为 "no",
#slave会回复"正在从master同步(SYNC with master in progress)"来处理各种请求,除了 INFO 和 SLAVEOF 命令。
replica-serve-stale-data yes

# 你可以配置salve实例是否接受写操作。可写的slave实例可能对存储临时数据比较有用(因为写入salve# 的数据在同master同步之后将很容被删除),但是如果客户端由于配置错误在写入时也可能产生一些问题。
# 从Redis2.6默认所有的slave为只读
# 注意:只读的slave不是为了暴露给互联网上不可信的客户端而设计的。它只是一个防止实例误用的保护层。
# 一个只读的slave支持所有的管理命令比如config,debug等。为了限制你可以用'rename-command'来隐藏所有的管理和危险命令来增强只读slave的安全性。
replica-read-only yes
 
# 同步策略: 磁盘或socket,默认磁盘方式
repl-diskless-sync no
 
# 如果非磁盘同步方式开启,可以配置同步延迟时间,以等待master产生子进程通过socket传输RDB数据给slave。
# 默认值为5秒,设置为0秒则每次传输无延迟。
repl-diskless-sync-delay 5
 
# slave根据指定的时间间隔向master发送ping请求。默认10秒。
# repl-ping-replica-period 10
 
# 同步的超时时间
# 1)slave在与master SYNC期间有大量数据传输,造成超时
# 2)在slave角度,master超时,包括数据、ping等
# 3)在master角度,slave超时,当master发送REPLCONF ACK pings# 确保这个值大于指定的repl-ping-slave-period,否则在主从间流量不高时每次都会检测到超时
# repl-timeout 60
 
# 是否在slave套接字发送SYNC之后禁用 TCP_NODELAY
# 如果选择yes,Redis将使用更少的TCP包和带宽来向slaves发送数据。但是这将使数据传输到slave上有延迟,Linux内核的默认配置会达到40毫秒。
# 如果选择no,数据传输到salve的延迟将会减少但要使用更多的带宽。
# 默认我们会为低延迟做优化,但高流量情况或主从之间的跳数过多时,可以设置为“yes”。
repl-disable-tcp-nodelay no
 
# 设置数据备份的backlog大小。backlog是一个slave在一段时间内断开连接时记录salve数据的缓冲,所以一个slave在重新连接时,不必要全量的同步,而是一个增量同步就足够了,将在断开连接的这段# 时间内把slave丢失的部分数据传送给它。
# 同步的backlog越大,slave能够进行增量同步并且允许断开连接的时间就越长。
# backlog只分配一次并且至少需要一个slave连接。
# repl-backlog-size 1mb
 
# 当master在一段时间内不再与任何slave连接,backlog将会释放。以下选项配置了从最后一个
# slave断开开始计时多少秒后,backlog缓冲将会释放。
# 0表示永不释放backlog
# repl-backlog-ttl 3600
 
# slave的优先级是一个整数展示在Redis的Info输出中。如果master不再正常工作了,sentinel将用它来选择一个slave提升为master。
# 优先级数字小的salve会优先考虑提升为master,所以例如有三个slave优先级分别为10,100,25,sentinel将挑选优先级最小数字为10的slave。
# 0作为一个特殊的优先级,标识这个slave不能作为master,所以一个优先级为0的slave永远不会被# sentinel挑选提升为master。
# 默认优先级为100
slave-priority 100
 
# 如果master少于N个延时小于等于M秒的已连接slave,就可以停止接收写操作。
# N个slave需要是“oneline”状态。
# 延时是以秒为单位,并且必须小于等于指定值,是从最后一个从slave接收到的ping(通常每秒发送)开始计数。
# 该选项不保证N个slave正确同步写操作,但是限制数据丢失的窗口期。
# 例如至少需要3个延时小于等于10秒的slave用下面的指令:
# min-replicas-to-write 3
# min-replicas-max-lag 10
 
# 两者之一设置为0将禁用这个功能。
# 默认 min-replicas-to-write 值是0(该功能禁用)并且 min-replicas-max-lag 值是10。

主从复制的命令

sync, redis 2.8 之前的同步命令。

psync,redis 2.8 为了优化 sync 新设计的命令。

命令格式为 psync{runId}{offset}
runId:从节点所复制主节点的运行 id,runId每一台服务器每次运行的身份识别码,被用于在服务器间进行传输,识别身份。slave首次连接master时,master发送给slave。
offset:当前从节点已复制的数据偏移量

主节点会根据 runid 和 offset 决定返回结果:
1.如果回复 +FULLRESYNC {runId} {offset} ,那么从节点将触发全量复制流程。
2.如果回复 +CONTINUE,从节点将触发部分复制。
3.如果回复 +ERR,说明主节点不支持 2.8 的 psync 命令,将使用 sync 执行全量复制。

psync复制使用偏移量:
1.参与复制的主从节点都会维护自身的复制偏移量。
主节点在处理完写入命令后,会把命令的字节长度做累加记录,统计信息在 info replication 中的 masterreploffset 指标中。

2.从节点每秒钟上报自身的的复制偏移量给主节点,因此主节点也会保存从节点的复制偏移量。

3.从节点在接收到主节点发送的命令后,也会累加自身的偏移量,统计信息在 info replication 中。

4.通过对比主从节点的复制偏移量,可以判断主从节点数据是否一致。

参考:
https://zhuanlan.zhihu.com/p/387630094
https://blog.csdn.net/weixin_41436549/article/details/83820214

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冲上云霄的Jayden

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值