这里的基本问题被称为“ CAP 定理”,它定义了分布式系统可以具有的三个属性:
- 一致性:从系统中读取数据总是返回最新的数据。
- 可用性:每个响应要么成功要么失败(不只是一直等到事情恢复)
- 分区容错:系统可以在其服务器无法相互通信时运行(服务器停机是这种情况的一种特殊情况)
CAP 定理指出你只能拥有其中的两个。如果您的系统是一致的并且是分区容错的,那么它就会失去可用性条件——您可能必须等待分区恢复,然后才能得到响应。如果你有一致性和可用性,当有一个分区或者足够多的服务器停机时,你就会有停机时间。如果您具有可用性和分区容错性,您可能会读取过时的数据,或者必须处理冲突的写入。
请注意,这在读取和写入之间分别适用 - 您可以使用可用和分区容忍系统进行读取,但可以使用一致和可用系统进行写入。这基本上是一个主从系统;在分区中,写入可能会失败(如果它们位于分区的错误一侧),但读取会起作用(尽管它们可能会返回陈旧的数据)。
因此,如果您希望读取可用且分区容错,一个简单的选择是仅将一台主机指定为唯一可以执行写入的主机,并从中同步(例如,使用 cron 脚本中的 rsync 或其他东西 - 在您的 C项目,您只需定期使用一些简单的网络代码复制文件,并在修改后进行额外的复制)。
但是,如果您需要写入的分区容差,那就更复杂了。您可以让两台无法相互通信的服务器都进行写入,然后必须弄清楚哪些数据会胜出。这基本上意味着您需要在同步时比较两个版本并决定哪个版本获胜。这可以像“让最高的时间戳获胜”一样简单,或者您可以使用Dynamo中的矢量时钟来实现更复杂的策略——这在此处是否合适取决于您的应用程序。