有哪些好的算法可以保持多个文件的一致性?
这是一个学校项目。我必须用 C 语言实现一些跨网络的复制。
我有 2 台服务器,
服务器 A1 服务器A2
两台服务器都有自己的文件,名为“data.txt”
如果我给其中一个写了一些东西,我需要更新另一个。
我还有另一个场景,有 3 台服务器。
服务器 B1 服务器B2 服务器B3
我需要这些做几乎相同的事情。
虽然这实现起来相当简单。如果其中一台或两台服务器停机,当重新启动时,它们将必须自行更新。
我确信有一些算法可以有效地解决这个问题。我知道自己想要什么,只是不知道自己到底在寻找什么!
有人能给我指出正确的方向吗?
谢谢!
最佳答案
这里的根本问题被称为“CAP theorem” ',它定义了分布式系统可以具有的三个属性:
- 一致性:从系统读取数据始终返回最新数据。
- 可用性:每个响应要么成功,要么失败(不只是一直等待直到事情恢复)
- 分区容错性:当服务器之间无法相互通信时,系统仍可以运行(服务器宕机是一种特殊情况)
CAP 定理指出,您只能拥有其中两个。如果您的系统是一致且分区容忍的,那么它就会失去可用性条件 - 您可能必须等待分区修复才能得到响应。如果您具有一致性和可用性,那么当存在分区或足够多的服务器停机时,您就会遇到停机情况。如果您具有可用性和分区容错性,您可能会读取过时的数据,或者必须处理冲突的写入。
请注意,这分别适用于读取和写入 - 您可以为读取提供可用且分区容忍的系统,但为写入提供一致且可用的系统。这基本上是一个主从系统;在分区中,写入可能会失败(如果它们位于分区的错误一侧),但读取会起作用(尽管它们可能返回过时的数据)。
因此,如果您希望读取可用且具有分区容错性,一个简单的选择是仅将一台主机指定为唯一可以执行写入操作的主机,并从中同步(例如,使用 cron 脚本中的 rsync 或其他方式 -在您的 C 项目中,您只需定期使用一些简单的网络代码复制文件,并在修改后立即进行额外的复制)。
但是,如果您需要写入的分区容错性,则情况会更复杂。您可以让两台无法相互通信的服务器同时进行写入操作,然后必须弄清楚哪些数据获胜。这基本上意味着您需要在同步时比较两个版本并决定哪个版本获胜。这可以像“让最高的时间戳获胜”一样简单,或者您可以使用 vector 时钟,如 Dynamo 中所示。实现更复杂的策略 - 此处是否合适取决于您的应用程序。
关于c - 有哪些好的算法可以保持网络中多个文件的一致性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12831403/