2

什么是保持多个文件一致性的好算法?

这是一个学校项目。我必须在 C 中实现,跨网络进行一些复制。

我有2台服务器,

服务器 A1 服务器 A2

两台服务器都有自己的名为“data.txt”的文件

如果我给其中一个写东西,我需要更新另一个。

我还有另一个场景,有 3 个服务器。

服务器 B1 服务器 B2 服务器 B3

我需要这些做几乎相同的事情。

虽然这很容易实现。如果一台或两台服务器宕机,当它们重新启动时,它们将不得不自我更新。

我确信有一些算法可以有效地解决这个问题。我知道我想要什么,但我只是不知道我在寻找什么!

有人可以指出我正确的方向吗?

谢谢!

4

3 回答 3

2

这里的基本问题被称为“ CAP 定理”,它定义了分布式系统可以具有的三个属性:

  • 一致性:从系统中读取数据总是返回最新的数据。
  • 可用性:每个响应要么成功要么失败(不只是一直等到事情恢复)
  • 分区容错:系统可以在其服务器无法相互通信时运行(服务器停机是这种情况的一种特殊情况)

CAP 定理指出你只能拥有其中的两个。如果您的系统是一致的并且是分区容错的,那么它就会失去可用性条件——您可能必须等待分区恢复,然后才能得到响应。如果你有一致性和可用性,当有一个分区或者足够多的服务器停机时,你就会有停机时间。如果您具有可用性和分区容错性,您可能会读取过时的数据,或者必须处理冲突的写入。

请注意,这在读取和写入之间分别适用 - 您可以使用可用和分区容忍系统进行读取,但可以使用一致和可用系统进行写入。这基本上是一个主从系统;在分区中,写入可能会失败(如果它们位于分区的错误一侧),但读取会起作用(尽管它们可能会返回陈旧的数据)。

因此,如果您希望读取可用且分区容错,一个简单的选择是仅将一台主机指定为唯一可以执行写入的主机,并从中同步(例如,使用 cron 脚本中的 rsync 或其他东西 - 在您的 C项目,您只需定期使用一些简单的网络代码复制文件,并在修改后进行额外的复制)。

但是,如果您需要写入的分区容差,那就更复杂了。您可以让两台无法相互通信的服务器都进行写入,然后必须弄清楚哪些数据会胜出。这基本上意味着您需要在同步时比较两个版本并决定哪个版本获胜。这可以像“让最高的时间戳获胜”一样简单,或者您可以使用Dynamo中的矢量时钟来实现更复杂的策略——这在此处是否合适取决于您的应用程序。

于 2012-10-11T03:06:03.897 回答
1

查看rsync以及Dropbox的工作原理。

于 2012-10-11T02:52:27.180 回答
0

每次对服务器 A 进行写入时,派生一个进程以将相同的内容写入服务器 B。这样,对服务器 A 的所有写入都将复制到服务器 B。如果您有多个服务器,则使分叉的进程写入所有服务器备份服务器。

于 2012-10-11T02:50:50.553 回答