我什么时候使用像 Paxos 这样的共识算法,什么时候使用像向量时钟这样的算法?

2024-03-18

我已经阅读了很多有关保证分布式系统中节点之间一致性的不同策略的文章,但我在弄清楚何时使用哪种算法时遇到了一些麻烦。

我会在什么样的系统中使用矢量时钟之类的东西?哪个系统最适合使用 Paxos 之类的东西?两者是互相排斥的吗?


有一个由 2 个节点组成的分布式系统来存储数据。数据被复制到两个节点,这样如果一个节点死亡,数据不会丢失(持久性)并继续提供服务(可用性)。您还希望您的 2 节点系统每秒处理两倍的请求(可扩展性)。

假设对单个键的写入可以到达任何节点。你的客户写“1”作为某个键的值,then它决定写“2”。第一次写入到节点#1。它向节点#2 发出复制请求。但是,您存储“2”的请求比复制请求更早到达节点#2(记住,我们可以存储在任何节点上)。它存储“2”,向节点#1发出带有“2”的复制请求,从它接收带有“1”的复制请求,将其“2”更改为“1”,而节点#1将其“1”更改为“2”。现在,存储节点之间的数据不一致。另外,如果节点#1 死亡,您所拥有的只是值为“1”的节点#2,而您清楚地记得您发送了“2”after“1”,存储系统已确认保存。实际上,很多事情可能会出现“错误”,具体取决于您对存储系统的期望(读取写入?单调读取?等),因此您需要一种方法来真正找出键的真实、良好、实际值是,甚至是为了防止系统以这种方式“破坏”数据。为此,存储系统需要知道在其节点之间发生了什么,或者甚至可能包括您的客户对事件顺序的看法。矢量时钟 https://en.wikipedia.org/wiki/Vector_clock and 版本向量 https://en.wikipedia.org/wiki/Version_vector是实践中用于实现这一目标的一些技术,或者声称两个事件同时发生,并且您需要一些其他方法来在它们的结果之间做出决定。

您决定以不同的方式解决该问题,以避免所有这些复杂性:某个键的所有写入都将转到一个节点(称为“领导者”),并将这些写入复制到另一个节点。事实上,这看起来是一种更简单的方案:在一个节点(可能还有一个进程)内,您拥有快速且经过验证的并发控制技术,可以轻松地对事件进行排序,可以以相同的顺序应用复制;此外,总有正确数据的权威来源。唯一的问题是您的 2 个存储节点需要就特定密钥的领导者达成一致。如果您有 3 个节点,其中一个节点死亡,那么另外 2 个节点需要决定 1)它们都认为旧领导者已死亡,2)其中哪一个是新领导者。为此,存在共识协议(Paxos https://en.wikipedia.org/wiki/Paxos_(computer_science), 2阶段提交 https://en.wikipedia.org/wiki/Two-phase_commit_protocol, Raft https://raft.github.io/、Zab、三阶段提交等)。

为什么不总是选择单一领导者(因此是共识协议)而不是无领导者方案(因此是像版本向量这样的排序机制)?谈判领导权需要时间(最多几秒或几十秒),在此期间您的系统在某些特殊模式下不可用或部分可用。无领导者在某些其他条件下也可以表现得更好(例如,领导者由于软件问题或网络问题而变得缓慢:使用无领导者方法,其他节点可能会接管其职责)。随着参与者数量的增加,达成共识变得更加困难,因此无领导者可能会更好地扩展。

最后,让我们逐字逐句地回答您的问题:

我会在什么样的系统中使用矢量时钟之类的东西?

您可能希望将版本向量用于无领导者分布式存储。您可以使用矢量时钟来实现相同的目的(尽管它是更不适合 https://haslab.wordpress.com/2011/07/08/version-vectors-are-not-vector-clocks/;该文章还建议您使用它来获得一致的快照,以实现因果顺序 https://en.wikipedia.org/wiki/Causal_consistency在一般分布式系统等)。

哪个系统最适合使用 Paxos 之类的东西?

单领导者或多领导者分布式存储。很少更新的数据(想想配置)、集群参与信息的数据库——如果这些信息很关键,否则八卦会更好地扩展。分布式锁。

两者是互相排斥的吗?

不会。两者都可以用于解决相同的任务(例如分布式存储)。它们可以组合起来(用于集群参与的 paxos,然后使用该知识来确定哪些节点在最终一致(通过版本向量)系统中形成仲裁)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我什么时候使用像 Paxos 这样的共识算法,什么时候使用像向量时钟这样的算法? 的相关文章

  • 如何使两个相关但独立的系统保持同步?

    我当前的开发项目有两个方面 首先 有一个公共网站 外部用户可以出于各种目的提交和更新信息 然后 此信息将保存到托管设施的本地 SQL Server 中 第二个方面是内部应用程序 员工使用它来管理这些相同的记录 概念上 并提供状态更新 批准等
  • Apache Spark join 操作的扩展能力较差

    我在 Apache Spark 上运行 join 操作 发现没有弱可扩展性 如果有人能解释这一点 我将不胜感激 我创建两个数据帧 a b 和 a c 并通过第一列连接数据帧 我为 一对一 连接生成数据帧值 另外 我使用相同的分区器来避免随机
  • 从n个列表中生成灯具

    假设我有 N 支球队 如何生成一个赛程列表 其中每支球队都与其他球队比赛 对此的最佳实践是什么 有没有一种已知的算法可以很好地做到这一点 效率并不是真正的必需品 因为它只需要每个赛季产生一次 更具体地说 我将从一些定义开始 我有 N 个团队
  • 在 SOLR 中动态创建新的核心目录

    我正在使用 solr 1 4 1 构建分布式搜索引擎 但我不想只使用一个索引文件 我想在我的 java 代码中动态创建新的核心 索引 目录 我发现下面的其余 API 可以使用以下方法创建新核心EXISTING核心目录 http wiki a
  • Spark应用程序状态中的FAILED和ERROR有什么区别

    我正在尝试创建已提交的 Spark 应用程序的状态图 当应用程序被视为失败时 我有点迷失了 各州来自这里 https github com apache spark blob d6dc12ef0146ae409834c78737c11605
  • 分析网络软件/具有大量系统调用等待的分析软件

    我正在开发一个复杂的网络软件 但我无法确定如何提高系统性能 特别是在使用阻塞同步调用的软件部分 由于系统的这一部分正在进行大量计算 因此几乎不可能确定该组件的缓慢是由这些计算引起的还是由于等待系统的其他部分引起的 是否有任何轻量级分析器可以
  • 使用 docker 在 AWS ray 集群上启动简单的 python 脚本

    我发现遵循 Ray 指南在 ray 集群上运行 docker 映像以执行 python 脚本非常困难 我发现缺乏简单的工作示例 所以我有最简单的docker文件 FROM rayproject ray WORKDIR usr src app
  • Erlang集群

    我正在尝试使用 Erlang 作为将所有组件粘合在一起的粘合剂来实现一个集群 我喜欢它创建一个完全连接的节点图的想法 但在在线阅读不同的文章后 似乎这不能很好地扩展 最多有 50 100 个节点 OTP 的开发者是否故意施加此限制 我确实知
  • 使用Java代码进行Jmeter分布式测试

    我能够使用 Java 代码运行 Jmeter 但如果我想做与分布式测试相同的操作 那么如何在 Java 代码中添加远程引擎 这是一个sample http alvinalexander com java jwarehouse jakarta
  • 理论:压缩算法可以使某些文件变小但不会变大?

    我遇到了这个问题 无损压缩算法声称可以保证使某些文件变小并且不会使文件变大 这是 a 不可能 b 可能 但可能运行不确定的时间 c 压缩系数为 2 或更低时可能 d 对于任何压缩因子都可能吗 我倾向于 a 但无法给出具体原因 我将列出我和朋
  • 一对一关系的数据库设计

    我正在尝试完成项目数据模型的设计 但很难弄清楚该采用哪种方式 我有一个用户表 以及适用于该用户的未确定数量的属性 这些属性几乎在每种情况下都是可选的 因此允许空值 这些属性中的每一个对于用户来说都是一对一的 我应该将它们放在同一个表上 并在
  • 部分重写子类中的虚拟自动属性

    是时候回答我刚刚遇到的理论问题了 以下代码有效并可编译 public class Parent public virtual object TestProperty get set public class Child Parent pri
  • 如何在 OS X C 代码中创建异步计时器?

    所以这个问题实际上是 为什么 time h 在 OS X 和 Linux 上不一样 但是 我已经接受了这些分歧 为了在 Unix 系统上创建计时器 我遵循了本教程http www helsinki fi atk unix dec manua
  • 如果更新值与接受者发送的最高提案编号不同步,paxos 是否会“忽略”更新值的请求?

    这里的标题可能会产生误导 我将尽力通过一个例子来解释我的疑问 我正在从 wiki 和其他来源阅读有关 paxos 算法的内容 1 想象一下客户端请求更新值的情况 X在下面的示例中 已被处理 经过一轮 Paxos 后 得到一个值Vb之所以被选
  • B 树和 2-3-4 树之间的区别

    B 树和 2 3 4 树有什么区别 另外 你如何找到每个的最大和最小高度 链接到维基百科 http en wikipedia org wiki 2 3 4 tree and引用 2 3 4 树是 4 阶 B 树 A 2 3 4 is a B
  • 分布式版本控制系统[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想和我的程序员同事一起实现分布式版本控制系统 他们分散在周围 全部使用不同的 IDE 或不使用 IDE 也使用不同的操作系统 我对整个场
  • Javascript分布式计算[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 为什么没有任何 Javascript 分布式计算框架 项目 这个想法对我来说绝对很棒 因为 客户端就是浏览器 可以使用AJAX进行迭代 网站管理
  • Apache Spark 中的混洗与非混洗合并

    在将 RDD 写入文件之前执行以下转换时 它们之间有什么区别 合并 1 随机播放 true 合并 1 随机播放 假 代码示例 val input sc textFile inputFile val filtered input filter
  • 颜色重新映射 - 使用 3D 网格匹配目标调色板?

    假设我有颜色 FOO 它以 RGB 格式存储 我需要重新着色 FOO 以便它与颜色列表中最接近的颜色匹配 即时执行此操作 我是否无法将每种颜色的 RGB 值视为 3D 网格上的点 r x g y b z 并计算点 FOO 与每个颜色点之间的
  • 与恶霸算法相比,高级主选举算法有什么好处?

    我读过当前的主选举算法 如 Raft Paxos 或 Zab 如何在集群上选举主节点 但不明白为什么他们使用复杂的算法而不是简单的恶霸算法 我正在开发一个集群库并使用 UDP 多播来发送心跳消息 每个节点加入一个多播地址 并定期向该地址发送

随机推荐

  • Python xlwt 创建错误的 Excel 书

    我正在尝试使用xlwt创建具有多个选项卡的输出文件 xlsx 格式 我的Python版本号是2 7 我使用Aptana Studio 3作为IDE 我用过xlwt包之前 具有相同的环境 执行相同的任务 效果很好 但这一次 一开始运行良好 然
  • 将 gcc libs .data 放在特定部分?

    我正在尝试为我们的嵌入式系统切换到 GNU GCC 编译器 但由于我们芯片的内存布局被分割 我在链接该项目时遇到了问题 RAM section 1 0x10000 0x12FFF RAM section 2 0x18000 0x1BFFF
  • Express js中通过id删除mongodb文档

    我正在为此抓狂 尝试通过 id 删除文档 router delete api menu delete id function req res var id req params id db get collection menu funct
  • 如何在自定义验证属性中获取/注入服务

    我们使用 NET Core 3 1 5 这是一个 Blazor 服务器应用程序 我们有一个 ValidationAttribute 并需要访问外部服务来验证对象 ValidationAttribute 有 IsValid 方法 protec
  • 有没有办法在 C# 中修改进程 DACL

    我有更改进程 DACL 的遗留 C 代码 并尝试使用 NET 3 5 中的托管代码类 我在网上找到了代码 其中有人创建了一个 SetAclOnServices 类 该类扩展了服务的 NativeObjectSecurity 类 我认为我可以
  • jQuery 数据表中的列排序

    我已经了解了 jQuery 数据表插件中的列排序以及控制它的各种方法 我有一个查询是否可以通过单击上箭头图标将按升序和下箭头图标进行排序的方式控制排序会按降序排序吗 有两种方法可以做到这一点 具体取决于datatables版本 编辑数据表版
  • 如何在Python中将一个对象的所有属性复制到另一个对象?

    在Python中 是否有一个库方法可以复制同一类的两个 已经存在的 实例之间的所有属性 我的意思是 类似 Apache Commons 的东西PropertyUtilsBean copyProperties Try destination
  • ActiveRecord 查询比直接 SQL 慢得多?

    我一直致力于优化项目的数据库调用 我注意到下面两个相同的调用之间的性能存在 显着 差异 connection ActiveRecord Base connection pgresult connection execute SELECT S
  • 当我“推”到 Bitbucket 时,可以从 VPS 中“拉”一个钩子

    我正在 Bitbucket 中管理我的 WordPress 模板 每次我push主题 我必须登录我的 VPS 服务器并且pull回购协议 我想自动完成 如果我自己运行 git daemon 我找到了一个解决方案 推送到服务器后执行自动拉取请
  • 基于现有模板生成Word文档的最佳方法是什么

    TL DR 我可以使用 NET 生成 Word 文档 如 XAML ItemTemplates 吗 我发现很难找到一个满足我所有要求的解决方案 所以我想我会把它扔到 stackoverflow 希望有人能指导我 非常感谢 简单来说 我需要根
  • 如何根据条目的长度过滤 pandas 数据框

    在 pandas 数据框中 我有一个字段 amp 应由长度为 495 的列表填充 是否有一种 pandas ic 方法可以快速过滤此长度 使得具有字段 amp 的所有行不等于 495被丢弃 I tried df len df amp 495
  • 如何将 SQL 查询与不同的表达式结合起来?

    我的三个查询已经达到了我的 SQL 知识的顶峰 Microsoft SQL 2005 如果这很重要 现在我需要将它们组合成一个查询 并将所有值放在一行上 我的实际查询如下 但我认为如果我在这里提供一个简单的版本会更容易 查询一 Provid
  • 尝试覆盖 Hive 分区时写入 __HIVE_DEFAULT_PARTITION__ 的行已损坏

    当尝试使用 Spark 2 3 覆盖 Hive 表中的分区时 我看到一些非常奇怪的行为 首先 我在构建 SparkSession 时设置以下设置 config spark sql sources partitionOverwriteMode
  • XmlPullParser:获取包含 XML 标签的内部文本

    假设您有一个如下所示的 XML 文档
  • 有什么方法可以使用 boto3 直接将文件写入 S3 吗?

    我编写了一个 python 脚本来处理非常大的文件 总共几 TB 我将在 EC2 实例上运行该脚本 之后 我想将处理后的文件存储在 S3 存储桶中 目前 我的脚本首先将数据保存到磁盘 然后将其上传到S3 不幸的是 考虑到等待实例首先写入磁盘
  • Google PageSpeed 用户代理的名称是什么?

    这一页 https developers google com speed docs insights faq whyonlinediff表示它使用自定义用户代理 但没有提及名称 如果用户代理来自 PageSpeed 我希望能够运行一些逻辑
  • VS2013测试代理和控制器不通信

    我有一个运行 VS2013 负载测试控制器的 Windows Azure VM 和另一个运行 2013 负载测试代理的 Azure VM 我一直无法让两人成功沟通 我将每个虚拟机的主机名和 IP 添加到另一个虚拟机的 HOSTS 文件中 我
  • 依赖注入上下文中的组合根是什么?

    我正在探索依赖注入和术语成分根到处都在使用 那么它是什么 组合根是应用程序中使用依赖项注入容器组合应用程序的对象图的单个位置 尽管如何完成此操作无关紧要 它可以使用容器 也可以使用手动完成 pure DI http blog ploeh d
  • 是否可以在 HTML 中创建多级有序列表? [复制]

    这个问题在这里已经有答案了 我要这个 1 Main 1 1 sub1 1 2 sub2 2 Main2 2 1 sub3 可以在 HTML 中做到这一点吗 谢谢 这个解决方案对我有用 hide original list counter o
  • 我什么时候使用像 Paxos 这样的共识算法,什么时候使用像向量时钟这样的算法?

    我已经阅读了很多有关保证分布式系统中节点之间一致性的不同策略的文章 但我在弄清楚何时使用哪种算法时遇到了一些麻烦 我会在什么样的系统中使用矢量时钟之类的东西 哪个系统最适合使用 Paxos 之类的东西 两者是互相排斥的吗 有一个由 2 个节