当数据落在不同节点上时,如何保证数据节点之间的一致性是非常关键的

  Redis采用主备复制的方式保证一致性,所有节点中,只有一个节点为主节点(master),它对外提供写服务,然后异步的将数据复制到其他节点上

  主备复制流程

  Redis包含master 和slave 2种节点:

  master 对外提供写服务

  slave 节点作为master的数据备份,不可以提供写服务

  主备复制由master 主动触发

  

  1、首先slave向master发起SYNC命令。这一步在slave启动后触发,master 被动的将新slave节点加入主备复制集群

  2、master收到SYNC后,开启BGSAVE 操作。BGSAVE 是Redis的一种全量持久化机制(RDB)

  3、BGSAVE完成后,master将快照信息发送给slave

  4、发送期间,master收到来自Client的新写入命令,除了正常响应外,再存入一份到backlog队列

  5、快照信息发送完成后,master继续发送backlog队列中的信息

  6、backlog发送完成之后,后续的操作同时发给slave,保持实时的异步复制

  对于上面的slave节点,处理逻辑如下:

  发送完SYNC后,继续对外提供服务

  开始接受master的快照信息,此时会清空slave现有数据,并将master快照写入

  接收backlog 并执行(回放),期间对外提供读服务

  继续接受master的命令副本,并继续回放,从而保持和master的数据一致性

  如果有多个slave 同时发送SYNC 命令

  只要第2个slave的SYNC 命令发生在master 完成BGSAVE之前,第2个slave 将和第1个收到相同的快照和backlog

  否则第2个slave的SYNC将触发master的第2次BGSAVE

  断点续传

  当每次slave 通过SYNC 和master同步数据时,master都会dump 全量数据并发送

  当一个已经和master 完成了同步,并且并保持了长时间的slave,当网络断开很短时间再重新连上时,master不得不重新做一次全量的dump传送。这种无疑会增加大量的无效开销,最好的方式是只同步网络断开期间的增量数据。

  Redis的 PSYNC(Partial Sync)可以用于代替SYNC,做到master-slave基于断点续传的主备同步协议。master-slave 2端通过维护一个offset记录当前已经同步的命令,slave断开期间,master的增量命令会保存在缓存中。当slave重连后,告知master断开时的offset,master会将后续的数据继续同步,从而完成了断点续传。

分布式Redis主备复制的更多相关文章

  1. Redis主备复制

    Redis 支持 Master-Slave(主从)模式,Redis Server 可以设置为另一个 Redis Server 的主机(从机),从机定期从主机拿数据.特殊的,一个从机同样可以设置为一个 ...

  2. 搭建和测试 Redis 主备和集群

    本文章只是自我学习用,不适宜转载. 1. Redis主备集群 1.1 搭建步骤 机器:海航云虚机(2核4GB内存),使用 Centos 7.2 64bit 操作系统,IP 分别是 192.168.10 ...

  3. 如何在DCS管理控制台将两个Redis主备实例建立全球灾备。

    华为云分布式缓存服务DCS,具有强大的功能,现在小编教大家如何在DCS管理控制台将两个Redis主备实例建立全球灾备. 建立全球灾备,会对主实例和备实例进行升级,实例进程会重启,连接会中断.同时备实例 ...

  4. mysql+mycat搭建稳定高可用集群,负载均衡,主备复制,读写分离

    数据库性能优化普遍采用集群方式,oracle集群软硬件投入昂贵,今天花了一天时间搭建基于mysql的集群环境. 主要思路 简单说,实现mysql主备复制-->利用mycat实现负载均衡. 比较了 ...

  5. MySQL主备复制原理、实现及异常处理

    复制概述 MySQL支持三种复制方式:基于行(Row)的复制.基于语句(Statement)的复制和混合类型(Mixed)的复制. 基于语句的复制早在3.23版本中就存在,而基于行的复制方式在5.1版 ...

  6. MySQL建立双向主备复制server配置方法

    1.环境描写叙述 serverA(主) 192.85.1.175 serverB(从) 192.85.1.176 Mysql版本号:5.1.61 系统版本号:System OS:ubuntu 10.1 ...

  7. 阿里云ECS部署Redis主备哨兵集群遇到的问题

    一.部署 详细部署步骤:https://blog.csdn.net/lihongtai/article/details/82826809 Redis5.0版本需要注意的参数配置:https://www ...

  8. 分布式Redis深度历险-复制

    Redis深度历险分为两个部分,单机Redis和分布式Redis. 本文为分布式Redis深度历险系列的第一篇,主要内容为Redis的复制功能. Redis的复制功能的作用和大多数分布式存储系统一样, ...

  9. 【MySQL】主备复制

    复制对于mysql的重要性不言而喻,mysql集群的负载均衡,读写分离和高可用都是基于复制实现.下文主要从4个方面展开,mysql的异步复制,半同步复制和并行复制,最后会简单聊下第三方复制工具.由于生 ...

随机推荐

  1. 奇怪的Visual Studio 2013停止响应问题

    昨天开始遭遇这个问题,今天再次遭遇. 疑似问题发生在写代码的窗口中复制/粘贴时(有待进一步确认触发条件),突然停止响应,出现下面的对话框: 对话框中的文字为: Waiting for a requir ...

  2. Python开发【Django】:路由规则

    Django路由规则 1.基于正则的URL 在templates目录下创建index.html.detail.html文件 <!DOCTYPE html> <html lang=&q ...

  3. python获取当天日期进行格式转换

    # Python Library import time def getToday(format=3): """返回今天的日期字串""" # ...

  4. busybox,alphine,ubuntu,centos/fedore操作系统

    在docker 中搜索busybox   docker search busybox 之后我们运行一下这个系统 Alpine操作系统 3.ubuntu 之前一直都安装过,这里不再多叙述 当时用apt- ...

  5. android的selector选择器

    1. drawable/actionbar_compat_item.xml 2.drawable/actionbar_compat_item_pressed.xml 3.drawable/action ...

  6. mysql 数据操作 单表查询 使用正则表达式查询

    SELECT * FROM employee WHERE name REGEXP '^ale'; SELECT * FROM employee WHERE name REGEXP 'on$'; SEL ...

  7. AE读取CAD图层包括注记

    public override void FillDatabase(Teigha.DatabaseServices.Database pDb) { IFeatureClassContainer pFe ...

  8. Hook?

    public interface IHook { /// <summary> /// 二维地图控件对象 /// </summary> ESRI.ArcGIS.Controls. ...

  9. 详解javascript实现自定义事件

    这篇文章主要为大家介绍了javascript实现自定义事件的方法,自定义事件,顾名思义,就是自己定义事件类型,自己定义事件处理函数,javascript如何实现自定义事件,需要了解的朋友可以参考下 我 ...

  10. android studio 使用CMAKE

    前言 之前,每次需要边写C++代码的时候,我的内心都是拒绝的.  1. 它没有代码提示!!!这意味着我们必须自己手动敲出所有的代码,对于一个新手来说,要一个字母都不错且大小写也要正确,甚至要记得住所有 ...