Redis是如何保证数据一致性的

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: 说到Redis的高可靠性,我们很容易想到AOF或者RDB快照,它们通过日志文件的方式恢复数据。但是宕机期间,我们的服务就会受到影响。巴菲特曾说过:不要把鸡蛋都放在一个篮子里。这句话的含义就是要将风险分散开来,在Redis的高可靠性保证来说也是一样。我们不能只把数据都放在一台服务器上,需要将数据复制在多台实例上,这样就能在一台服务器故障时,依然有其他的服务器工作,这就是今天要将的Redis主从同步。

前言

说到Redis的高可靠性,我们很容易想到AOF或者RDB快照,它们通过日志文件的方式恢复数据。但是宕机期间,我们的服务就会受到影响。

巴菲特曾说过:不要把鸡蛋都放在一个篮子里。这句话的含义就是要将风险分散开来,在Redis的高可靠性保证来说也是一样。我们不能只把数据都放在一台服务器上,需要将数据复制在多台实例上,这样就能在一台服务器故障时,依然有其他的服务器工作,这就是今天要将的Redis主从同步。

主从库模式的工作方式

主从库之间是采用读写分离的方式:

  • 读操作:主从库都可以接收;
  • 写操作:只有主库能执行,主库写完后再同步给从库。

为何写操作只能在主库执行呢?这是因为如果写操作可以在任一库中执行,同一份数据多次更新后就会产生数据不一致的问题了。接下来说说主从同步的模式。

主从同步有3种工作模式,分别是:

  • 全量复制:第一次同步时执行
  • 基于长连接的命令传播:主从库正常运行的时候执行
  • 增量复制:遇到网络故障时执行。

主从第一次同步

这个过程主要有2部分数据要同步,分别是:

  • 当前时刻所有的日志数据;
  • 同步阶段新产生的数据。

对于这2部分数据,Redis是用下面3个阶段去完成数据同步的:

  1. 第一阶段:主从库之间建立连接,从库向主从发出pysync命令,命令包含了主库的运行ID(runID)和复制进度偏移量(offset)参数。
  2. 第二阶段:主库将此时的所有数据同步到从库,从库收到后,在实例上将数据复制加载。在这个过程中,主库不会被阻塞。同时,这个过程中如果有新的数据产生,主库会在内存用一个叫做replication buffer的结构记录RDB文件生成后收到的写操作。
  3. 第三阶段:此阶段就是将主库replication buffer新收到的写命令发给从库,从库再去同步这些数据。

对于这个同步过程,主库有2个很耗时的动作:生成RDB文件、传输RDB文件。如果从库很多,全部由主库将全量数据同步到从库,就会导致主库一直在fork子进程的动作中,而fork动作会阻塞主线程处理正常的请求。

此时我们可以采用”主-从-从“的同步模式,就是选择一个从库作为联接主库和其他从库的对象,避免主库忙于处理fork子进程。选择从库的命令就是:

replicaof 从库IP 端口
复制代码

这个"主-从-从"模式的示意图如下:

image.png

当主从库完成了全量复制时,这个主从集群就会有一个长连接去做同步数据的工作,这样可以避免频繁地建立连接产生开销。

增量复制的过程

当网络故障后,主从库就会采用增量复制的方式继续同步数据。

主要过程就是当主从库断开连接后,主库会将这个断连过程中的写操作命令,都写入到一个环形扇区replication buffer,同时也会将命令写到repl_backlog_buffer缓冲区。repl_backlog_buffer这个缓冲区就记录着主库写到的位置,而从库会记录自己读到的位置。

正常情况下,从库在缓冲区的读位置和主库的写位置的偏移量基本相等。主从库连接恢复后, 主库只用把 master_repl_offset 和 slave_repl_offset 之间的命令操作同步给从库就行。

在网络断开期间,若主库的repl_backlog_size环形缓冲区写满之后,会覆盖数据。连接恢复后,从库通过psync命令将自己记录的slave_repl_offset发给主库。若主库查询不到就进行全量复制,查得到就增量复制。

小结

主从同步过程,主要是增量复制这块较难理解,大家可以参考官方文档多了解一下具体实现。总的来说,主从同步保证了我们实例故障时,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
相关文章
|
1月前
|
监控 NoSQL Redis
如何保证Redis的高可用性?
【4月更文挑战第2天】Redis高可用性涉及数据持久化(RDB&AOF)、主从复制与Sentinel故障转移、Redis Cluster分布式部署、身份认证、多线程、数据压缩及监控报警等策略,确保服务连续性、数据安全及性能优化。
42 0
|
1月前
|
缓存 NoSQL 关系型数据库
亿级电商流量,高并发下Redis与MySQL的数据一致性如何保证
你们有多少人是被面试官问到过Redis和MySQL的数据一致性如何保证的? 你们是否考虑过在高并发场景下,Redis与MySQL的同步会有哪些问题?该如何解决? 本篇文章会带大家详细了解,让你知其然,知其所以然,吊打面试官。
417 0
亿级电商流量,高并发下Redis与MySQL的数据一致性如何保证
|
1月前
|
缓存 NoSQL 算法
17- 数据库有1000万数据 ,Redis只能缓存20w数据, 如何保证Redis中的数据都是热点数据 ?
保证Redis中的20w数据为热点数据,可以通过设置Redis的LFU(Least Frequently Used)淘汰策略。这样,当数据库有1000万数据而Redis仅能缓存20w时,LFU会自动移除使用频率最低的项,确保缓存中的数据是最常使用的。
84 8
|
1月前
|
存储 缓存 NoSQL
Redis与数据库同步指南:订阅Binlog实现数据一致性
本文由开发者小米分享,探讨分布式系统中的一致性问题,尤其是数据库和Redis一致性。文章介绍了全量缓存策略的优势,如高效读取和稳定性,但也指出其一致性挑战。为解决此问题,提出了通过订阅数据库的Binlog实现数据同步的方法,详细解释了工作原理和步骤,并分析了优缺点。此外,还提到了异步校准方案作为补充,以进一步保证数据一致性。最后,提醒在实际线上环境中需注意日志记录、逐步优化和监控报警。
66 3
|
1月前
|
存储 监控 NoSQL
Redis是如何保证高可用的?
通过这些机制,Redis可以在主节点故障或其他异常情况下保持高可用性,确保数据的可靠性和可用性。不过,为了实现高可用性,需要仔细规划和配置Redis集群,并确保监控和故障恢复机制的可靠性。
38 6
|
1月前
|
缓存 NoSQL 关系型数据库
MySQL与Redis的默契协作:解析数据一致性难题与解决方案
MySQL与Redis的默契协作:解析数据一致性难题与解决方案
41 0
MySQL与Redis的默契协作:解析数据一致性难题与解决方案
|
1月前
|
存储 NoSQL Java
面试官:Redis如何保证高可用?
面试官:Redis如何保证高可用?
92 2
面试官:Redis如何保证高可用?
|
1月前
|
缓存 NoSQL 数据库
[Redis]——数据一致性,先操作数据库,还是先更新缓存?
[Redis]——数据一致性,先操作数据库,还是先更新缓存?
|
1月前
|
缓存 NoSQL 关系型数据库
掘地三尺搞定 Redis 与 MySQL 数据一致性问题
掘地三尺搞定 Redis 与 MySQL 数据一致性问题
126610 3
|
1月前
|
缓存 NoSQL 关系型数据库
如何保障mysql和redis之间的数据一致性?
如何保障mysql和redis之间的数据一致性?
466 0