Redis中的复制功能(一)

news2024/11/25 0:35:50

复制

概述

在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),如图所示。
在这里插入图片描述

例子

举个例子。假设现在有两个Redis服务器,地址分别为127.0.0.1:6379和127.0.0.1:12345,如果我们向服务器127.0.0.1:12345发送以下命令:

127.0.0.1:12345> SLAVEOF 127.0.0.1 6379
OK

那么服务器127.0.0.1:12345将称为127.0.0.1:6379的从服务器,而服务器6379则会称为12345的主服务器。进行复制中的主从服务器双方的数据库将保存相同的数据,概念上将这种现象乘坐为"数据库状态一致",或者
简称"一致"。比如说,在主服务器上执行以下命令:

127.0.0.1:6379> SET msg "hello world"
OK

那么我们应该既可以在主服务器上获取msg键的值:

127.0.0.1:6379> GET msg
"hello world"

又可以在从服务器上获取msg键的值:

127.0.0.1:12345> GET msg
"hello world"

另一方面,如果我们在主服务器中删除了键msg:

127.0.0.1:6379> DEL msg
(integer) 1

那么不仅主服务器上的msg键会被删除

127.0.0.1:6379> EXISTS msg
(integer) 0

从服务器上的msg键也应该会被删除:

127.0.0.1:12345> EXISTS msg
(integer) 0

旧版复制功能的实现

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

  • 1.同步操作用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态
  • 2.命令传播则用于在主服务器的数据库状态被修改,导致主从服务器的数据库状态出现不一致时,让主从服务器的数据库重新回到一致性

同步

当客户端向从服务器发送SLAVEOF命令,要求从服务器复制主服务器时,从服务器首先需要执行同步操作,也即是,将从服务器的数据库状态更新至主服务器当前所处的数据库状态。从服务器对主服务器的同步操作需要通过向主服务器发送SYNC命令来完成,以下是SYNC命令的
执行步骤:

  • 1.从服务器向主服务器发送SYNC命令
  • 2.收到SYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令
  • 3.当主服务器的BGSAVE命令执行完毕时,主服务器会将BGSAVE命令生成的RDB文件发送给从服务器,从服务器接收并载入这个RDB文件,将自己的数据库状态更新至主服务器执行BGSAVE命令时的数据库状态
  • 4.主服务器将记录在缓冲区里面的所有写ing零发送给从服务器,从服务器执行这些写命令,将自己的数据库状态更新至主服务器数据库当前所处的状态
    在这里插入图片描述
例子

在这里插入图片描述

命令传播

在同步操作执行完毕之后,主从服务器两者的数据库将达到一致状态,但这种一致并不是一成不变的,每当主服务器执行客户端发送的写命令时,主服务器的数据库就有可能会被修改,并导致主从服务器状态不再一致。

例子

举个例子,假设一个主服务器和一个从服务器刚刚完成同步操作,它们的数据库都保存了相同的五个键k1至k5,如图所示,如果这是,客户端向主服务器发送命令DEL k3,那么主服务器在执行完这个DEL命令之后,主从服务器的数据库将出现不一致:主服务器的数据库已经不再包含键
k3,但这个键却仍然包含在从服务器的数据库里面,如图所示.
在这里插入图片描述

在这里插入图片描述

为了让主从服务器再次回到一致状态,主服务器需要对从服务器执行命令传播操作:主服务器会将自己执行的写命令,也即是造成主从服务器不一致的那条写命令,发送给从服务器执行,当从服务器执行了相同的写命令之后,主从服务器将再次回到y一致状态。
在这里插入图片描述

在上面的例子中,主服务器因为执行了命令DEL k3而导致主从服务器不一致,所以主服务器将向从服务器发送相同的命令DEL k3。当从服务器执行完这个命令之后,主从服务器将再次回到一致状态,现在主从服务器两者的数据库都不再包含键k3

旧版复制功能的缺陷

在Redis2.8以前,从服务器对主服务器的复制可以分为以下两种情况:

  • 1.初次复制:从服务器以前没有复制过任何主服务器,或者从服务器当前要复制的主服务器和上一次复制的主服务器不同.
  • 2.断线后重复制:处于命令传播阶段的主从服务器因为网络原因而中断了复制,但从服务器通过自动重连接重新连上了主服务器,并继续复制主服务器。对于初次复制来说,旧版复制功能能够很好地完成任务,但对于断线后重复制来说,旧版复制功能虽然也能让主服务器重新回到一致状态,但效率却非常低。

例子

在这里插入图片描述

举个例子。在时间10091,从服务器终于重新连接上主服务器,因为这是主从服务器的状态已经不再一致,所以从服务器将向主服务器发送SYNC命令,而主服务器会将包含键k1至键k10089的RDB文件发送给从服务器,从服务器通过接收和载入这个RDB文件来将自己的数据库更新至主服务器数据库当前所处的状态。

虽然再次发送SYNC命令可以让主从服务器重新回到一致状态,但如果仔细研究过这个断线重复制过程,就会发现传送RDB文件这一步实际上并不是非做不可的:

  • 1.主从服务器在时间T0至T10086中一致处于一致状态,这连个服务器保存的数据大部分都是相同的。
  • 2.从服务器想要将自己更新至主服务器当前所处的状态,真正需要的是主从服务器连接中断期间,主服务器新添加的k10086/k10088/k10089三个键的数据
  • 3.可惜的是,旧版复制功能并没有利用以上列举的两点条件,而是继续让主服务器生成并向从服务器发送包含键k1至键k10089的RDB文件,但实际上RDB文件包含的键1至键k10086的数据对于从服务器来说都是不必要的。在主从服务器断线期间,主服务器执行的写命令可能会有成百上千之多,而不仅仅是两三个写命令。但总的来说,主从服务器断开的时间
    越短,主服务器在断线期间执行的写命令就越少,而执行少量写命令所产生的数据量通常比整个数据库的数据量要少的多,在这种情况下,为了让从服务器不足一小部分缺失的数据,却要让主从服务器重新再执行一次SYNC命令,这种做法无疑是非常低效的。
注意

SYNC命令是一个非常耗费资源的操作。每次执行SYNC命令主从服务器需要执行以下动作:

  • 1.主服务器需要执行BGSAVE命令来生成RDB文件,这个生成操作会耗费主服务器大量的CPU、内存和磁盘IO资源
  • 2.主服务器需要将自己生成的RDB文件发送给从服务器,这个发送操作会耗费主从服务器大量的网络资源(带宽和流量),并对主服务器相应命令请求的时间产生影响
  • 3.接收到RDB文件的从服务器需要载入主服务器发来的RDB文件,并且在载入期间,从服务器会因为阻塞而么没办法处理命令请求。
    因为SYNC命令是一个如此耗费资源的操作,所以Redis有必要保证在真正有需要时才执行SYNC命令

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1561752.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【御控物联】JavaScript JSON结构转换(8):数组To数组——多层属性重组

文章目录 一、JSON结构转换是什么?二、案例之《JSON数组 To JSON数组》三、代码实现四、在线转换工具五、技术资料 一、JSON结构转换是什么? JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换,生成新的JS…

win10企业评估版转正式版

一、winr 输入 C:\Windows\System32\spp\tokens\skus 二、下载 Windows 10 Enterprise LTSC 2021 的 SKU 蓝奏云地址 https://wwl.lanzoue.com/irkKV1th7s0d 下载好后解压 解压密码:www.cnkker.com 解压好后全部复制到 C:\Windows\System32\spp\tokens\skus 目录…

安装和使用Miniconda来管理Python环境

安装和使用Miniconda来管理Python环境 一、Miniconda简介二、Miniconda的安装 1. 下载2. 安装三、Miniconda的配置四、Miniconda的使用 1. Conda相关2. 环境管理3. 包管理 一、Miniconda简介 Miniconda是一个免费的最小化Python环境管理工具(精简版Anaconda),只包…

多图详细教你注册Google(Gmail)新账号,常见问题和注意事项

对于做外贸,或者需要和外国客户、朋友沟通的小伙伴来说,一个Google账号(也就是Gmail账号,下述统一用Google账号来表述)是非常必要的,一方面是通过Gmail邮箱收发邮件、沟通往来,另一个方面是很多…

redis集群配置(精华版):分片集群模式

分片集群模式 概念动手实操1、环境准备2、配置文件配置3、启动所有redis4、创建集群5、测试集群读/写 概念 ​ Redis 分片集群是一种用于横向扩展 Redis 数据库的方法,它将数据分散存储在多个 Redis 节点中,从而提高了系统的吞吐量和容量。在 Redis 分片…

报错:AttributeError: module ‘numpy‘ has no attribute ‘unit8‘解决

错误问题: 解决方法: 哥们姐们仔细一点吧这个unit8是打错了,无非就是uint8写成了unit8 应该是【uint8】,以后敲代码仔细点哦

Google Chrome将某个页签静音,不是网站

Google Chrome将某个页签静音,不是网站 打开chrome://flags/在里面搜索,audio,找到Tab audio muting UI contorl的选项,右侧设置为Enable。重新启动浏览器。 发现有声音的浏览器页签有一个喇叭图标,点击一下就行了。

It takes two (搜索)

本题链接:登录—专业IT笔试面试备考平台_牛客网 题目: 样例: 输入 3 4 AAAO AAAA AAAA 输出 NO 思路: 根据题目意思,如果存在的 A 联通不可以成为 矩形,输出 NO,否则输出 YES 这道题看数据范…

java线程(一)--进程,多线程,synchronized和lock锁,JUC,JUnit

Java线程入门 单核CPU和多核CPU的理解 单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务。例如:虽然有多车道,但是收费站只有一个工作人员在收费,只有收了费才能通过&#xf…

hive之full outer join(全连接)使用

文章目录 前言语法 :总结 前言 full outer join结合了 LEFT JOIN 和 RIGHT JOIN 的结果,并使用NULL值作为两侧缺失匹配结果。 语法 : SELECT table1.column_name(s),table2.column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name table2.c…

【YOLO 系列】基于YOLO V8的高速公路摄像头车辆检测识别系统【python源码+Pyqt5界面+数据集+训练代码】

摘要: 基于YOLO V8的高精度高速公路摄像头车辆检测识别系统可用于公路上车辆的识别检测与定位,利用YOLO V8算法可实现图片、视频、摄像头等方式对不同车辆进行目标检测识别,另外支持结果可视化与检测结果的导出。本系统采用YOLO V8目标检测模…

BM25 二叉树的后序遍历(postOrder()返回值用void)

import java.util.*;/** public class TreeNode {* int val 0;* TreeNode left null;* TreeNode right null;* public TreeNode(int val) {* this.val val;* }* }*/public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改&a…

软件测试-进阶篇

目录 测试的分类1 按测试对象划分1.1 界面测试1.2 可靠性测试1.3 容错性测试1.4 文档测试1.5 兼容性测试1.6 易用性测试1.7 安装卸载测试1.8 安装测试1.9 性能测试1.10 内存泄漏测试 2 按是否查看代码划分2.1 黑盒测试(Black-box Testing)2.2 白盒测试&a…

使用ssh免密登录服务器

最近写一些shell脚本的时候,需要读取远程服务器的目录下的内容,不能在脚本中直接使用密码,所以就想到了使用免密的方式进行读取。 一、虚拟机环境 下面是我安装的虚拟机网络配置 虚拟机编号 IP地址 子网掩码 账号 100 192.168.164.100…

每天学点儿Python(3) -- for循环

for循环结构格式如下 for 循环变量 in 遍历对象:语句块 举例一、 for i in "Hello"print(i) 执行结果如下 举例二、 #打印100-999之间的水仙花数 #注意:Python中 / 除法,运输后为浮点数, // 为取除法后的整数,而不是C/C中的注释…

使用VM搭建Linux服务器局域网

最近在了解一些LAN相关的内容,抱着学习的心态就使用了VM安装Linux虚拟机进行组建LAN(局域网)的测试。 一、虚拟机网络规划 下面是我安装的虚拟机网络配置 虚拟机编号 IP地址 子网掩码 网络连接 1 192.168.164.100 255.255.255.0 NAT…

python实现泊松回归

1 什么是基于计数的数据? 基于计数的数据包含以特定速率发生的事件。发生率可能会随着时间的推移或从一次观察到下一次观察而发生变化。以下是基于计数的数据的一些示例: 每小时穿过十字路口的车辆数量每月去看医生的人数每月发现的类地行星数量 计数数…

RabbitMQ Tutorial

参考API : Overview (RabbitMQ Java Client 5.20.0 API) 参考文档: RabbitMQ: One broker to queue them all | RabbitMQ 目录 结构 Hello World consumer producer 创建连接API解析 创建连接工厂 生产者生产消息 消费者消费消息 队列声明 工作队列Work Queues 公平…

1033 To Fill or Not to Fill

是否有能到达的站点 无,输出当前距离(最后一个到达站点距离满油箱状态下行走距离)有 有价格更低的站点 如果油量不足以到达新站点,加刚好到达该站点的油量(只加可到达范围内最便宜的油)有价格更高的站点 在…

【带你了解下前端开发语言有那些】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…