Redis新旧复制
在Redis中,用户可以通过执行SALVEOF命令,让一个服务器去复制另一个服务器。
127.0.0.1:12345> SLAVEOF 127.0.0.1 6379
OK
- 6379的奴隶是12345。
旧版复制功能实现
Redis的复制功能分为同步(sync)和命令传播两个操作:
- 同步:将从服务器更新为主服务器的状态。
- 命令传播:在主服务器状态被修改,导致主从状态不一致,让主从回到一致状态。
同步
客户端向服务器发送SYNC命令,SYNC步骤:
- 从 -> 主 发送SYNC。
- 主 执行BGSAVE命令,后台生成RDB,并且使用缓冲区记录 从 现在开始执行的所有写命令。
- RDB生成完毕时,发送给 从,从 载入这个RDB,更新至 主 执行BGSAVE时的数据库状态。
- 主 将缓冲区的写命令发给 从,从 更新至 主 当前的状态。
命令传播
在同步执行完毕之后,主从达到一致状态,但是当 主 执行客户端的命令时,主从再次不一致。
为了让主从再次回到一致状态,主 需要对 从 执行命令传播操作:主 会将自己执行的写命令发送给 从 ,这样就回
到主从一致了(迫真)。
旧版复制的缺陷
对于第一次复制来说旧版是可以的,但是对于断线后重连效率是很低的,因为,断线重连的服务器保存的数据大部
分是相同的,发送SYNC命令传送RDB文件并不是非做不可的!
SYNC命令是一个非常耗费资源的操作。
新版复制功能的实现
为了解决旧版的问题,Redis从2.8开始,使用PSYNC代替SYNC。
PSYNC有完整重同步和部分重同步2个命令:
完整重同步:与同步命令是一样的。
部分重同步:如果条件允许,主 可以将主从服务器连接断开期间执行的写命令发送给 从。
部分重同步的实现
部分重同步由以下三个部分构成:
主服务器的复制偏移量(replication offset)和从服务器的复制偏移量。
主服务器的复制积压缓冲区(replication backlog)。
服务器的运行ID(run ID)。
复制偏移量

A断线后,从服务器向主服务器发送PSYNC,报告A的offset为10086。
复制积压缓冲区
缓冲区由主服务区维护的固定长度先进先出(fixed-size FIFO)队列,默认大小为1MB。
当主服务器进行命令传播时,不仅会将命令发送给从服务器,还会将写命令入队到缓冲区中。
因此,主服务器的缓冲区保存着最近传播的写命令,并且记录了每个字节的偏移量。
当从服务器重新连上主服务器,从服务器发送自己的offset,主服务器根据这个offset决定执行何种操作:
- 如果offset之后的数据仍然存在于缓冲区里,那么主服务器将对从服务器执行部分重同步。
- 相反如果不存在于缓冲区里,那么执行完整重同步。
根据需要调整复制积压缓冲区大小
最小大小计算公式:second * write_size_per_second
second为从服务器重新连上主服务器的平均时间。
write_size_per_second是主服务器平均每秒产生的写命令数据量。
服务器运行ID
每个服务器运行后会自动生成40个随机十六进制字符的ID。
主 和 从 初次复制时,主 会将自己的ID给 从。
当从服务器断线并重新连上主服务器时,从服务器会发送之前保存的ID给 主,如果一致就可以部分重同步。
复制的实现
设置主服务器的地址和端口
建立套接字连接
发送PING
身份验证
发送端口信息
同步
值得一提的是,在同步之前,只有 从 是 主 的客户端,同步之后,主 也是 从 的客户端。主从服务器双方都是对方
的客户端,他们才可以互相发送命令,主 才可以发送写命令改变 从 的数据库状态。
- 命令传播
Reference
《Redis设计与实现》
Redis新旧复制的更多相关文章
- redis 系列21 复制Replication (上)
一. 概述 使用和配置主从复制非常简单,每次当 slave 和 master 之间的连接断开时, slave 会自动重连到 master 上,并且无论这期间 master 发生了什么, slave ...
- Redis持久化及复制
一.持久化的两种方式 1.RDB: RDB是在指定时间间隔内生成数据集的时间点快照(point-in-time snapshot)持久化,它是记录一段时间内的操作,一段时间内操作超过多少次就持久化.默 ...
- Redis实现之复制(二)
PSYNC命令的实现 在Redis实现之复制(一)这一章中,我们介绍了PSYNC命令和它的工作机制,但一直没有说明PSYNC命令的参数以及返回值.现在,我们了解了运行ID.复制偏移量.复制积压缓冲区以 ...
- ca33a_demo_c++_新旧代码的兼容char数组与vector_string相互转换
/*ca33a_demo_c++33_CppPrimer_新旧代码的兼容_txwtech旧代码:数组和c风格字符串新代码:vector和string相互转换:c风格字符串<- ->stri ...
- Android新旧版本Notification
Android新旧版本Notification 在notification.setLatestEventInfo() 过时了 以前: NotificationManager mn = (Notific ...
- Matlab神经网络函数newff()新旧用法差异
摘要 在Matlab R2010a版中,如果要创建一个具有两个隐含层.且神经元数分别为5.3的前向BP网络,使用旧的语法可以这样写: net1 = newff(minmax(P), [5 3 1]); ...
- [ACM_数学] Taxi Fare [新旧出租车费差 水 分段函数]
Description Last September, Hangzhou raised the taxi fares. The original flag-down fare in Hangzhou ...
- Flex布局新旧混合写法详解(兼容微信)
原文链接:https://www.usblog.cc/blog/post/justzhl/Flex布局新旧混合写法详解(兼容微信) flex是个非常好用的属性,如果说有什么可以完全代替 float 和 ...
- 浅谈 angular新旧版本问题
一直在学习angularJs,之前用的版本比较老,前些天更新了一下angularJs的版本,然后发现了一些问题,希望和大家分享一下. 在老的版本里控制器直接用函数定义就可以 比如: 在angularJ ...
随机推荐
- WPF 饼状图,柱形图,折线图 (1 柱形图)
WPF三贱客绘制,柱形图应该是比较简单的一个了.效果如下: ItemSource数据结构可自己定义,我的如下列子,自定义的数据结构属性,要对应配置下DisplayMemberMsg 和DisplayM ...
- 华为oj-判断输入的字符串是不是一个有效的IP地址
题目标题: 判断输入的字符串是不是一个有效的IP地址 详细描述: 请实现如下接口 boolisIPAddressValid(constchar* pszIPAddr) 输入:pszIPAddr 字符串 ...
- mybaits源码分析(一)
一.源码下载 1.手动编译源码 为了方便在看源码的过程中能够方便的添加注释,可以从官网下载源码编译生成对应的Jar包,然后上传到本地maven仓库,再引用这个Jar. 首先需要编译打包parent项目 ...
- Win10安装gcc
使用MinGW安装gcc 1.下载MinGW,地址 https://sourceforge.net/projects/mingw/files/ ,选择Download mingw-get-setup. ...
- mysql各个版本驱动jar包下载 mysql/mysql-connector-java/5.1.22
想下个jar csdn上全是要积分下载,这里记录下 下载地址,免得到时又要找 http://central.maven.org/maven2/mysql/mysql-connector-java/
- tomcat配置启动不了
关于ideatomcat配置问题 1.第一步配置tomcat启动器 2.配置启动的网址 3.配置启动器的启动 ---更多java学习,请见本人小博客:https://zhangjzm.gitee.io ...
- appium+python运行自动化测试提示“find_element() takes from 1 to 3 positional arguments but 14 were given”错误
1.运行后提示"find_element() takes from 1 to 3 positional arguments but 14 were given",在网上找了很多解决 ...
- Kubernetes的安装部署
前言:简述kubernetes(k8s)集群 k8s集群基本功能组件由master和node组成. master节点上主要有kube-apiserver.kube-scheduler.kube-con ...
- MySQL——MySQL多实例
一台服务器上运行多个MySQL服务,不同的业务 多实例思路: 1. 多套配置文件 2. 多套数据 3. 多个socket 4. 多个端口 5. 多个日志文件 6. 多个启动程序
- Python - 面向对象编程 - 实战(6)
需求 设计一个培训机构管理系统,有总部.分校,有学员.老师.员工,实现具体如下需求: 有多个课程,课程要有定价 有多个班级,班级跟课程有关联 有多个学生,学生报名班级,交这个班级对应的课程的费用 有多 ...