当前位置:首页 > 数据库 > 正文内容

一文聊清楚Redis主从复制原理

邻居的猫1个月前 (12-09)数据库1352

本地缓存带来的应战

分布式缓存比较于本地缓存,在完结层面需求重视的点有哪些不同。整理如下:

维度 本地缓存 会集式缓存
缓存量 受限于单机内存巨细,存储数据有限 需求供给给分布式体系里边一切节点一同运用,关于大型体系而言,对会集式缓存的容量诉求十分的大,远超单机内存的容量巨细。
可靠性 影响有限,只要本进程运用,不会影响其他进程的可靠性。 作为整个体系扛压屏障,体系内一切节点一同依靠的通用服务,一旦会集式缓存出问题,会影响与其对接的一切事务节点,对体系的影响是致命性的。
承压性 承载单机节点的压力,恳求量有限 承载整个分布式集群一切节点的流量,体系内事务分布式节点布置数量越多、事务体量越大,会导致会集缓存要承载的压力就越大,乃至是上不封顶的。

从上述几个维度的比照能够发现,同样是缓存,但会集式缓存所承当的任务是彻底不相同的,事务对会集式缓存的存储容量可靠性承压性等方面的诉求也是大相径庭,不行同等视之。以Redis为例:

  • 怎样打破redis缓存容量受限于机器单机内存巨细的问题?
  • 怎样使得redis能够扛住多方过来的恳求压力?
  • 怎样确保redis不会成为单点毛病源?

其实答案很简单,加机器!经过多台机器的叠加运用,到达比单机更优的效果 —— 现在事务体系的集群化布置,也都是选用的这个思路。Redis的分布式之路亦是如此,但比较于惯例的事务体系分布式集群化构建愈加杂乱:

  1. 许多事务完结集群化布置会很简单,由于每个事务进程节点都是无状况的,只需求布置下然后经过负载均衡的方法对外供给恳求应对即可。
  2. Redis作为一个会集式缓存数据库,它是有状况的,不只需求将进程别离布置在多个节点上,还需求将数据也涣散存储在各个节点上,一同还得确保整个Redis集群对外是一个共同全体。

所以关于一个会集式缓存的分布式才能构建,必需求额定供给一些机制,来确保数据在各个节点上的安全与共同性,还需求将涣散在各个节点上的数据都组成一个逻辑上的全体。

主从仿制简介

主从仿制是什么

主从仿制,是指将一台Redis服务器的数据,仿制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的仿制是单向的,只能由主节点到从节点,而关于redis来说,一主两从是比较常见的调配。

主从形式依照读写别离的战略来进步全体的恳求处理才能:

  1. 主节点(Master)一同对外供给读和写操作
  2. 从节点(Slave)经过replicate同步的方法,从主节点仿制数据,坚持本身数据与主节点共同
  3. 从节点只能对外供给读操作

当然,关于读多写少类的操作,为了进步全体读恳求的处理才能,能够选用一主多从的方法。一切的从节点都从主节点进行数据同步,这样会导致主节点的同步处理压力过大而成为瓶颈。为了处理这个问题,redis还支撑了从slave节点分发的才能,也便是从服务器也能够有自己的从服务器, 多个从服务器之间能够构成一个主从链。这样能够分摊主服务器压力。

主从仿制的效果

  • 数据备份:主从仿制完结了数据的热备份,是耐久化之外的一种数据冗余方法。
  • 毛病康复:当主节点呈现问题时,能够由从节点供给服务,完结快速的毛病康复。
  • 读写别离:由主节点供给写服务,由从节点供给读服务,进步Redis服务器的并发量。

主从仿制流程

全量仿制

在第一次同步时会进行全量仿制(但并非只要第一次同步时全量仿制,其他状况看后文)

第一次同步时流程:

第一阶段:树立链接、洽谈同步

从服务器向主服务器发送PSYNC ? -1 指令,主动恳求进行完好重同步

psync 指令包括两个参数,别离是主服务器的 runID 和仿制进展 offset。

  • runID,每个 Redis 服务器在启动时都会主动生产一个随机的 ID 来仅有标识自己。当从服务器和主服务器第一次同步时,由于不知道主服务器的 run ID,所以将其设置为 "?"。
  • offset,表明仿制的进展,(也叫仿制偏移量),主要为增量仿制服务,这儿由于是全量仿制,所以运用-1表明。

主服务器收到 psync 指令后,会向从服务器发送FULLRESYNC呼应指令并带上两个参数:主服务器的 runID 和主服务器现在的仿制进展 offset。从服务器收到呼应后,会记载这两个值。

FULLRESYNC 呼应指令的目的是选用全量仿制的方法,也便是主服务器会把一切的数据都同步给从服务器。

第二阶段:主服务器同步数据给从服务器

接着,主服务器会履行 bgsave 指令来生成 RDB 文件,然后把文件发送给从服务器(数据耐久化)。

从服务器收到 RDB 文件后,会先清空当时的数据,然后载入 RDB 文件。这是由于从服务器在经过 replicaof 指令开端和主服务器同步前,或许保存了其他数据。为了防止之前数据的影响,从服务器需求先把当时数据库清空。

这儿有一点要留意,主服务器生成 RDB 这个进程是不会堵塞主线程的,由于 bgsave 指令是产生了一个子进程来做生成 RDB 文件的作业,是异步作业的,这样 Redis 依然能够正常处理指令。

就像RDB文件生成进程中Redis不中止供给服务相同,从服务器在接纳并载入RDB文件的进程中,主服务器依然能够写入数据,那怎样将这部分数据传给从服务器呢?

第三阶段:主服务器发送新写操作指令给从服务器

为了确保主从服务器的数据共同性,主服务器为每个衔接进来的从服务器预备了一个replication buffer缓冲区,这段时刻内写入的数据都会被存入这个replication buffer中,从服务器完结 RDB 的载入后,会回复一个承认音讯给主服务器。主服务器就将replication buffer中的数据推送曩昔。

长衔接传达

主从服务器在完结第一次同步后,两边之间就会保护一个 TCP 衔接,这个TCP衔接是长衔接

之后就会依据这个长衔接进行指令传达。经过这种方法来确保第一次同步后的主从服务器的数据共同性。

增量仿制

实际上,生成RDB文件是比较消耗资源的,一同,主服务器传输 RDB 文件给从服务器,这个操作会消耗主从服务器很多的网络资源,并对主服务器呼应时延产生影响。而对从服务器而言,载入 RDB 文件期间,会堵塞其他指令恳求,这也会导致呼应功率的下降。而且,当从服务器断开后从头衔接,主从数据不共同,在数据少数不共同的状况下,也不需求全量仿制。因而,就供给了增量仿制

仿制偏移量(replication offset)

主服务器和从服务器会别离保护一个仿制偏移量。假如主从服务器的仿制偏移量相同,则阐明二者的数据库状况共同;反之,则阐明二者的数据库状况不共同,此刻从服务器需求运用增量仿制来同步缺失的这一部分数据。

仿制积压缓冲区(replication backlog)

主服务器的写指令,除了传给从服务器后,还会写入replication backlog(大局仅有),这是一个固定长度的先进先出(FIFO)行列,默许巨细为 1MB。其在内存中是一个环形结构。

  1. 主服务器依照顺时针方向写指令,主服务器最新写入的方位即为上文说到的主服务器的偏移量,这儿叫master offset。
  2. 假定从服务器在set key2 2后断开衔接,也便是上图中slave offset的方位,当它重连时,再次给主服务器发送psync指令时,会带上自己的offset(留意和全量仿制的差异,全量仿制时offset设置为-1,此刻是从服务器实在的offset值)。
  3. 接着,主服务器发现从服务器的偏移量与自己不共同,需求进行增量仿制。此刻主服务器管帐算出master offset与slave offset之间的指令,并发送给该为从服务器预备的replication buffer中,从而发送给从服务器。
  4. 从服务器进行写入后便又康复到和主服务器共同的状况。

断开重连并纷歧定总是增量仿制

网络断开后,当从服务器从头连上主服务器时,从服务器会经过 psync 指令将自己的仿制偏移量 slave_repl_offset 发送给主服务器,主服务器依据自己的 master_repl_offset 和 slave_repl_offset 之间的距离,然后来决议对从服务器履行哪种同步操作:

  1. 整个replication backlog是个环形结构,也便是说最新的写指令会将最老的写指令掩盖。换句话说,假如从服务器断开时刻太久,环形缓冲区被主服务器的写指令掩盖了,那么从服务器连上主服务器后只能经过全量仿制来获取数据了。所以replication backlog装备要尽量大一些,能够下降主从断开后全量仿制的概率。
    • 假如判别出从服务器要读取的数据还在 repl_backlog_buffer 缓冲区里,那么主服务器将选用增量同步的方法;
    • 相反,假如判别出从服务器要读取的数据现已不存在 repl_backlog_buffer 缓冲区里,那么主服务器将选用全量同步的方法。
  2. 上文中有说到每个实例有自己的RunID,这个值在服务器启动时主动生成,由 40 个随机的十六进制字符组成。从服务器断开重连时会将之前主服务器的RunID一同发送曩昔(这儿留意和第一次衔接的差异,第一次衔接时发送的RunID是“?”),主服务器会判别这个RunID是否为自己,假如不是(比方呈现脑裂,呈现两个主服务器),则会和全量仿制时相同回来FULLRESYNC呼应指令,奉告从服务器需求进行全量仿制。

总结

主从服务器第一次同步的时分,便是选用全量仿制。

第一次同步完结后,主从服务器都会保护着一个长衔接,主服务器在接纳到写操作指令后,就会经过这个衔接将写指令传达给从服务器,来确保主从服务器的数据共同性。

假如遇到网络断开,就需求进行增量仿制(当然纷歧定是增量仿制,详细还需求看replication backlog的巨细,以及对应的主服务器RunID)。

面试题专栏

Java面试题专栏已上线,欢迎拜访。

  • 假如你不知道简历怎样写,简历项目不知道怎样包装;
  • 假如简历中有些内容你不知道该不该写上去;
  • 假如有些归纳性问题你不知道怎样答;

那么能够私信我,我会尽我所能协助你。

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=548

标签: Redis
分享给朋友:

“一文聊清楚Redis主从复制原理” 的相关文章

【GreatSQL优化器-05】条件过滤condition_fanout_filter

【GreatSQL优化器-05】条件过滤condition_fanout_filter

【GreatSQL优化器-05】条件过滤condition_fanout_filter 一、condition_fanout_filter介绍 GreatSQL 的优化器关于 join 的表需求依据行数和 cost 来确认最终哪张表先履行哪张表后履行,这儿边就触及到预估满意条件的表数据,condit...

zookeeper基础知识共享(一)

zookeeper基础知识共享(一)

写在前面 今日来学习Zookeeper部分的常识,之后会学习hbase的常识。 Zookeeper简介 Zookeeper是一个高效的分布式和谐服务,能够供给以下功用: 装备信息办理 命名 分布式同步 集群办理 数据库切换等服务 它不合适用来存储很多信息,而是用于存储一些装备信息、发布与订阅等少数数...

流放之路数据库,全面解析游戏资料与攻略

1. 流放之路编年史 这是一个全面的数据库,包含游戏中的物品、技能、挑战、赛季、残暴等内容。你可以在这里查看最新的更新公告,参与讨论,或使用PoB Code生成装备和技能。2. 流放之路BD库 踩蘑菇社区 这里收集了各版本BD合集,包含国际服、台服和国服的BD,以...

mysql手册,入门到进阶的数据库管理指南

mysql手册,入门到进阶的数据库管理指南

你可以通过以下链接查看MySQL手册和教程:1. MySQL 8.0 参考手册:这个手册详细记录了MySQL 8.0和NDB Cluster 8.0的功能和变更。你可以访问以下链接获取。2. MySQL 8.4 参考手册:这个手册涵盖了MySQL 8.4和NDB Cluster 8.4的功能和用法。...

个人征信大数据查询,了解信用状况,守护个人金融安全

您可以通过以下几种途径查询个人征信大数据:1. 中国人民银行征信中心: 提供个人信用报告查询服务及异议申请线上办理,确保信息安全。2. 个人信用信息服务平台: 该平台提供个人信用报告查询服务,需通过银行卡或数字证书验证身份,查询结果一般在24小时内反馈。3. 信用中国:...

中国经济大数据,驱动发展新引擎

中国经济大数据,驱动发展新引擎

1. 国家统计局: 国家统计局提供了全面的统计数据,包括国内生产总值(GDP)、工业生产、居民消费价格指数(CPI)等。例如,2024年11月份居民消费价格同比上涨0.2%,工业生产者出厂价格同比降幅收窄。 国家统计局还发布了详细的统计公报,例如《中华人民共和国2023年国民经济和社会发...