复制

复制的难点在同步阶段,让我们先了解同步的实现:

1.同步的实现

概念:让从服务器的状态更新到与主服务器一致。

旧版的同步实现

旧版的同步操作是通过SYNC命令来完成的,执行步骤为:
- 从服务器向主服务器发送SYNC命令。
- 主服务器收到SYNC命令之后,主服务器会执行BGSAVE命令,然后在后台生成一个RDB持久化文件,并用一个重写缓存区记录从现在开始的所有写命令。
- 当主服务器的BGSAVE命令执行完之后,主服务器会将BGSAVE命令生成的RDB文件发送给从服务器,从服务器会接收并载入这个RDB文件,将自己的数据库更新至主服务器执行BGSAVE命令时的数据库状态,将自己的数据库更新至主服务器执行BGSAVE命令这一刻的状态。
- 主服务把重写缓存器的写命令发送给从服务器,让从服务器恢复到主服务的最新状态。

缺陷:同步分成两种情况,初次复制和断线后复制,如果是初次复制,用RDB文件复制的方法没有什么问题,但如果是断线复制的情况,主服务器和从服务器的数据相差无几,如果也执行RDB文件恢复未免代价也太大了!

新版的同步实现

为了解决断线复制方法的低效问题,Redis2.8用PSYNC命令代替了SYNC命令。

PSYNC有完整重同步和部分重同步的模式:
- 完整重同步解决的是初次复制的情况,用RDB持久化文件实现。
- 部分重同步解决的是断线后重复的情况,主服务器只需要把断线阶段的写命令发送给从服务器即可。

首先了解几个概念:
- 复制偏移量:主从服务器都会维护复制偏移量,记录当前的数据长度。
- 复制挤压缓存区:固定长度的先进先出的队列,记录主服务器的最新写命令。
- 服务器运行id:相当服务器的编号,主服务器在初次复制时会把自己的id发送给从服务器。

部分重同步的实现:

首先从服务器发送自己的复制偏移量给主服务,主服务器把这个复制偏移量与自身的复制偏移量对比,然后查看自己的复制挤压缓存中是否还保留着这部分数据,如果保留着,那么只需要把这个部分的数据发送给从服务器就行,否则执行完全重同步。

2.复制的实现

步骤一:设置主服务器的地址和端口

当客户端向从服务器发送以下命令时:

SLAVEOF 127.0.0.1 6379

从服务器会把这个主服务器的ip和端口保存起来:

struct redisServer{//主服务器地址char *masterhost;//主服务器端口int masterport;
}

步骤二:建立套接字连接

从服务器根据自己设置的IP地址和端口,来创建连接主服务器的套接字。

步骤三:发送ping命令

创建完套接字之后,从服务器发送一个ping命令给主服务器,为了检查主服务器是否能正常处理命令 和 检查他的读写状态是否正常。

发送命令之后会遇到三种情况:

  1. 如果超过时限,那么表示主从服务器连接状态不稳定,这个时候从服务器断开并重新创建连向主服务器的套接字。
  2. 如果主服务器向从服务器返回一个错误,表示从服务器暂时无法处理从服务器的请求,这种情况从服务器断开并重新创建连向主服务器的套接字。
  3. 如果从服务器收到PONG回复,表示主服务器连接正常,可以进行下一个步骤。

步骤四:身份验证

从服务器收到PONG回复之后,下一步就是决定是否进行身份验证。

负责验证身份的从服务器是masterauth选项,主服务器是requirepass选项。身份验证有三种情况:

  1. 主服务器没有设置requirepass选项,并且从服务器也没有设置masterauth选项,那么不需要验证。
  2. 主服务器设置requirepass选项,并且从服务器设置masterauth选项,如果从服务器发送的密码与主服务器设置的相同,那么通过。
  3. 如果主服务器设置了requirepass,从服务器却没有设置masterauth选项,那么主服务器将返回一个NOAUTH错误。
  4. 如果主服务器没有设置requirepass选项,从服务器却设置了masterauth选项,那么主服务器将返回一个no password is set 错误。

步骤五:发送端口信息

从服务器向主服务器发送从服务器的监听端口号。

typedef struct redisClient{//从服务器的监听端口号int slave_listening_port;
}

步骤六:同步

从服务器将向主服务器发送PSYNC命令执行同步操作,把自己的数据库更新到主服务器数据库当前所处的状态。

步骤六:命令传播

当完成了同步之后,主从服务器就会进入命令传播阶段,这时主服务器只要一直将自己执行的写命令发送给从服务器,而从服务器只要一直接收并执行主服务器发来的写命令,就可以保证主从服务器的一致性。

步骤七:心跳检测问题

在命令传播阶段,从服务器还会默认以每秒一次的频率,向主服务器发送心跳命令,来检测主从服务器的网络连接状态。

Redis学习之复制(三)相关推荐

  1. Redis——学习之路三(初识redis config配置)

    我们先看看config 默认情况下系统是怎么配置的.在命令行中输入 config get *(如图) 默认情况下有61配置信息,每一个命令占两行,第一行为配置名称信息,第二行为配置的具体信息. 我们就 ...

  2. Redis学习笔记(三)

    一.数据备份与恢复 数据备份: localhost:6379> save OK 该命令会在redis的安装目录中创建文件dump.rdb,并把数据保存在该文件中 查看redis的安装目录: lo ...

  3. Redis学习笔记(八)redis之lua脚本学习

    redis系列文章目录 使用spring-data-redis实现incr自增 Redis 利用Hash存储节约内存 Redis学习笔记(九)redis实现时时直播列表缓存,支持分页[热点数据存储] ...

  4. redis学习与入门~~~

    redis学习与入门~~~ 一. Redis 简介: 通常而言目前的数据库分类有几种,包括 SQL/NSQL,,关系数据库,键值数据库等等,分类的标准也不1,Redis本质上也是一种键值数据库的,但它 ...

  5. Redis学习总结(数据类型、持久化、事务、数据删除策略、主从复制、哨兵、缓存雪崩等)

    Redis学习总结 1.Redis是什么 1.概念 2.特点 3.应用场景 2.Linux环境安装redis 3.Redis的数据存储格式 1.String类型 1.String类型的常用操作 2.S ...

  6. Redis学习笔记1-理论篇

    目录 1,Redis 数据类型的底层结构 1.1,Redis 中的数据类型 1.2,全局哈希表 1.3,数据类型的底层结构 1.4,哈希冲突 1.5,rehash 操作 2,Redis 的 IO 模型 ...

  7. Redis学习笔记(B站狂神说)(自己总结方便复习)

    Redis学习笔记B站狂神说 redis: 非关系型数据库 一.NoSQL概述 1.为什么要用Nosql 1.单机Mysql的年代 思考一下,这种情况下:整个网站的瓶颈是什么? 1.数据量如果太大,一 ...

  8. 菜鸟的redis学习总结

    菜鸟的redis学习总结 说明 一.Nosql和Mysql 二.Nosql常见类型及比较 三.简介 四.入门系列 (1)性能测试 (2)String类型 (3)List类型 (4)Set集合 (5)H ...

  9. Redis学习 - NoSQL简介、redis安装、redis基础知识、数据类型、持久化、订阅发布、主从复制、哨兵模式、缓存击穿和雪崩

    学习视频地址:https://www.bilibili.com/video/BV1S54y1R7SB 完结撒花,感谢狂神 文章目录 1. NoSQL 1.1 单机Mysql的演进 1.2 当今企业架构 ...

最新文章

  1. [Object-C语言随笔之二] 《NSLog》常用的打印调试语句与自动排版
  2. json.dumps()和json.loads()
  3. Java Web 之Token+Cookie+Session
  4. 第5讲:软考中高项04_进度管理、成本管理
  5. python api接口调用_python 调用有道api接口的方法
  6. P3698 [CQOI2017]小Q的棋盘
  7. WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体
  8. win10系统无法自动修复启动解决方案
  9. artDialog--经典的网页对话框组件
  10. 激光测距传感器原理与应用介绍
  11. 逻辑回归分类——信用卡诈骗检测!这才是干货!
  12. CAD制图初学入门:CAD机械软件中如何构造孔?
  13. 你的生活布满了网络爬虫
  14. 未选择的路*弗罗斯特
  15. Debug 集子[更新中]
  16. Flask 教程 第十三章:国际化和本地化 1
  17. 【无人机】基于蒙特卡洛算法实现无人机任务分配模型附matlab代码
  18. 【CSS】通过定位修改 display 显示模式 ( Display 显示模式转换 | inline-block 改块元素为行内块元素示例 | 为块元素设置浮动 | 为块元素设置定位 )
  19. android 动态字幕,Android之如何用TextView实现滚动字幕的效果【跑马灯】
  20. Qt5对WinXP系统的支持和兼容情况,Qt发展史

热门文章

  1. 深入sql server中的事务
  2. OkHttp3中的代理与路由
  3. python中的Xpath方法总结
  4. Go channel 的妙用
  5. 递归反转链表的一部分
  6. 网络编程套接字(一)
  7. 【线上分享】短视频出海 — 用户体验衡量关键指标与优化策略
  8. 韩嫕:坚持coding
  9. 机器学习帮助WebRTC视频质量评价
  10. [ffmpeg] 解码API