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

时间:2012-10-11 02:42:58

标签: c replication consistency

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

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

我有2台服务器,

服务器A1 服务器A2

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

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

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

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

我需要这些做的几乎一样。

虽然实现起来相当简单。如果一台或两台服务器停机,当重新启动时,它们必须自行更新。

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

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

谢谢!

3 个答案:

答案 0 :(得分:2)

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

  • 一致性:从系统读取数据始终返回最新数据。
  • 可用性:每个响应都成功或失败(不只是等待事情恢复)
  • 分区容差:系统可以在服务器无法相互通信时运行(服务器停机是其中一个特例)

CAP定理表明你只能有两个。如果您的系统是一致的并且分区容忍,那么它将失去可用性条件 - 您可能必须等待分区才能获得响应。如果您具有一致性和可用性,那么当存在分区或者有足够的服务器停机时,您将遇到停机时间。如果您具有可用性和分区容错,则可能会读取陈旧数据,或者必须处理冲突的写入。

请注意,这在读取和写入之间单独应用 - 您可以使用Available和Partition-Tolerant系统进行读取,但是可以使用Consistent和Available系统进行写入。这基本上是一个主从系统;在分区中,写入可能会失败(如果它们位于分区的错误一侧),但读取将起作用(尽管它们可能会返回过时的数据)。

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

但是,如果您需要写入分区容差,则会更复杂。您可以让两台服务器无法相互通信并进行写操作,之后必须确定哪些数据可以获胜。这基本上意味着你需要在同步时比较两个版本并决定胜出。这可以像“让最高时间戳获胜”一样简单,或者你可以使用Dynamo中的向量时钟来实现更复杂的策略 - 这在这里取决于你的应用程序。

答案 1 :(得分:1)

查看rsync以及Dropbox如何运作。

答案 2 :(得分:0)

每次写入服务器A时,都会分叉一个进程将相同的内容写入服务器B. 这样,服务器A上的所有写入都会复制到服务器B.如果有多台服务器,请使分叉进程在所有备份服务器上进行写入。