15.Redis高级复制

Redis高级特性 发布/订阅模式是一种消息通信模式,允许一个或多个发布者将消息发送到一个或多个订阅者。Redis提供简单的事务功能,可以确保一组命令按顺序执行,具有原子性。Redis支持Lua脚本,可以将多个命令封装在一个脚本中执行,确保原子性和高效性。Redis提供两种持久化方式:RDB快照和AOF日志。RDB (Redis Database)快照:在指定时间间隔保存数据快照。AOF (Append Only File)日志:记录每次写操作,重启时重放日志。 阅读详情


Redis复制

在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replication)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器被称为从服务器(slave)。

进行复制中的主从服务器双方的数据库将保存相同的数据,概念上将这种现象称作“数据库状态一致”,或者简称“一致”。

Redis官方网站关于复制的文档: http://redis.io/topics/replication

 

Redis在2.8版对复制功能进行了更新修改,旧版复制功能在处理断线后重新连接从服务器时效率低,而新版复制功能通过部分重同步来解决旧版复制功能的低效问题。

旧版复制,不管是在同步初始数据RDB时主从中断,还是在命令传播时中断,都需要从头再来,重新传送所有数据,其实在中断前的数据状态是一致的,不一致的仅仅是中断后到重连成功这段时间。

旧版复制功能:

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

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

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

同步步骤:

1.从服务器向主服务器发送SYNC命令;

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

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

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

命令传播:

同步操作执行完后,主从状态一致,但每当主服务器执行写命令后,主从状态就会不一致了,为了再次回到一致状态,需要执行命令传播操作:

主服务器将自己执行的写命令,发送给从服务器执行,执行后主从会再次回到一致状态。

新版复制功能:

新版复制使用PSYNC命令代替了SYNC命令,PSYNC命令具有完整重同步(full resynchronization)和部分重同步(partial resynchronization)两种模式:

完整重同步用于处理初次复制情况:完整重同步的执行步骤和SYNC命令的执行步骤基本一样,都是通过让主服务器创建并发送RDB文件,以及向从服务器发送保存在缓冲区里面的写命令来进行同步;

部分重同步用于处理断线后重复制情况:当从服务器在断线后重新连接主服务器时,如果条件允许,主服务器可以将主从服务器连接断开期间执行的写命令发送给从服务器,从服务器只要接收并执行这些写命令,就可以将数据库更新至主服务器当前所处的状态。

PSYNC命令的部分重同步模式解决了旧版复制功能在处理断线后重复制时出现的低效情况。

部分重同步的实现:

部分重同步由三部分构成:

主服务器的复制偏移量(replication offset)和从服务器的复制偏移量;

主服务器的复制积压缓冲区(replication backlog);

服务器的运行ID(runID)。

复制偏移量

主服务器和从服务器会分别维护着一个复制偏移量:

主服务器每次向从服务器传播N个字节的数据时,就将自己的复制偏移量的值加上N;

从服务器每次收到主服务器传播来的N个字节的数据时,就将自己的复制偏移量的值加上N。

通过对比主从服务器的复制偏移量,可以知道主从服务器是否处于一致状态。

从服务器在断线重连后,向主服务器发送PSYNC命令,并报告从服务器的当前复制偏移量,主服务器根据该从服务器的复制偏移量来判断执行完整重同步行部分重同步。

复制积压缓冲区

复制积压缓冲区是由主服务器维护的一个固定长度先进先出队列,默认大小为1MB,该值可以根据需要来设置其大小,一般设为2*second*write_size_per_second。

主服务器进行命令传播时,不仅会将写命令发送给所有从服务器,还会将写命令入队到复制积压缓冲区里面,因此复制积压缓冲区里面会保留着一部分最近传播的写命令,并且队列中的每个字节都会记录相应的复制偏移量。

主从断线重连后,主服务器会接收到从服务器发送的复制偏移量,根据该复制偏移量来决定执行何种同步操作:

如果offset偏移量之后的数据(offset+1)仍然存在于复制积压缓冲区里面,那么主服务器将对从服务器执行部分重同步操作;

如果offset偏移量之后的数据已经不存在于复制积压缓冲区,那么主服务器将对从服务器执行完整重同步操作。

服务器运行ID:

每个Redis服务器,不论主服务器还是从服务器,都会有自己的运行ID。运行ID在服务器启动时自动生成,有40个随机的十六进制字符组成;

实现部分重同步需要用到服务器运行ID;

当从服务器对主服务器进行初次复制时,主服务器会将自己的运行ID传送给从服务器,从服务器会将它保存起来;

当从服务器断线并重新连上一个主服务器时,从服务器将向当前连接的主服务器发送之前保存的运行ID;

如果从服务器保存的运行ID和当前连接的主服务器的运行ID相同,说明从服务器断线前复制的就是这个主服务器,主服务器可以继续尝试执行部分重同步操作;

相反,如果从服务器保存的运行ID和当前连接的主服务器的运行ID并不相同,说明从服务器断线前复制的不是该主服务器,此刻主服务器将对从服务器执行完整重同步操作。

新版复制功能 PSYNC 命令的实现:

PSYNC命令的调用方法有两种:

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

       相反的,如果从服务器已经复制过某个主服务器,那么从服务器在开始一次新的复制时将向主服务器发送 PSYNC <runid><offset>命令:其中runid是上一次复制的主服务器的运行ID,而offset则是从服务器当前的复制偏移量,接收到这个命令的主服务器会通过这个两个参数来判断应该对从服务器执行哪种同步操作。

接收到PSYNC命令的主服务器会向从服务器返回以下三种回复的其中一种:

       如果主服务器返回 +FULLRESYNC <runid> <offset>回复,那么表示主服务器将与从服务器执行完整重同步操作:其中runid是这个主服务器的运行ID,从服务器会将这个ID保存起来,在下一次发送PSYNC命令时使用;而offset则是主服务器当前的复制偏移量,从服务器会将这个值当作自己的初始化偏移量。

       如果主服务器返回 +CONTINUE回复,那么表示主服务器将与从服务器执行部分重同步操作,从服务器只要等着主服务器将自己缺少的那部分数据发送过来就可以了。

       如果主服务器返回 -ERR回复,那么表示主服务器的版本低于Redis 2.8,它识别不了PSYNC命令,从服务器将向主服务器发送SYNC命令,并与主服务器执行完整同步操作。

复制的实现

通过向从服务器发送SLAVEOF命令,可以让一个从服务器去复制一个主服务器。下面是复制功能的详细实现步骤(Redis2.8或以上版本):

  1. 设置主服务器的地址和端口;(从服务器将客户端给定的主服务器IP地址和端口保存起来)

  2. 建立套接字连接;(从服务器创建连向主服务器的套接字连接)

  3. 发送PING命令;(从向主发送PING命令,检查套接连接的状态)

  4. 身份验证;(从向主发送AUTH命令,只有设置了才需要进行身份验证)

  5. 发送端口信息;(从向主发送从的监听端口号,主会保存该端口号)

  6. 同步;(从向主发送PSYNC命令,执行同步操作)

  7. 命令传播;(主一直将自己执行的写命令发送给从,从则执行,保存数据一致)

Redis-Redis 高级数据结构 HyperLogLog与事务 如果这样的页面很多,那 所需要的存储空间是惊人的。为这样一个去重功能就耗费这样多的存储空间,值 得么?该实现一个明显的问题是内存占用过多,所有从库的连接在主库上是独立的,同样举抛硬币的例子,如果只有一组抛硬币实验,显然根据公式推导得到的。那么基于上面的估算结论,我们可以通过多次抛硬币实验的最大抛到正面的。大家应该对事务比较了解,简单地说,事务表示一组动作,要么全部执行,但是,如果你的页面访问量非常大,比如一个爆款页面几千万的 UV。列中的未执行命令,并不会回滚已经操作过的数据,这一点要和关系型数据库的。 阅读详情

相关推荐

开源onlyoffice编译完整过坑版

onlyoffice 编译过坑完整版;

sHImart 4551

每天一个linux命令(37):date命令

在linux环境中,不管是编程还是其他维护,时间是必不可少的,也经常会用到时间的运算,熟练运用date命令来表示自己想要表示的时间,肯定可以给自己的工作带来诸多方便。1.命令格式:  date [参数]... [+格式]2.命令功能:date 可以用来显示或设定系统的日期与时间。3.命令参数:必要参数:%H 小时(以00-23来表示)。 %I 小时(以01-12来表示)。 %K 小时(以0-23...

weixin_34148340的博客 754

采用LM324输出方波、正弦波、三角波

介绍以LM324运放芯片为核心,设计电路连接,实现三角波转化为正弦波,再由正弦波转化为方波输出的简易函数信号发生器的基本功能。本文介绍通过使用NI Multisim 14.0软件仿真模拟搭建所设计的电路,再使用这个软件的示波器进行仿真输出三角波,正弦波,方波。使用软件进行仿真后再到实验室进行调试,将其接入电源,并通过在显示器上观察波形以及数据,得到结果。该电路结构简单,信号的幅度、频率等参数可调,在仿真软件和实验室检测都有较好的性能输出,可替代实验室标准的函数信号发生器完成一般的实验要求。

qq_48771816的博客 7万+

redis从db0迁移数据至db1

从redis db0中迁移’employeeInfo_'为前缀的key到db1中,db0删除该key redis-cli -a redis123 -n 0 keys 'employeeInfo_*' | xargs -I '{}' redis-cli -a redis123 -n 0 move '{}' 1 redis-cli -n 0 keys ‘*’ 表示获取db0中所有的keys -a r...

ruoxiyun的博客 8370

深入解析Android14应用安装权限:从声明到授予的完整适配指南

本文深入解析Android14应用安装权限的适配方法,重点介绍了从权限声明到授予的完整流程。与Android13相比,Android14在权限管理机制上进行了重要调整,特别是通过AppOpsManager实现权限的对象化封装。文章详细讲解了权限声明的基础配置、Framework层适配方案、运行时权限授予方法以及常见问题排查指南,帮助开发者高效完成Android14权限适配。

o9p0q1的博客 693

国产系统迁移实战:在银河麒麟V10上搞定Wine32位支持,让老Windows软件跑起来

本文详细介绍了在银河麒麟V10操作系统上构建Wine32位支持的全过程,帮助用户解决Windows应用迁移难题。从系统架构差异分析到Wine环境配置,再到实战应用部署与优化,提供了一套完整的解决方案,确保老Windows软件在国产系统上稳定运行。

weixin_32288959的博客 648

redis 从一个库复制一个key到另外一个库

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34212189的博客 7109

避开PSRR仿真三大坑:用Cadence psspxf分析分频器时,这些设置错了白忙活

本文深入探讨了使用Cadence psspxf工具进行分频器PSRR仿真时常见的三大技术陷阱,包括扰动信号参数设置、收敛性优化和后处理信号提取。通过详细的参数推荐和实战技巧,帮助工程师避免仿真误差,提升PSRR分析效率与准确性,特别适用于16分频器等数字-模拟混合电路设计。

weixin_29258297的博客 300

这很难让人不爱!学习 Redis就从这里开始,一切从实战出发!

Redis是一个可以用来解决问题的工具,它既拥有其他数据库不具备的数据结构,又拥有内存存储(这使得Redis的速度非常快)、远程(这使得Redis可以与多个客户端和服务器进行连接)、持久化(这使得服务器可以在重启之后仍然保持重启之前的数据)和可扩展(通过主从复制和分片)等多个特性,这使得用户可以以熟悉的方式为各种不同的问题构建解决方案。

老男孩的架构路 156

Synopsys SCL许可证服务器搭建详解:从安装到生成.dat文件

本文详细解析了Synopsys SCL许可证服务器的完整搭建流程,从系统环境准备、SCL安装到生成.dat文件。重点阐述了如何正确获取HOST ID、配置License文件以及调试常见故障,为数字芯片设计工程师提供了一套从零到一的实战避坑指南,确保EDA工具链稳定运行。

weixin_29306011的博客 609

osgearth添加经纬度网格,并显示鼠标所指经纬高度信息

一、代码 osgearth官方例子 #include <osg/Notify> #include <osgGA/StateSetManipulator> #include <osgViewer/Viewer> #include <osgViewer/ViewerEventHandlers> #include <osgEarth/MapNode> #include <osgEarthUtil/EarthManipulator> #

ljjjjjjjjjjj的博客 3564

Redis高级之——Redis的主从复制

主从复制 互联网 “三高” 架构 高并发 高性能 高可用 举个例子:1月1日搭建redis平台 1月10号的时候服务器宕机4小时27分15秒 2月21日服务器宕机11分36秒 5月20日服务器宕机2分16秒 总宕机时间为:4小时27分15秒+11分36秒+2分16秒=866467秒 1年=365* 24 *60 *60 = 31536000秒 可用性为(31536000-866467)/ 31536000 = 97.252% 业界可用性目标五个9 即99.999%,即服务器宕机总时长低于315秒,约

weixin_45417821的博客 393

AUTOSAR从入门到精通-汽车电子电气架构(EEA)(二)

需求的传递并非完全是瀑布式的单向传递,而是双向的,只有被下游接受了的需求才是有效的需求,而且,下游是可以反向对上游提出需求的。当街区的设计完成之后,接下来要做的就是每栋建筑的详细设计,建筑的设计者发布的图纸中规定了房屋的主要结构、所在位置与周边环境的相互关系,以及屋中各种组件的位置与相互之间结合的关系,比如砖混结构、房屋的具体位置和朝向、卧室与客厅的相对位置与尺寸、马桶在卫生间中的位置等,还会对各种建筑材料的选取原则给出具体的标准,比如水泥的标号,钢筋的型号,各种电线的等级要求等等。

getusushu的博客 372

redis相关原理及面试官由浅到深必问的15大问题(高级)

0.redis是什么?redis是nosql(也是个巨大的map) 单线程,但是可处理1秒10w的并发(数据都在内存中)使用java对redis进行操作类似jdbc接口标准对mysql,有各类实现他的实现类,我们常用的是druid其中对redis,我们通常用Jedis(也为我们提供了连接池JedisPool)在redis中,key就是byte[](stri...

Java进阶架构师 6万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Redis高级命令、安全性、主从复制

1.操作redis的key的命令 命令 描述 del key 删除key exists key 检查key是否存在 expire key 秒 设置key过期时间,单位秒 persist key 移除key的过期时间,key将永久保存 ttl key 返回key的剩余过期时间,单位秒。永久保存返回-1 keys |pattern 查找所有符合条件的key。可以模糊匹配如,? move key db 将当前数据库的key移动到指定的数据库中 rename key newkey 修改key的名称 type key

weixin_53707040的博客 376

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

redis主从复制,redis哨兵,redis集群

虽然Redis可以实现单机的数据持久化,但无论是RDB也好或者AOF也好,都解决不了单点宕机问题,即 一旦单台redis服务器本身出现系统故障、硬件故障等问题后,就会直接造成数据的丢失,因此需要使用 另外的技术来解决单点问题。Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。

d1906989080的博客 1152

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Redis之高级命令、主从复制、哨兵

一、redis高级命令    1、keys * :返回满足的所有键(可以模糊匹配);    2、exists:是否存在指定的key;    3、expire:设置某个key的过期时间,使用ttl 【key】查看剩余时间;(expire key 【时间】:时间以秒为单位)    4、persist:取消过期时间;(persist key)    5、select:选择数据库 数据库为0到15(一个1...

IT_10000 360

三、Redis的高级命令及高级应用

Redis的高级命令及高级应用

彭天虎 677

Redis高级-删除策略、主从复制、哨兵模式

当新数据进入redis时,如果内存不足怎么办?在执行每一个命令前,会调用检测内存是否充足。如果内存不满足新 加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。清理数据的策略称为逐出算法。注意:逐出数据的过程不是100%能够清理出足够的可使用的内存空间,如果不成功则反复执行。当对所有数据尝试完毕, 如不能达到内存清理的要求,将出现错误信息策略配置影响数据淘汰的相关配置如下:1:最大可使用内存,即占用物理内存的比例,默认值为0,表示不限制。

weixin_61611746的博客 1391

Redis高级

redis高级篇

xiao-啸 618

Redis学习之高级应用

Redis高级应用 1、安全性 设置客户端连接后进行任何其他指令前需要使用密码 注意:因为redis速度非常快,所以在一台比较好的服务器下,一个外部的用户可以在1秒钟进行15万次的密码尝试,这意味着需要指定非常强大的密码来防止暴力破解 修改配置文件如下选项:requirepass 密码授权方式: ①在输入操作命令之前授权auth 密码②在使用客户端谅解时直接授权 ./redis-cl

qq_23049329的博客 513

Redis详解

现在是大数据时代(一般的数据库已经解决不了的数据:大数据(海量存储和并行计算))1、单机时代(如MySQL)的瓶颈数据量太大,一个机器存不下数据的索引(MySQL单表300万条数据,一定要建立索引),一个机器内存放不下访问量大(MySQL读写混合 — 性能降低),一个服务器承受不了2、Memcached缓存(减轻服务器的压力) + MySQL + 垂直拆分(读写分离,多个MySQL服务器,有的值负责读,有的值负责写)

jiuyebaqi的博客 2万+

Redis高级-主从复制相关操作

Redis高级-主从复制相关操作

qq_40432598的博客 497

深度剖析Redis:从基础到高级应用

通过本篇博客的深度剖析,我们全面了解了Redis的基础知识、主从复制、高级应用场景以及性能优化技巧。Redis作为一款高性能的内存数据库,其丰富的功能和灵活的应用场景使得它在分布式系统中有着重要的地位。希望读者通过这篇博客,能够更深入地理解Redis。朋友,不要忘了开心!

喔的嘛呀的博客 1360

redis 将一个key的值复制到另一个key

Redis中键值复制的深入解析 Redis 是一个开源的高级键值数据库,具有高性能和灵活性广泛应用于缓存、会话存储和实时分析等多种场景。本文将探讨如何将一个键的值复制到另一个键,并提供相关的代码示例。在开始之前,我们先了解一下Redis的基本概念和数据结构。 什么是Redis? Redis(Remote Dictionar...

weixin_41983580的博客 1453

Redis高级使用

Redis高级使用

weixin_44454180的博客 1680
上一篇: 唯品会Redis cluster大规模生产实践
下一篇: 16.Redis心跳检测
架构师的清醒
博客等级 码龄14年 291粉丝 397原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值