读构建可扩展分布式系统:方法与实践10最终一致性

1. 最终一致性

1.1. 在一些应用领域,通常谈论的是银行和金融行业,最终一致性根本不合适

1.2. 事实上,最终一致性在银行业已经使用了很多年

  • 1.2.1. 支票需要几天时间才能在你的账户上进行核对,而且你可以轻松地开出比账户余额多的支票

  • 1.2.2. 当处理检查并建立一致性后,你才能看到一些后果

1.3. 在过去的好日子里,系统的所有数据项都有一个单一的真实来源,即数据库,不存在副本一致性的问题,因为根本没有副本

1.4. 为了保证每个节点的数据高可用,还需要对每个节点的内容进行复制,以消除单点故障

  • 1.4.1. 当数据库节点和网络快速且可靠地工作时,用户不知道他们正在与分布式系统交互

  • 1.4.2. 副本似乎是即时被更新的,同时用户请求的处理响应时间很短

    • 1.4.2.1. 不一致的读取很少见
  • 1.4.3. 出现故障意味着你的数据库副本保持不一致的时间可能比你的应用程序能容忍的时间更长

1.5. 不一致窗口

  • 1.5.1. 最终一致系统中的不一致窗口是数据对象被更新并传播到所有副本所需的持续时间

  • 1.5.2. 在领导者-追随者模式的系统中,领导者协调其他副本进行更新

  • 1.5.3. 在无领导系统中,任何副本(或者是任何数据库节点——这取决于实现)都会协调更新

  • 1.5.4. 当所有副本都具有相同的值时,不一致窗口结束

  • 1.5.5. 影响不一致窗口持续时间的因素

    • 1.5.5.1. 副本数目

      1.5.5.1.1. 副本越多,需要协调的副本更新就越多

      1.5.5.1.2. 只有当所有副本都相同时,不一致窗口才会关闭

      1.5.5.1.3. 拥有的副本越多,不一致窗口受个别响应缓慢的副本影响而导致窗口延长的可能性就会增加

    • 1.5.5.2. 运维环境

      1.5.5.2.1. 任何瞬时操作故障,例如瞬时网络故障或数据包丢失,都会延长不一致窗口

      1.5.5.2.2. 副本存在更新延迟的主要原因可能是节点上的大量读/写工作负载

      1.5.5.2.2.1. 导致副本过载并产生额外的数据传播延迟

      1.5.5.2.3. 数据库承受的负载越多,不一致窗口可能就越长

    • 1.5.5.3. 副本之间的距离

      1.5.5.3.1. 如果所有副本都在同一个局域网子网上,通信延迟可能是亚毫秒级的

      1.5.5.3.2. 只要有一个副本跨越大陆或世界各地,不一致窗口的最小值都将是副本之间的往返时间

    • 1.5.5.4. 所有这些问题都意味着你无法控制不一致窗口的持续时间

1.6. 读写一致性

  • 1.6.1. 读写一致性是系统的一个属性,它确保如果客户端对数据进行持久更改,更新后的数据值由同一客户端的任何后续读取返回

  • 1.6.2. 不一致窗口期间客户端有可能的情况

    • 1.6.2.1. 发布对数据库数据对象键的更新

    • 1.6.2.2. 对相同的数据库对象键发出后续读取操作,由于它访问的是一个副本,未保留最近的更新,导致访问到过时的数据

  • 1.6.3. 采用领导者-追随者副本时,实现读写一致性很简单

    • 1.6.3.1. 对于要求读写一致性的用例,你只需确保后续读取由领导者副本处理

      1.6.3.1.1. 可以保证读取的是最新的数据对象值

  • 1.6.4. MongoDB的默认行为是通过访问主副本实现

  • 1.6.5. 在Neo4j集群中,所有写入操作都由领导者处理,领导者异步更新只读的副本

    • 1.6.5.1. 读取操作可能由副本处理

1.7. 最终一致数据库广泛应用于大型系统中

  • 1.7.1. 在线博彩和游戏行业依赖于高可用性和低延迟

  • 1.7.2. 写入Riak KV的数据自动写入跨全球分布式集群的多个副本,具有可调节一致性,以便用户访问靠近其物理位置的副本来提供高可用性和低延迟

1.8. 最终一致数据库已经成为可扩展分布式系统领域的一个既定部分

  • 1.8.1. 简单的、可演化的数据模型通过自然分区和复制来实现可扩展性和可用性,为许多互联网规模的系统提供了出色的解决方案

  • 1.8.2. 最终一致数据库难免为系统提供过时的数据

  • 1.8.3. 大多数数据库都提供可调节一致性,允许系统设计人员平衡读取和写入的延迟,并权衡可用性和一致性以满足应用程序需求

  • 1.8.4. 对数据库中不同副本的同一对象的并发写入会导致冲突

2. 可调节一致性

2.1. 许多最终一致的数据库允许你通过配置选项和API参数来定制数据库的最终一致行为,可以根据用例能容忍的副本最终一致性级别来权衡读写操作的性能

2.2. 可调节一致性基于要完成数据库请求必须访问的特定副本数

3. 读取和写入仲裁

3.1. 法定数仲裁是多数副本,即(N/2)+1

3.2. 对于三个副本,法定数仲裁意味着写入必须在两个副本上成功,而读取必须访问两个副本

3.3. 仲裁的直观表现是,始终在大多数副本中读取和写入,读取请求将看到数据库对象最新版本的值

3.4. 如果法定数的节点不可用,写入和读取将失败

3.5. 宽松仲裁(sloppy quorum)

  • 3.5.1. 宽松仲裁第一次出现在Amazon的早期Dynamo论文的描述中,并在DynamoDB、Cassandra、Riak和Voldemort多个数据库中实现

  • 3.5.2. 如果副本节点不可用而导致写入操作无法达到给定的法定数,则将更新临时存储在另一个可访问的节点上

4. 副本修复

4.1. 在分布式、自我复制数据库中,你希望每个副本都是一致的

4.2. 系统会随着时间的推移趋向于熵(无序)​

  • 4.2.1. 数据库需要采取积极措施来确保副本保持一致,这些措施统称为反熵修复

4.3. 主动修复

  • 4.3.1. 在访问对象时应用程序的主动修复

  • 4.3.2. 主动修复对于频繁读取的数据库对象有效

  • 4.3.3. 主动副本修复也称为读取修复,是在响应数据库读取请求时发生的

  • 4.3.4. 如果有任何值不一致,协调器将向副本发回最新值以更新过时的值

  • 4.3.5. 读取修复的工作方式取决于数据库实现

4.4. 被动修复

  • 4.4.1. 对于不常访问的对象(很可能是你的绝大多数数据)​,使用被动修复策略

  • 4.4.2. 被动反熵修复通常是一个定期运行的进程,旨在修复不常访问的副本

  • 4.4.3. 构建Merkle树是一种CPU和内存密集型操作,该操作要么按需启动(由管理工具启动)​,要么定期安排

5. 冲突处理

5.1. 在无领导系统中,写入操作可以由任何副本处理

5.2. 最后写入者胜出

  • 5.2.1. 决定最终值的一种方法是使用时间戳

  • 5.2.2. 为更新请求生成一个时间戳,数据库确保并发写入发生时,具有最新时间戳的更新成为最终版本

  • 5.2.3. 机器上的时钟会漂移

    • 5.2.3.1. 更新请求由两个或多个独立进程在不同副本上的同一数据对象执行

    • 5.2.3.2. 这些更新必须被视为同时的或并发的

    • 5.2.3.3. 附加到更新请求的时间戳只是施加了任意顺序来解决冲突罢了

  • 5.2.4. 使用最后写入者胜出策略来解决冲突,数据丢失是不可避免的

  • 5.2.5. 在数据库中安全地使用纯粹的最后写入者胜出策略的唯一方法是确保所有写入都使用唯一键存储数据对象,并且对象在后续操作中是不可变的

    • 5.2.5.1. 对数据库中数据的任何更改都需要读取现有数据对象,并使用新键将新内容写入数据库

5.3. 版本向量

  • 5.3.1. 每个唯一的数据库对象都与版本号一起存储

  • 5.3.2. 如果写入的版本号与数据库对象版本不匹配,则发生冲突,数据库必须采取补救措施以确保数据不丢失

  • 5.3.3. 管理版本向量是数据库的责任

    • 5.3.3.1. 数据库客户端只需要提供带有更新的最新版本,并在冲突发生时进行处理
  • 5.3.4. 逻辑时钟

    • 5.3.4.1. CPU测量的物理时间在分布式系统中不是可靠的时间来源

    • 5.3.4.2. Leslie Lamport在他的开创性论文中首次提到了逻辑时钟

      5.3.4.2.1. 这项工作的本质是happens-before关系的定义

      5.3.4.2.2. 如果一个进程发生操作a(例如,一个数据库请求)​,并在它完成后发生操作b,则a happens-before b。这由a→b表示

      5.3.4.2.3. 如果一个进程向另一个进程发送消息m,则发送发生在接收之前,即发送happens-before接收

      5.3.4.2.4. 如果两个独立的进程执行操作a→b和c→d,则无法定义{a,b}和{c,d}之间的顺序

      5.3.4.2.5. 关系happens-before是可传递的,如果a→b和b→c,则a→c

    • 5.3.4.3. 系统可以使用逻辑时钟捕获happens-before关系,使用简单的计数器和算法达成

      5.3.4.3.1. 每个进程都有一个本地时钟,进程启动时将其初始化为零

    • 5.3.4.4. Lamport时钟定义了部分事件之间的顺序,然而它无法辨别没有因果关系的并发请求

      5.3.4.4.1. 它不能用于检测数据库冲突

      5.3.4.4.1.1. 这便是版本向量的使用场景了

  • 5.3.5. Redis、Cosmos DB和Riak等数据库正在利用研究社区的最新成果来支持名为CRDT(无冲突数据副本类型)的数据类型集合

    • 5.3.5.1. CRDT的一个简单示例是一个可用于维护社交媒体网站上用户的关注者数量的计数器

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

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

相关文章

【Elasticsearch】-实现向量相似检索

1、http请求方式 如果elasticsearch服务设置账号密码,则在请求的header中添加 Basic Auth 认证 请求方式:Post 请求地址:/index_name/_search 请求body:json格式 {"size": 10, //返回条数"min_score": 0.…

一生一芯 预学习阶段 PA1--RTFSC中“make menuconfig”

Enable debug information 问题如上。 在menuconfig将 Enable debug information 选项打开,编译时会产生什么变化? 从选项上看是打开了支持调试的选项,编译时应该是添加了支持编译的参数,具体看代码。 首先,我们先看…

Tomcat 乱码问题彻底解决

1. 终端乱码问题 找到 tomcat 安装目录下的 conf ---> logging.properties .修改ConsoleHandler.endcoding GBK (如果在idea中设置了UTF-8字符集,这里就不需要修改) 2. CMD命令窗口设置编码 参考:WIN10的cmd查看编码方式&am…

【hot100-java】【组合总和】

R8-回溯篇 印象题&#xff0c;很基本的回溯 class Solution {void backtrack(List<Integer> state,int target,int[] choices,int start,List<List<Integer>> ret){//子集和等于target&#xff0c;记录解if (target0){ret.add(new ArrayList<>(state)…

Java ----常用类

包装类 包装类的分类 1) 针对八种基本数据类型相应的引用类型—包装类2) 有了类的特点&#xff0c;就可以调用类中的方法。3) 如图 包装类和基本数据的转换 jdk5 前的手动装箱和拆箱方式&#xff0c;装箱&#xff1a;基本类型转包装类型&#xff0c;拆箱&#xff1a;包装类型…

探索丹摩智算平台的奇妙之旅:我的CogVideoX实践实验与深刻体验

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀CogVideoX &#x1f4d2;1. 初识CogVideoX&#x1f4da;2. 部署与准备&#x1f31e;在丹摩智算平台上创建实例&#x1f338;CogVideoX代码仓库…

Vue3 中组件传递 + css 变量的组合

文章目录 需求效果如下图所示代码逻辑代码参考 需求 开发一个箭头组件&#xff0c;根据父组件传递的 props 来修改 css 的颜色 效果如下图所示 代码逻辑 代码 父组件&#xff1a; <Arrow color"red" />子组件&#xff1a; <template><div class&…

公司网站改版时,需要注意哪些细节?

在公司网站改版时&#xff0c;需要注意的细节非常多&#xff0c;这些细节将直接影响到网站的用户体验、SEO效果以及整体品牌形象。以下是一些关键的注意事项&#xff1a; 明确改版目标&#xff1a; 在改版前&#xff0c;要明确改版的目标是什么&#xff0c;比如提升用户体验、增…

Linux:权限管理

基本权限和归属 权限和归属 基本权限与归属 • 访问权限 – 读取&#xff1a;允许查看内容-read – 写入&#xff1a;允许修改内容-write – 可执行&#xff1a;允许运行和切换-excute对于文本文件&#xff1a;r读取权限&#xff1a;cat、less、grep、head、tailw写入权限&am…

[已更新前两问代码+全部建模]2024华为杯C题详细思路代码文章建模分享研究生数学建模竞赛数学建模研赛

截止9.21 12点 已更新问题一二的代码和全部内容的建模 下面我们会先进行代码讲解,之后给出全部内容的建模公式 ## https://docs.qq.com/doc/DVWhyZ1NFY01XcmNw基于磁通密度数据的特征提取与分类分析。 问题一代码详解 1. 导入必要的库 import pandas as pd import numpy as…

Innodb内存结构

缓冲池Buffer Pool: 缓冲池是innodb内存结构缓冲区中的核心部分&#xff0c;在服务启动的时候服务器会向操作系统申请一块大小为128MB的内存空间&#xff0c;所有对数据库中数据的增删查改操作均在缓冲池bufferPool中完成&#xff0c;并且缓冲区中其他组件的描述信息也都存储在…

AI绘画Flux【lora模型】【微缩景观】:惊艳!3D场景融入手机上的微景观!

大家好&#xff0c;我是灵魂画师向阳 今天和大家分享一款基于Flux底模训练的微缩景观模型——FLUX|手机上的微景观。此模型主要将手机作为微型景观的基底&#xff0c;强制将3d情景融入手机并控制在手机屏幕上方范围内。 作者在使用提示词直出和使用该Loar提示词生成的图片进行…

手撕小顶堆

1. 抛砖引玉 给定两个以升序排列的整数数组 nums1 和 nums2 , 以及一个整数 k 。 定义一对值 (u,v)&#xff0c;其中第一个元素来自 nums1&#xff0c;第二个元素来自 nums2 。 请找到和最小的 k 个数对 (u1,v1), (u2,v2) … (uk,vk) 。 分析 大根堆&#xff08;大顶堆&#x…

多旋翼无人机维修、组装、调试技术详解

多旋翼无人机作为现代航拍、农业植保、物流运输等领域的重要工具&#xff0c;其性能的稳定性和操作的便捷性对于任务的完成至关重要。因此&#xff0c;掌握多旋翼无人机的维修、组装与调试技术&#xff0c;对于无人机操作员及维修人员来说至关重要。本文将详细介绍这三个方面的…

线程池ForkJoinPool实战及其工作原理分析

1. 由一道算法题引发的思考 算法题&#xff1a;如何充分利用多核CPU的性能&#xff0c;快速对一个2千万大小的数组进行排序&#xff1f; 这道算法题可以拆解来看&#xff1a; 1&#xff09;首先这是一道排序的算法题&#xff0c;而且是需要使用高效的排序算法对2千万大小的数…

从一个文本文件中挑选出符合条件的内容行

某天&#xff0c;张三得到一个需求&#xff0c;将如下格式的文本文件中的文件名开头的内容行提取出来&#xff0c;存入一个新的文本文件。 ok 0 文件名&#xff1a;1_zoukaige.mp3 index:10 文件名&#xff1a;2_dahan.mp3 index:20 文件名&#xff1a;3_kuai.mp3 index:30 文件…

【JavaEE精炼宝库】HTTP | HTTPS 协议详解

文章目录 一、HTTP 简介二、HTTP 协议格式&#xff1a;2.1 抓包工具的使用&#xff1a;2.2 HTTP 请求报文格式&#xff1a;2.3 HTTP 响应报文格式&#xff1a;2.4 HTTP 协议格式总结&#xff1a; 三、HTTP 请求详解&#xff1a;3.1 刨析 URL&#xff1a;3.2 方法(method)&#…

Kerberos自我总结Kerberos自我总结

1、协议原理与漏洞产生 1.1 kerberos Kerberos协议是一种基于票据Ticket的认证方式&#xff0c;它由三个角色组成&#xff0c;分别是客户端Client、服务端Server和秘钥分发中心KDC。 协议中的交互分为六步&#xff0c;为AS_REQ、AS_REP、TGS_REQ、TGS_REP、AP_REQ和AP_REP …

揭露大模型本质,大模型入门必看的12本书!看完我直接跪了

敢不敢用一年时间读完这12本书&#xff0c;模型入门必看的12本书&#xff01;建议收藏&#xff01;&#xff01; 第一本&#xff1a; 《基于GPT-3,ChatGPT,GPT-4等Transformer架构的自然语言处理》 主要内容 了解用于解决复杂语言问题的新技术。将GPT-3与T5、GPT-2和基于BE…

用Python实现时间序列模型实战——Day 28-29: 项目报告与展示

一、学习内容 1.1 项目报告的撰写与优化 项目报告应该从项目背景、数据探索、建模过程、预测结果、模型评估等方面进行全面描述。通过清晰的图表、简明的文字和合理的模型选择来优化报告的表达。 1.2 项目结果的展示与交流 通过展示图表、代码、关键模型的结果&#xff0c;…