Computer science 使用Paxos跨节点同步大型文件

Computer science 使用Paxos跨节点同步大型文件,computer-science,distributed,distributed-computing,paxos,consensus,Computer Science,Distributed,Distributed Computing,Paxos,Consensus,我正在尝试使用Paxos在一个大小约为50MB的文件上维护节点之间的一致性,并且在各个节点上不断进行修改。我遇到了实用性的问题。 要求: 跨数百个节点同步50MB+的文件 对该文件的更改可以从任何节点进行,并且不可能直接相互竞争,最多在几秒钟内通过网络传播 加入网络的新节点可以在几分钟内(正如peter在评论中提到的,最终一致性可能更合适 每个节点都有文件的某个版本。每N秒,每个节点连接到另一个节点,并交换版本号。如果一个节点在另一个节点之后,则从对等节点下载文件 我认为,对于1000个节点,这

我正在尝试使用Paxos在一个大小约为50MB的文件上维护节点之间的一致性,并且在各个节点上不断进行修改。我遇到了实用性的问题。 要求:

  • 跨数百个节点同步50MB+的文件
  • 对该文件的更改可以从任何节点进行,并且不可能直接相互竞争,最多在几秒钟内通过网络传播

  • 加入网络的新节点可以在几分钟内(正如peter在评论中提到的,最终一致性可能更合适

    每个节点都有文件的某个版本。每N秒,每个节点连接到另一个节点,并交换版本号。如果一个节点在另一个节点之后,则从对等节点下载文件

    我认为,对于1000个节点,这会在10-20轮八卦中迅速收敛


    更新 (将raft或消息队列引入到混合中。)

    木筏 从您的评论来看,似乎您手头上有一个键值存储。您可以将其视为一个分布式状态机,在该状态机中,您将每个键值的更新视为自己的命令。这对于paxos或raft这样的一致协议来说是非常好的(就开源实现的数量而言,我倾向于每天更新一次)更重要的是,这些节点通常也被实现成一个原子广播系统。简言之,少数节点充当核心决策者,其余节点则听取结果

    (当然,我不知道您的文件是如何更新的;也就是说,如果它只在主节点上更新,而其余的是从节点。)

    一个主要的问题是1000个节点的扇出。为此,您可能需要一个分层扇出。有各种方案可以帮助您解决这个问题;这里有一些想法。a)让每个节点连接到两个随机对等节点;以及从具有最短路径的对等方到主节点的流(这称为流);或者B)以一定的概率p选择路径最短的节点。C) 让每个节点连接到一个随机对等节点,并以某种概率p,将来自该节点的流连接到其上游节点。这些概率意味着形成一个n元树,这是连接到主节点的每个节点与链接列表中的每个节点之间的良好平衡

    消息队列 现在,paxos和raft提供了一些非常有力的保证。特别是在这种情况下,每个更新都将按顺序处理——跨越所有键。如果您不需要这种保证,那么您可以构建一个更简单的系统

    每个密钥更新都可以广播到分布式消息队列(如SQS、RabbitMQ等)版本每个密钥更新,并且仅当更新的版本大于您拥有的版本时才应用更新。这将为您提供一个漂亮、快速、最终一致的系统


    如果系统允许,我会使用上面的raft/paxos方法。

    我们可以使用paxos将写入文件的事务日志复制为。当具有空文件的新服务器加入集群时,它可以从最新节点请求快照。同时,新节点还可以侦听和缓冲当前更新。一旦它加载了快照,然后应用了以后的更新,它就完全是最新的


    快照可以是文件的完整副本。获取完整快照意味着阻止写入,但不阻止读取。对于RAID SSD磁盘上的5000万个文件来说,这可能不会造成太大的性能开销。一种更有效的方法是将文件建模为一个不可变(纯函数)的数据结构。我们可以将它建模为一个文件块,而不是一个平面文件。例如,键是文件块编号,值是文件的块。写入文件意味着在映射中插入一个或多个更新的块。使用这种数据结构,所有写操作都返回一个新的不可变映射。新映射与先前版本的映射共享未修改的文件块。然后,文件的快照就是特定时间点上映射的不可变版本。对于不可变映射,访问映射中的所有块时无需使用锁,即可将文件状态的完整快照传输到任何新服务器。使用这种技术

    首先为什么要使用paxos?为什么不采用某种最终一致的算法?@peter Paxos并非如此。帕克斯要达成共识,大家都同意。最终的一致性算法可以轻松处理一系列更改和更新,只要您能够解决这些问题conflicts@peter那么您将如何解决这个问题呢?Sry过早地按enter键,请参阅我的更新注释我假设节点在逐轮基础上随机选择合作伙伴?您如何计算99%的节点知道最新更新需要多少轮?此外,您忘记了要求1,因为文件大小超过50MB,因此无法在每次更改时由每个节点完全下载。但是,它确实非常符合要求3well@TheEnvironmentalist,如果文件是分区的,则很容易为每个分区提供一个版本号,并扩展gossip协议。但是,不确定如何处理自由格式文件。该文件没有明确的分区。它可以根据散列规则被任意划分为多个部分,以便对相应的部分进行新的更改,但是这意味着什么呢?基本上,这个文件是一个哈希表。@TheEnvironmentalist我用八卦来同步一个有几千个键的哈希表。这里的问题是篡改恢复能力。我真的不想要“重新传输文件”操作,因为它可以被用作攻击系统的一种方式。理想情况下,文件同步只是同步操作的一部分。可以在传输层中处理篡改和限制。Cassandra已设置流式数据的带宽限制