分布式技术之数据复制技术

文章目录

    • 什么是数据复制技术?
    • 数据复制技术原理及应用
      • 同步复制技术原理及应用
      • 异步复制技术原理及应用
      • 半同步复制技术原理及应用
      • 三种数据复制技术对比

什么是数据复制技术?

  • 数据复制是一种实现数据备份的技术。数据复制技术,可以保证存储在不同节点上的同一份数据是一致的。这样当一个节点故障后,可以从其他存储该数据的节点获取数据,避免数据丢失,进而提高了系统的可靠性。
    • 比如,现在有节点 1 和节点 2,节点 1 上存储了 10M 用户数据,直观地说,数据复制技术就是将节点 1 上的这 10M 数据拷贝到节点 2 上,以使得节点 1 和节点 2 上存储了相同的数据,也就是节点 2 对节点 1 的数据进行了备份。当节点 1 出现故障后,可以通过获取节点 2 上的数据,实现分布式存储系统的自动容错。
  • 在分布式数据库系统中,通常会设置主备数据库,当主数据库出现故障时,备数据库可以替代主数据库进行后续的工作,从而保证业务的正常运行。这里,备数据库继续提供服务就是提高了分布式存储系统的可用性及可靠性。那么,在这个过程中,又是如何实现备数据库替代主数据库的呢?这,就涉及到数据一致性的问题了,即只有主备数据库中的数据保持一致时,才可实现主备的替换。因此,在这个例子中,数据复制技术实际就是指,如何让主备数据库保持数据一致的技术

在这里插入图片描述

数据复制技术原理及应用

  • CAP 理论的 C、A 和 P 三个特性:在分布式存储系统中,分区容错性是肯定要满足的,为此需要在一致性和可用性之间做出权衡。所以,对于数据的一致性,通常是指不同节点上数据要保持一致。要实现不同节点上的数据一致,数据复制技术必不可少。为此,对于分布式存储系统中的数据复制技术来讲,也需要在一致性和可用性之间做出一些权衡。因此,这就导致出现了多种数据复制技术方法,大体上有三类:
    • 第一类方法,比较注重一致性,比如同步复制技术;
    • 第二类方法,则更注重可用性,比如异步复制技术;
    • 第三类方法,是介于前两者之间的,比如半同步复制技术。

同步复制技术原理及应用

  • 同步复制技术是指,当用户请求更新数据时,主数据库必须要同步到备数据库之后才可给用户返回,即如果主数据库没有同步到备数据库,用户的更新操作会一直阻塞。这种方式保证了数据的强一致性,但牺牲了系统的可用性。

具体案例

  • 在一个分布式数据库系统中,有两个节点,分别作为主节点和备节点。通常情况下,两个节点均可接收用户读请求,然后将本节点的数据及时返回给用户,也就是说读请求响应比较快。而如果用户发送的是写请求,写操作必须由主节点进行,即使用户将写请求发送到备节点,备节点也会将该请求转发给主节点,因此写请求通常比读请求响应慢。MySQL 集群的读写分离就是一个典型实例
  • 如此设计的原因是,读请求不需要改变数据,只需要在更改数据时保证数据一致,就可以随时读;而写请求,因为要修改数据,如果每个节点均修改同一数据,则可能导致数据不一致。因此只有主节点可以进行写操作,但又要保证主节点和备节点的数据一致,这就是数据复制技术要发挥的作用了。
  • 对于上述场景,如果采用同步复制技术的话,对于写请求,主数据库会执行写操作,并将数据同步到所有备数据库之后才可以响应用户。如图所示,客户端向主数据库发起更新操作 V,将 X 设置为 2,主数据库会将写请求同步到备数据库,备数据库操作完后会通知主数据库同步成功,然后主数据库才会告诉客户端更新操作成功。MySQL 集群支持的全复制模式就采用了同步复制技术。
    在这里插入图片描述
  • 在同步复制技术中,主数据库需要等待所有备数据库均操作成功才可以响应用户,性能不是很好,会影响用户体验,因此,同步复制技术经常用于分布式数据库主备场景(对于一主多备场景,由于多个备节点均要更新成功后,主节点才响应用于,所需时延比较长)或对数据一致性有严格要求的场合,比如金融、交易之类的场景。

异步复制技术原理及应用

  • 异步复制技术是指,当用户请求更新数据时,主数据库处理完请求后可直接给用户响应,而不必等待备数据库完成同步,即备数据库会异步进行数据的同步,用户的更新操作不会因为备数据库未完成数据同步而导致阻塞。显然,这种方式保证了系统的可用性,但牺牲了数据的一致性。

具体案例

  • 如图所示,客户端 1 向主数据库发起更新操作 V,主数据库执行该操作,将 X=1 修改为 X=2,执行后直接返回给客户端 1 更新操作成功,而未将数据同步到备数据库。因此,当客户端 2 请求主数据库的数据 X 时,可以得到 X=2,但客户端 3 请求备数据库中的数据 X 时,却只能得到 X=1,从而导致请求结果不一致。
    在这里插入图片描述
  • 分布式数据库主备模式场景下,若对数据一致性要求不高,也可以采用异步复制方法。MySQL 集群默认的数据复制模式采用的是异步复制技术,以 MySQL 集群默认的复制模式为例,简单描述下主备数据库同步的流程吧。
    1. 主数据库完成写操作后,可直接给用户回复执行成功,将写操作写入 binary log 中,binary log 中记录着主数据库执行的所有更新操作,以便备数据库获取更新信息。
    2. 备数据库启动一个 IO 线程专门读取 binary log 中的内容然后写入 relay log 中。
    3. 备数据库启动一个 SQL 线程会定时检查 relay log 里的内容,如发现有新内容则会立即在备数据库中执行,从而实现数据的一致。
      在这里插入图片描述
  • 异步复制技术大多应用在对用户请求响应时延要求很高的场景,比如很多网站或 App 等需要面向实际用户,这时后台的数据库或缓存如果采用同步复制技术,可能会流失用户,因此这种场景采用异步复制技术就比较合适。除了 MySQL 集群,在缓存数据库 Redis 集群中,采用的也是异步复制技术,因此性能较高。但在 Redis 中还会有其他机制来保证数据的一致性。

半同步复制技术原理及应用

  • 同步复制技术会满足数据的强一致性,但会牺牲一定的可用性;异步复制技术会满足高可用,但一定程度上牺牲了数据的一致性。介于两者中间的是,半同步复制技术。半同步复制技术的核心是,用户发出写请求后,主数据库会执行写操作,并给备数据库发送同步请求,但主数据库不用等待所有备数据库回复数据同步成功便可响应用户,也就是说主数据库可以等待一部分备数据库同步完成后响应用户写操作执行成功。
  • 半同步复制技术通常有两种方式:
    • 一种是,当主数据库收到多个备数据库中的某一个回复数据同步成功后,便可给用户响应写操作完成;
    • 另一种是,主数据库等超过一半节点(包括主数据库)回复数据更新成功后,再给用户响应写操作成功。
  • 第二种半同步复制方案要求的一致性比第一种要高一些,但相对可用性会低一些。具有 CP 特性的 ZooKeeper 集群采用的数据复制技术就是第二种半同步复制方案。在 ZooKeeper 集群中,写请求必须由 Leader 节点进行处理,每次写请求 Leader 会征求其他 Follower 的同意,只有当多数节点同意后写操作才可成功,因此保证了较高的一致性。除此之外,还有很多系统采用了第二种半同步复制方案,比如微软云关系型数据库 Microsoft SQL Azure 的后端存储系统 Cloud SQL Server、Kubenetes 中保存集群所有网络配置和对象状态信息的 Etcd 组件等。
  • 多数的分布式存储系统可以通过配置来选择不同的数据复制技术。比如MySQL 数据库集群,就支持全同步复制、异步复制和半同步复制三种模式,再比如 Oracle 数据库,也提供了三种模式:
    • 最大保护模式,对于写请求,要求主数据库必须完成至少一个备数据库的数据同步才可成功返回给客户端,采用的是半同步复制技术中的第一种方式。
    • 最大性能模式,对于写请求,只要主数据库执行成功即可返回给客户端,采用的是异步复制技术。这种方式极大地提高了系统的可用性,但一致性难以保证。
    • 最大可用性模式,介于最大保护模式和最大性能模式两者之间。这种模式是指,系统在通常情况下采用最大保护模式,但当主备之间出现网络故障时,切换为最大性能模式,等到网络恢复后,备数据库再进行数据同步。这种方式在系统的一致性和可用性之间做了一个权衡。

三种数据复制技术对比

在这里插入图片描述

知识扩展:在半同步复制技术中,对于未回复数据更新结果的节点,如何解决数据不一致或冲突呢?
对于半同步复制技术,因为只有部分备节点更新数据后,主节点即可返回响应用户。那么,对于未回复数据更新结果的节点,如何解决可能存在的数据不一致或冲突呢?
对于这个问题,不同的场景有不同的处理方式,需要根据用户的需求进行选择,比如以最新数据为准、以最大数据为准等,没有统一的评判规则,和用户的需求紧密相关。由于在分布式系统中,很多系统采用了 Raft 算法,因此这里,以 Raft 算法的处理策略为例展开介绍,以便理解大部分常用的分布式系统的处理策略。
Raft 算法采用的是第二种半同步复制技术,也就是主数据库等超过一半节点(包括主数据库)回复数据更新成功后,再给用户响应写操作成功。当有 Follower 节点的数据与 Leader 节点数据不一致时,采用强制复制策略来解决不一致情况。
由于所有的数据更新操作最先在 Leader 节点执行,因此当产生冲突时,以 Leader 节点为准。Leader 节点上会对比与自己数据不一致的 Follower 节点所存储的信息,找到两者最后达成一致的地方,然后强制将这个地方之后的数据复制到该 Follower 节点上。
具体方法是,Leader 节点将每一次数据操作看作一条记录,并对这条记录标记一个 index,用于索引。Leader 节点会为每个 Follower 节点维护一个记录状态变量 nextIndex,即下一个记录的索引位置(nextIndex 的值为 Leader 节点当前存储数据记录的下一个 Index 值)。Leader 节点会将 nextIndex 发送给 Follower 节点,若 Follower 节点发现与本节点的 nextIndex 不一致,则告知 Leader 节点不一致,Leader 节点将 nextIndex 减 1,重复上述过程,直到与 Follower 节点的 nextIndex 相等位置,即找到了两者最后达成一致的地方。
比如,对于变量 X,Leader 节点记录的操作是{(Index 1, X = 1, Version:0), (Index 2, X=2, Version:1), (Index3 , X=3, Version:2)},其中,Follower 节点 2 记录的操作为{(Index 2, X=1, Version:0), (Index 6, X=4, Version:2)}。
那么,Leader 节点发现两者最后一致的状态是{(Index 1, X=1, Version:0)},为此将后续的{(Index 2, X=2, Version:1), (Index 3, X=3, Version:2)}复制到节点 2 上,则节点 2 更新为 (Index 1, X = 1, Version: 0), (Index 2, X=2, Version:1), (Index3 , X=3, Version:2)}。从而,节点 2 与 Leader 节点的数据保持一致。

你知道的越多,你不知道的越多。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

3D目标检测(教程+代码)

随着计算机视觉技术的不断发展,3D目标检测成为了一个备受关注的研究领域。与传统的2D目标检测相比,3D目标检测可以在三维空间中对物体进行定位和识别,具有更高的准确性和适用性。本文将介绍3D目标检测的相关概念、方法和代码实现。 一、3D目…

回溯法寻找元素之和等于目标值的子集

这是一个回溯法的算法,可以用来寻找所有元素之和等于目标值的子集. 整个算法中最重要的是:在递归之后"恢复现场" 也就是: t[cnt]0; cnt--; 完整代码(注释部分打印信息可以用来辅助理解递归过程)&#xff1a; #include<iostream> #include<cstring> …

RFC7636-PKCE

前言 PKCE &#xff08;RFC 7636&#xff09; 是授权代码流的扩展&#xff0c;用于防止 CSRF 和授权代码注入攻击。 PKCE 不是客户端身份验证的一种形式&#xff0c;PKCE 不能替代客户端密码或其他客户端身份验证。即使客户端使用客户端密码或其他形式的客户端身份验证&#…

oracle物化视图

物化视图定义 视图是一个虚拟表&#xff08;也可以认为是一条语句&#xff09;&#xff0c;基于它创建时指定的查询语句返回的结果集&#xff0c;每次访问它都会导致这个查询语句被执行一次&#xff0c;为了避免每次访问都执行这个查询&#xff0c;可以将这个查询结果集存储到…

【STM32】STM32学习笔记-输入捕获测频率和占空比(18)

00. 目录 文章目录 00. 目录01. 预留02. 输入捕获测频率接线图03. 输入捕获测频率示例04. 输入捕获测频率和占空比接线图05. 输入捕获测频率和占空比示例06. 示例程序下载07. 附录 01. 预留 02. 输入捕获测频率接线图 03. 输入捕获测频率示例 pwm.h #ifndef __PWM_H #define…

从入门到精通UNet: 让你快速掌握图像分割算法

文章目录 一、UNet 算法简介1.1 什么是 UNet 算法1.2 UNet 的优缺点1.3 UNet 在图像分割领域的应用 二、准备工作2.1 Python 环境配置2.2 相关库的安装 三、数据处理3.1 数据的获取与预处理3.2 数据的可视化与分析 四、网络结构五、训练模型5.1 模型训练流程5.2 模型评估指标5.…

【JS逆向】逆向案例之 ----- 安某客滑块

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 安某客滑块小结 1. 初步分析 总共分为两步&#xff0c; 获取滑块图片信息检查滑块移动是否正确 整体框架如下&#xff1a; 1.1 getinfoTp 获取图片信息…

Plantuml之JSON数据语法介绍(二十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Nx市工业数据洞察:Flask、MySQL、Echarts的可视化之旅

Nx市工业数据洞察&#xff1a;Flask、MySQL、Echarts的可视化之旅 背景数据集来源技术选型功能介绍创新点总结 背景 随着工业化的不断发展&#xff0c;Nx市工业数据的收集和分析变得愈发重要。本博客将介绍如何利用Flask、MySQL和Echarts等技术&#xff0c;从统计局获取的数据…

【Java进阶篇】JDK新版本中的新特性都有哪些

JDK新版本中的新特性都有哪些 ✔️经典解析✔️拓展知识仓✔️本地变量类型推断✔️Switch 表达式✔️Text Blocks✔️Records✔️封装类✔️instanceof 模式匹配✔️switch 模式匹配 ✅✔️虚拟线程 ✔️经典解析 JDK 8中推出了Lambda表达式、Stream、Optional、新的日期API等…

Halcon闭运算closing

Halcon闭运算 文章目录 Halcon闭运算 闭运算的计算步骤&#xff0c;为先膨胀&#xff0c;后腐蚀。这两步操作能将看起来很接近的元素&#xff0c;如区域内部的空洞或外部孤立的点连接成一体&#xff0c;区域的外观和面积也不会有明显的改变。通俗地说&#xff0c;就是类似于“填…

echarts 折线图根据x轴时间渲染不同颜色的折线

footIm 如上图所示一条折线多种颜色 后端数据返回"data": [ { “dateTime”: “2023-10-11 00:02:10”, “pos”: 6, “curr”: 104.6 }, { “dateTime”: “2023-10-11 00:02:39”, “pos”: 7, “curr”: 104.6 }&#xff0c; …] 我们拿到后端返回的res.data传递给…

mysql原理--Explain详解

1.概述 一条查询语句在经过 MySQL 查询优化器的各种基于成本和规则的优化会后生成一个所谓的 执行计划 &#xff0c;这个执行计划展示了接下来具体执行查询的方式&#xff0c;比如多表连接的顺序是什么&#xff0c;对于每个表采用什么访问方法来具体执行查询等等。设计 MySQL 的…

Java EE Servlet之Cookie 和 Session

文章目录 1. Cookie 和 Session1.1 Cookie1.2 理解会话机制 (Session)1.2.1 核心方法 2. 用户登录2.1 准备工作2.2 登录页面2.3 写一个 Servlet 处理上述登录请求2.4 实现登录后的主页 3. 总结 1. Cookie 和 Session 1.1 Cookie cookie 是 http 请求 header 中的一个属性 浏…

【微服务】2.创建多个服务器

vmware有克隆功能直接拷贝以及设置好的虚拟机 如果要自己设置IP地址&#xff0c;修改/etc/sysconfig/network-scripts/ 编辑ifcfg-ens33需改ip地址 #开机加载网络配置启动网络服务 ONBOOT"yes" #分配ip的协议 none static :不自动分配&#xff0c;手动设置ip / dhcp…

Iterator(迭代器) 和 list

Iterator&#xff08;迭代器&#xff09; 和 list 文章目录 一、Iterator&#xff08;迭代器&#xff09;二、list 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Iterator&#xff08;迭代器&#xff09; 对 collection 进行迭代的迭代器。迭代器…

基于简化版python+VGG+MiniGoogLeNet的智能43类交通标志识别—深度学习算法应用(含全部python工程源码)+数据集+模型(二)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 模型构建1&#xff09;VGG模型简化版2&#xff09;GoogLeNet简化版——MiniGoogLeNet 3. 模型训练及保存 相关其它博客工程源代码下载其它资料下载 前言 本项目专注于解决出国自驾游特定场景下的交…

Avalonia学习(十六)-Mapsui

今天开始继续Avalonia练习。 本节&#xff1a;Mapsui 1.引入 Mapsui.Avalonia 2.项目引入 前台代码 <Window xmlns"https://github.com/avaloniaui"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:vm"using:MapsuiAvalonia.Vi…

个人任务和项目管理软件tududi的安装

现在已经是 2024 年了&#xff0c;祝大家新年快乐&#xff0c;万事如意。 什么是 tu|du|di ? tu|du|di是一个使用 Sinatra 构建的任务和项目管理 Web 应用程序。它允许用户有效地管理他们的任务和项目&#xff0c;将它们分类到不同的区域&#xff0c;并跟踪截止日期。tu|du|d…

Linux驱动学习—ioctl接口

1、unlock_ioctl和ioctl有什么区别&#xff1f; kernel 2.6.36 中已经完全删除了struct file_operations 中的ioctl 函数指针&#xff0c;取而代之的是unlocked_ioctl 。ioctl是老的内核版本中的驱动API&#xff0c;unlock_ioctl是当下常用的驱动API。unlocked_ioctl 实际上取…