Redis之主从同步

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis之主从同步

为什么需要主从同步

生产环境中,如果redis只有一台机器是一件很危险的事情,如果出现机器宕机服务将处于不可用状态,此时需要对挂掉的节点进行重启和等待数据恢复后,服务方可继续对外使用,

如果有了主从以后,当主节点挂掉后,运维将从节点升级为主节点即可继续对外提供服务,可以省去中间的恢复原本主节点的时间,提高了可用性。

CAP 与 最终一致

CAP是分布式系统的理论基石,C 代表 一致性 (Consistent)、A 代表 可用性 (Availability) 、P (Partition tolerance) 代表 分区容忍性,

分布式系统一般都是在不同的机器上通过网络进行交互,但是网络一般都会有断开的风险,网络断开的场景一般称之为 网络分区

image.png

当网络分区发生时,两个分布式节点无法通过网络进行通信,对其中一个节点的修改操作无法同步到另一个节点中,因为两个节点中的数据不同,所以此时数据的 一致性 无法满足,

如果要满足一致性,那么这个时候就需要暂停分布式节点对外的服务,等待网络分区恢复,两个节点正常通信数据保持一致后,再对外提供服务,但此时的 可用性 将无法满足,

因此CAP的概述其实就是,网络分区发生时,一致性和可用性两难全。

Redis的最终一致性

redis的主从节点之间,数据是异步同步的,所以分布式的redis系统并不符合一致性的要求,即使主从断开连接,主节点依旧可以正常对外提供服务,所以redis符合的是可用性。

redis保证最终一致性,从节点会努力追赶主节点的数据,最终在某个时间数据将和主节点相同,如果发生网络分区,主从数据不一致,当网络恢复后,从节点将会通过多种同步策略保证与主节点数据一致。

同步方式

redis持久化有两种方式,一种是全量持久化,一种是增量持久化,节点之间同步也是两种,即全量同步与增量同步。

Redis从节点与主节点建立通信进行数据同步,这种模式称之为主从同步,不过为了减轻主节点一对过多的节点,可能会产生很大的压力,redis也支持从从同步,以此减轻主节点的压力。

增量同步

与增量备份类似,增量同步也是将对redis具有修改性的指令进行存储,只是备份存到了AOF日志中,而同步是存在本地的内存buffer(一个定长的环形数组,如下图)中,然后异步将buffer中的指令同步到从节点,

image.png

从节点一边执行同步的指令流来达到和主节点一样的状态,一边向主节点反馈自己同步到了什么位置(偏移量),

buffer的内存空间是有限的,无限的指令不会一直存在有限的buffer中,如果buffer数组满了,将会从头开始覆盖前面的内容,

如果因为网络状况不好,从节点短期内无法和主节点进行同步,当网络状况恢复时,buffer中没有被同步的指令很有可能已经被后续的指令覆盖了,从节点无法通过指令流来进行同步追赶保证一致,这时候就需要快照(全量)同步来保证一致性。

快照同步

快照同步与快照备份类似,首先在主节点上进行一次bgsave,将当前内存数据存到全部存到磁盘文件上,然后将文件传送给从节点,

从节点接收完毕快照文件后,先将当前内存中的数据清空,然后加载快照文件中的数据,加载完毕以后通知主节点继续进行增量同步。

image.png

问题

在快照同步的过程中,主节点的指令buffer还在不停的增加,如果同步的时间过长或者buffer过小,会导致buffer中的指令被新的指令覆盖,

这样快照同步完成后依然无法使用增量同步保证一致,此时将继续发起快照同步,这样会出现死循环的情况,因此需要配置一个合适的buffer大小,保证不会出现指令覆盖,防止出现死循环。

无盘复制同步

主节点进行快照同步时,将文件保存到本地磁盘是一个很耗时的文件IO操作,如果是非SSD磁盘存储,快照同步对系统的负载会造成较大的影响。

如果系统正在进行AOF的fsync操作时,快照同步会导致fsync推迟执行,影响主节点的服务效率。

从redis2.8.18开始,redis支持无盘复制,快照同步将不会进行磁盘操作,生产快照是一个遍历内存的过程,主节点一边遍历一边将序列化的内容发送给从节点,从节点将接收的内容存在磁盘文件中,最后进行一次性加载。

新增的从节点如何同步

当有新的从节点加入时,将进行一次快照同步,后续则是增量同步。

wait指令同步

redis的数据同步是异步进行的,在3.0版本后提供了一个wait指令,该指令将异步复制变成同步复制,保证请求返回后,主从节点都含有该数据。

wait指令提供两个参数,第一个是从节点的数量N,第二个是时间t(单位是毫秒),前者代表wait指令之前的写操作同步到N个节点上(保证N个节点没有滞后),后者是等待时间(最多等多久后返回),

如果时间t=0,表示无限等待直到N个节点同步完成,如果t=0,此时发生网络分区,主从同步无法进行,wait指令会一直阻塞,redis主节点无法对其他客户端进行响应,此时redis丧失可用性。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
4月前
|
存储 缓存 NoSQL
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
redis分布式锁、redisson、可重入、主从一致性、WatchDog、Redlock红锁、zookeeper;Redis集群、主从复制,全量同步、增量同步;哨兵,分片集群,Redis为什么这么快,I/O多路复用模型——用户空间和内核空间、阻塞IO、非阻塞IO、IO多路复用,Redis网络模型
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
|
5月前
|
缓存 运维 NoSQL
Redis主从模式部署
Redis主从模式部署
65 4
|
5月前
|
缓存 NoSQL Redis
Redis主从架构
当看到图示中红色标记的,就代表从节点挂载成功了。
38 0
|
2月前
|
NoSQL 安全 容灾
阿里云DTS踩坑经验分享系列|Redis迁移、同步
阿里云数据传输服务DTS在帮助用户迁移Redis数据、同步数据时,在某些复杂场景下会出现报错,或者源库与目标库数据不一致的问题,给用户带来困扰。本文介绍了DTS Redis到Redis迁移、同步过程中的典型问题,以帮助用户更好地使用DTS。
198 2
|
5月前
|
NoSQL Java 关系型数据库
考考你Redis主从,就知道有没深入Redis
大家好,我是南哥。一个对Java程序员进阶成长颇有研究的人,今天继续给大家带来新的一篇Java进阶指南。如果是单机版的数据库,像MySQL、Redis,看起来实现并不复杂。只要支持保存一条数据,同时要能够查询出来。但如果是多机版的数据库呢,各个节点的配合联调是比较复杂的过程,看起来就不是那么简单喽。要考你对Redis深不深入理解,问问Redis多机版相关的问题就知道了。我们今天就来指南下Redis主从架构。
考考你Redis主从,就知道有没深入Redis
|
4月前
|
监控 NoSQL Ubuntu
|
5月前
|
消息中间件 NoSQL Linux
详解Redis的主从同步原理
只不过在主节点中叫做master_repl_offset; 从节点也有一个偏移量叫做slave_repl_offset,用来记录从节点已经从主节点的repl_backlog_buffer中同步到的最新写指令的位置;
1193 2
|
4月前
|
安全 NoSQL Java
网络安全-----Redis12的Java客户端----客户端对比12,Jedis介绍,使用简单安全性不足,lettuce(官方默认)是基于Netty,支持同步,异步和响应式,并且线程是安全的,支持R
网络安全-----Redis12的Java客户端----客户端对比12,Jedis介绍,使用简单安全性不足,lettuce(官方默认)是基于Netty,支持同步,异步和响应式,并且线程是安全的,支持R
|
6月前
|
存储 缓存 NoSQL
Redis与数据库同步指南:订阅Binlog实现数据一致性
本文由开发者小米分享,探讨分布式系统中的一致性问题,尤其是数据库和Redis一致性。文章介绍了全量缓存策略的优势,如高效读取和稳定性,但也指出其一致性挑战。为解决此问题,提出了通过订阅数据库的Binlog实现数据同步的方法,详细解释了工作原理和步骤,并分析了优缺点。此外,还提到了异步校准方案作为补充,以进一步保证数据一致性。最后,提醒在实际线上环境中需注意日志记录、逐步优化和监控报警。
345 3