我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Redis学习笔记(十三) 复制(下)

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Redis学习笔记(十三) 复制(下)

Redis学习笔记(十三) 复制(下)

上一篇写了Redis复制功能的简单应用,下面我们看下Redis复制功能的实现过程。下面基本上是理论部分,枯燥乏味,但希望大家能看看,毕竟知识不都是感兴趣的.
耐得住寂寞,经得起诱惑,方能守得住繁华 ~.~
旧版复制功能的实现

Redis的复制功能分为同步和命令传播两个操作:

同步操作用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态。

命令传播操作则用于在主服务器 的数据库状态被修改,导致从服务器的数据库状态出现不一致时,让主服务器的数据库重新回到一致状态。

从服务器对主服务器的同步操作需要通过向主服务发送sync命令来完成,以下是sync命令的执行步骤:

(1)从服务器向主服务器发送SYNC命令

(2)收到SYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录现在开始执行的所有写命令。

(3)当主服务器的BGSAVE命令执行完毕时,主服务器会BGSAVE命令生成的RDB文件发送给从服务器,从服务器接收并载入这个RDB文件,将自己的数据库状态更新至主服务器执行BGSAVE命令时的数据库状态。

(4)主服务器将记录在缓冲区的所有写命令发送给从服务器,从服务器执行这些写命令,将自己的数据库状态更新至主服务器数据库当前所处的状态。

命令传播:当主服务器执行客户端写命令时,主服务器的数据库就有可能被修改,并导致主从不一致。此时主服务器会将自己执行的写命令发送给从服务器执行,当从服务器执行了相同的写命令后,主从服务器再次回到一致状态。

缺陷

初始复制从服务器从来没有复制过任何主服务器或者从服务器当前要复制的主服务器和上次复制的主服务器不同。

断线后重复制:处于命令传播阶段的主从服务器因为网络原因而中断了复制,但从服务器通过自动连接从新连上主服务器,并继续复制。


新版复制功能的实现(PSYNC代替SYNC)

PSYNC命令具有完整重同步和部分重同步两种模式:

(1)完整重同步用于处理初次复制功能,与SYNC功能基本一致;

(2)部分重同步用于处理断线后重复值的情况,解决旧版效率低的问题。

 

部分重同步的实现:

(1)主服务器与从服务器都会维护一个复制偏移量

(2)复制积压缓冲区是由主服务器维护的一个固定长度先进先出的队列默认(1MB),发生断线从连时,但从服务器重连上主服务器,从服务器会通过PSYNC命令将自己的复制偏移量offset发送给主服务器,主服务器根据这个复制偏移量来决定对从服务器执行何种同步操作:如果offset偏移量之后的数据仍然存在于复制积压缓冲区里面,那么主服务器将对从服务器执行部分重同步,反之,执行完整重同步操作。除了复制偏移量和复制积压缓冲之外,实现部分重同步还需要用到服务器运行ID:每个Redis服务器都有自己启动时生成的由40个随机16进制字符组成的运行ID。当服务器对主服务器进行初次复制时,主服务器会将自己的运行ID传送给从服务器,而从服务器则会将这个运行ID保存起来。当服务器断线重连时,从服务器向主服务器发送保存的运行ID,如果ID一样,则主服务器尝试部分重同步操作,如果不同,则执行完整重同步操作。

PSYNC命令的实现

PSYNC命令的实现方法有两种:

1)如果从服务器以前没有复制过任何主服务器,或者之前执行过SLAVEOF no one命令,那么从服务器在开始新的复制时将向主服务器发送PSYNC? -1 命令,主动请求进行完整重同步。

(2)如果之前复制过某个主服务器,那么从服务在开始一次新的复制时向主服务器发送PSYNC 。由主服务器来判断该用那种方式同步。

(3)如果主服务器返回+FULLRESYNC回复,则表示主服务器将与从服务器执行完整重同步。

(4)如果主服务器返回+CONTINUE回复,则表示部分重同步,从服务器只需等待接收数据即可。

(5)主服务器返回-ERR回复,则表示主服务器版本低于2.8不识别PSYNC命令从服务器将向主服务器发送SYNC命令完成同步操作。

复制的实现

执行SLAVEOF ip port命令,此时从服务器首先将ip与端口保存到服务器状态的masterhost属性与masterport属性里面,并向客户端返回“OK”,表示命令已经被接收。

建立套接字连接

从服务器根据ip与端口创建连向主服务器的套接字,如果套接字连接到主服务器,那么从服务器将为这个套接字关联一个 专门用于处理复制工作的文件事件处理器,这个事件处理器负责执行后续复制工作。主服务器在接受从服务器的套接字连接后,将为该套接字创建相应的客户端状态,并将从服务器看作一个连接到主服务器的客户端对待,

发送PING命令

作用:

(1)虽然与主服务器建立套接字连接,但双方并未使用该套接字进行任何通信,检查套接字读写是否正常。

(2)检查主服务器是否能够正常处理命令请求。

发送命令后可能遇到的三种情况:

(1)超时,在规定的时间限制内从服务器未收到回复内容,此时从服务器断线重连。

(2)如果主服务器向从服务器回复一个错误,表示主服务器暂时无法处理从服务器的命令请求,从服务器断线重连。

(3)收到正常回复内容,则可以进行下一步操作。

身份验证(如果从服务器设置了masterauth选项)

从服务器向主服务器发送一条AUTH命令,此时从服务器可能遇到的情况有:

(1)主服务器没有设置requirepass选项,并且从服务器没有设置master选项,那么从服务器将继续执行从服务发送的命令,复制操作继续。

(2)如果从服务器通过AUTH命令发送的密码与主服务器requirepass设置的密码相同,那么主服务器将继续执行从服务器发送的命令,如果不同则主服务器返回一个invalid password错误。

(3)如果主服务器设置了requirepass选项,但从服务器没有设置masterauth选项,那么主服务器将返回一个NOAUTH选项。另一方面如果主服务器没有设置requirepass选项,但服务器设置了masterauth选项,那么主服务器将返回一个no password is set 错误。

发送端口信息,从服务器将执行REPLCONF listening-port port命令,向主服务器发送从服务器的监听端口号,主服务器将端口号保存在对应的客户端状态slave_listening_port属性中。

同步

 

命令传播

主服务器将自己执行的写命令发送给从服务器,从服务器只要一直执行主服务器发来的命令即可。

 

心跳检测

在命令传播阶段,从服务器默认以每秒一次的频率向主服务器发送命令:

REPLCONF ACK

作用:检测主服务器的网络连接状态;辅助实现min-slaves选项;检测命令丢失。

Redis的min-slaves-to-write和min-slaves-max-lag两个选项防止主服务器在不安全的情况下执行写命令。

当从服务器小于min-slaves-to-write或者min-slaves-to-write个数量的服务器延迟lag值都大于等于min-slaves-max-lag时,主服务器将拒绝执行写命令。

如果因为网络故障,主服务器传播给从服务器的写命令半路丢失,那么当从服务器向主服务器发送REPLCONF ACK命令时,主服务器将发觉从服务器当前的复制偏移量少于自己的偏移量,主服务器就会根据从服务器提交的复制偏移量,在复制积压缓冲区里面找到从服务器缺少的数据,并将这些数据重新发送给从服务器。

 


 

 

每天学一点,总会有收获。

 

下一步我们看下Redis的Sentinel(哨兵)

 

说明:尊重作者知识产权,文中内容参考《Redis设计与实现》,仅在此做学习与大家分享。

 

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Redis学习笔记(十三) 复制(下)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Redis学习笔记(十三) 复制(下)

上一篇写了Redis复制功能的简单应用,下面我们看下Redis复制功能的实现过程。下面基本上是理论部分,枯燥乏味,但希望大家能看看,毕竟知识不都是感兴趣的.耐得住寂寞,经得起诱惑,方能守得住繁华 ~.~旧版复制功能的实现Redis的复制功能分为同步和命令传播两
Redis学习笔记(十三) 复制(下)
2022-04-20

Redis学习笔记(十二) 复制(上)

偷个懒,晚上工作忙的太晚,整个复制功能的内容还没有写完,这里先说一下复制功能的简单应用。在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器
Redis学习笔记(十二) 复制(上)
2017-05-07

Redis学习笔记(十八) 集群(下)

复制和故障转移Redis集群中的节点分为主节点(master)和从节点(slave),其中主节点用于处理槽,而从节点则用于复制某个主节点,并在被复制 的主节点下线时,代替下线主节点继续处理命令请求。设置从节点:CLUSTER REPLICATE 可以让接收命令
Redis学习笔记(十八) 集群(下)
2017-08-15

Redis学习笔记(十六) Sentinel(哨兵)(下)

消失了一段时间,我又回来啦。不多说,继续把哨兵看完。 检测主观下线状态默认情况下,Sentinel会以每秒一次的频率向所有与他创建了命令连接的实例(主从服务器以及其他Sentinel)发送PING命令,并通过实例返回的PING命令回复来判断实例是否在线。实例对
Redis学习笔记(十六) Sentinel(哨兵)(下)
2019-07-27

Redis学习笔记(二十) 发布订阅(下)

当一个客户端执行SUBSCRIBE命令订阅某个或某些频道时,这个客户端与被订阅频道之间就建立起了一种订阅关系。Redis将所有频道的订阅关系保存在服务器状态的pubsub_channels字典里面,这个字典的键是某个被订阅的频道,而键的值是一个链表,链表里面记
Redis学习笔记(二十) 发布订阅(下)
2022-03-29

Redis学习笔记(十) 客户端

Redis服务器是典型的一对多服务器程序:一个服务器可以与多个客户端建立网络连接,每个客户端可以向服务器发送命令请求,而服务器则接收并处理客户端发送的命令请求,并向客户端返回命令回复。通过使用由I/O多路复用技术实现的文件事件处理器,Redis服务器使用单线程
Redis学习笔记(十) 客户端
2022-04-06

学习笔记-小甲鱼Python3学习第三十

丰富的else语句python中else不仅可以与if搭配组成控制流,还可以与while或for搭配使用要么怎样,要么不怎样干完了能怎样,干不完就别想怎样没有问题,那就干吧举例:求素数def showMaxFactory(num):   
2023-01-31

Redis学习笔记(三) 字典

Redis的字典使用哈希表作为底层实现,一个哈希表中可以有多个哈希表节点,而每个哈希节点就保存在字典中的一个键值对。redis字典所用的哈希表由disht结构定义。typedef struct dictht{ dictEntry **table;//哈希
Redis学习笔记(三) 字典
2014-05-20

学习笔记-小甲鱼Python3学习第十三

元组中的元素不能被修改。用()把元素括起来,用,逗号隔开创建和访问元组更新和删除元组元组的相关操作符元组创建:>>> tuple1 = (1,2,3,4,5,6,7,8)            #使用()括起来,用,逗号隔开>>> tupl
2023-01-31

Python学习笔记整理(十三)Pyth

一、模块模块是Pyhon最高级别的程序组织单元,它将程序代码和数据封装起来以便重用。实际的角度,模块往往对应Python程序文件。每个文件都是一个模块,并且模块导入其他模块之后就可以使用导入模块定义的变量名。模块可以由两个语句和一个重要的内
2023-01-31

Redis学习笔记(二十一) 事务

文章开始啰嗦两句,写到这里共21篇关于redis的琐碎知识,没有过多的写编程过程中redis的应用,着重写的是redis命令、客户端、服务器以及生产环境搭建用到的主从、哨兵、集群实现原理,如果你真的能看的进去,相信对你在以后用到redis时会有一定的帮助。写到
Redis学习笔记(二十一) 事务
2017-07-23

Redis学习笔记(十一) 服务器

Redis服务器负责与多个客户端建立网络通信,处理客户端发送的命令请求,在数据库中保存客户端执行命令所产生的数据,并通过资源管理来维持服务器自身的运转。 命令请求过程(以set命令为例) 1、客户端向服务器发送命令请求 SET KEY VALUE。 Redis
Redis学习笔记(十一) 服务器
2014-11-11

Redis学习笔记(十七) 集群(上)

Redis集群是Redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移操作。一个Redis集群通常由多个节点组成,在刚开始的时候每个节点都是相互独立的,他们处于一个只包含自己的集群当中,我们通过使用CLUSTER MEET命令将节点
Redis学习笔记(十七) 集群(上)
2015-09-17

python学习笔记(十 三)、网络编程

最近心情有点儿浮躁,难以静下心来   Python提供了强大的网络编程支持,很多库实现了常见的网络协议以及基于这些协议的抽象层,让你能够专注于程序的逻辑,而无需关心通过线路来传输比特的问题。1 几个网络模块  1.1 模块socket  网
2023-01-31

Redis学习笔记(十五)Sentinel(哨兵)(中)

上一篇 我们模拟了单机器下哨兵模式的搭建,那么接下来我们看下哨兵模式的实现与工作。为什么又分成两篇呢?因为篇幅太长(偷懒),再一个这篇主要说的是Sentinel的初始化以及信息交换,下一篇着重说下状态检查、Sentinel头领选举与故障转移 。启动并初始化Se
Redis学习笔记(十五)Sentinel(哨兵)(中)
2020-07-22

Redis学习笔记(十四)Sentinel(哨兵)(上)

最近谈到Redis就会听到哨兵模式,工作期间同事也分享过关于哨兵模式的知识,但由于工作忙(给自己找个借口)没有没认真看,现在恶补下,老样子还是分上篇应用,下篇看实现过程,下面我们来看下哨兵到底是啥?哨兵模式(Sentinel)是Redis的高可用解决方案。由一
Redis学习笔记(十四)Sentinel(哨兵)(上)
2019-07-22

Redis学习笔记(十九) 发布订阅(上)

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息,它的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道,
Redis学习笔记(十九) 发布订阅(上)
2016-04-03

Redis学习笔记:Windows下的安装

一、Redis下载    官网下载地址:http://redis.io/download    GitHub下载地址:https://github.com/MSOpenTech/redis/tags    备注:现在的Redis官网没有Windows版的下载链
Redis学习笔记:Windows下的安装
2021-10-14

Redis学习笔记:Redis在Windows下的安装

一、Redis下载    官网下载地址:http://redis.io/download    GitHub下载地址:https://github.com/MSOpenTech/redis/tags    备注:现在的Redis官网没有Windows版的下载链
Redis学习笔记:Redis在Windows下的安装
2019-02-14

编程热搜

目录