Redis总结集群方式之主从复制[通俗易懂]

Redis总结集群方式之主从复制[通俗易懂]绪论最近由于小编颈椎病犯了,所以最近停更了文章,今天下午刚收到几千里地老父亲寄来的艾灸贴,晚上贴上之后,伴随着火辣辣的感觉开始创作现在这篇文章;若大家get到了东西,请爱心三连。废话不再多言,下面我们进入正题。主从复制同步策略全量同步时机:slave初始化阶段;机制:slave服务器需要将master服务器上的所有数据都复制一份。增量同步时机:slave初始化之后且正常工作;机制:master服务器每执行一次新的写操作命令同步到slave服务器上,从服务器接收并执行该写命令操作;.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

在这里插入图片描述

绪论

最近由于小编颈椎病犯了,所以最近停更了文章,今天下午刚收到几千里地老父亲寄来的艾灸贴,晚上贴上之后,伴随着火辣辣的感觉开始创作现在这篇文章;若大家get到了东西,请爱心三连。
废话不再多言,下面我们进入正题。

主从复制

同步策略

  • 全量同步
    时机:slave初始化阶段;
    机制:slave服务器需要将master服务器上的所有数据都复制一份。
  • 增量同步
    时机:slave初始化之后且正常工作;
    机制:master服务器每执行一次新的写操作命令同步到slave服务器上,从服务器接收并执行该写命令操作;

总结

  • 主、从服务器刚建立连接时,采用全量同步;
  • 全量同步结束且正常工作,则新的写命令采用增量同步;
  • 此外,从服务器(slave)可以任意时刻发起全量同步命令;
  • 总之,redis策略,正常工作之后先进行增量同步,如失败,则要求从服务器发起全量同步。

同步过程

全量复制

  1. 从服务器连接主服务器时,发送SYNC命令;
  2. 主服务器接收SYNC命令后,执行bgsave命令开始生成RDB文件,并将之后所有的写入命令存储到缓冲区;
  3. 主服务器bgsave命令执行结束后,向所有的从服务器发送RDB快照文件,发送期间所有的写入命令继续存储到缓冲区;
  4. 从服务器接收到快照文件之后,替换旧的快照文件,并载入数据;
  5. 主服务器传输结束快照文件后,将缓冲区中的所有写入命令发给从服务器;
  6. 从服务器载入快照文件结束后,开始接收命令请求,并执行来自主服务器缓冲区的写命令;(从服务器初始化完成);
  7. 主服务器每执行一个写命令,就会给从服务器发送相同的写命令,从服务器接收并执行写命令(从服务器初始化完成之后的操作:增量);

部分复制

  • 工作原理:
    主服务器端为复制流维护一个内存缓冲区(in-memory backlog)。主从服务器都维护一个复制偏移量(replication offset)和master run id ,
    当连接断开时,从服务器会重新连接上主服务器,然后请求继续复制,假如主从服务器的两个master run id相同,并且指定的偏移量在内存缓冲
    区中还有效,复制就会从上次中断的点开始继续。如果其中一个条件不满足,就会进行完全重新同步(在2.8版本之前就是直接进行完全重新同步)。
    因为主运行id不保存在磁盘中,如果从服务器重启了的话就只能进行完全同步了。

  • 工作过程:

  1. 当主从节点之间网络出现中断时,如果超过了 repl-timeout 时间,主节点会认为从节点故障并中断复制连接。
  2. 主从连接中断期间主节点依然响应命令,但因复制连接中断命令无法发送给从节点,不过主节点内部存在复制积压缓冲区( repl-backlog-buffer ),依然可以保存最近一段时间的写命令数据,默认最大缓存 1MB。
  3. 当主从节点网络恢复后,从节点会再次连上主节点。
  4. 当主从连接恢复后,由于从节点之前保存了自身已复制的偏移量和主节点的运行ID。因此会把它们作为 psync 参数发送给主节点,要求进行补发复制操作。
  5. 主节点接到 psync 命令后首先核对参数 runId 是否与自身一致,如果一致,说明之前复制的是当前主节点;之后根据参数 offset 在自身复制积压缓冲区查找,如果偏移量之后的数据存在缓冲区中,则对从节点发送 +CONTINUE 响应,表示可以进行部分复制。
  6. 主节点根据偏移量把复制积压缓冲区里的数据发送给从节点,保证主从复制进入正常状态。

扩展点:
服务器运行ID(run_id):每个Redis节点(无论主从),在启动时都会自动生成一个随机ID(每次启动都不一样),由40个随机的十六进制字符组成;run_id用来唯一识别一个Redis节点。 通过info server命令,可以查看节点的run_id。

总结

特点

a. 采用异步复制的方式;
b. 一个master服务器可以存着多个slave服务器;每个slave服务器可以接受其他slave服务器的连接;
c. 无论对于master、slave服务器都是非阻塞的,master服务器进行主从复制期间时,master服务器依然可以处理外部访问请求;
而slave服务器依然可以处理外部的查询请求,但是查询的结果为旧数据。

优点

a. 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离
b. 为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成
c. Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。
d. Master Server是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求。
e. Slave Server同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据。

缺点

a. Redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
c. 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
d. Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/170311.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 数据编码格式_excel编码格式

    数据编码格式_excel编码格式数据编码

  • pytest skipif_白盒测试用例

    pytest skipif_白盒测试用例前言pytest.mark.skip可以标记无法在某些平台上运行的测试功能,或者您希望失败的测试功能Skip和xfail:处理那些不会成功的测试用例你可以对那些在某些特定平台上不能运行的测试用

  • C语言背包问题优化[通俗易懂]

    C语言背包问题优化[通俗易懂]#include#defineV1500intf[V];intweight[10];intvalue[10];#definemax(x,y)(x)>(y)?(x):(y)intmain(){intN,M;scanf(“%d%d”,&N,&M);for(inti=1;

  • python里面的缩进是什么意思_Python缩进规则(一看即懂)[通俗易懂]

    python里面的缩进是什么意思_Python缩进规则(一看即懂)[通俗易懂]通常来说,一条Python语句应在一行内写完,但如果语句很长,可以使用反斜杠\来实现多行语句,例如:s=”我正在写\一本关于Python的书”print(\s)需要注意的是,在成对的大括号{}、中括号[]或小括号()中的多行语句,不需要使用反斜杠\,例如:total=[‘item_one’,’item_two’,’item_three’,’item_four’,’item…

    2022年10月13日
  • CSS实现实心三角形和空心三角形[通俗易懂]

    CSS实现实心三角形和空心三角形[通俗易懂]一次开发中遇到,记录代码原理:1.给一个div,宽和高都为0的时候,盒子什么都没有看起来。为空白2.给一个宽高为0的盒子给一遍像素给100px的上边,下边和右边,border-top:90pxsolidred;border-right:100pxsolidblack;border-bottom:100pxsolidblue;这样左边没有,就会缩成一

  • ubuntu命令chmod755

    ubuntu命令chmod755使用方式:在终端切换到文件目录输入chmod775hello.py这样就将hello.py变成了可执行文件当然作为python文件还需要再开头加上#!/usr/bin/envpython用于适应linux环境。chmod是Linux下设置文件权限的命令,后面的数字表示不同用户或用户组的权限。一般是三个数字:第一个数字表示文件所有者的权限第二个数字表示与文…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号