Files
MIT6.824/lecture-11-cache-consistency-frangipani/11.2-frangipani-de-tiao-zhan-challenges.md
2022-01-25 02:41:31 +00:00

4.8 KiB
Raw Permalink Blame History

11.2 Frangipani的挑战Challenges

Frangipani的挑战主要来自于两方面一个是缓存另一个是这种去中心化的架构带来的大量的逻辑存在于客户端之中进而引起的问题。

第一个挑战是假设工作站W1创建了一个文件 /A。最初这个文件只会在本地缓存中创建。首先Frangipani需要从Petal获得 / 目录下的内容之后当创建文件时工作站只是修改缓存的拷贝并不会将修改立即返回给Petal。

这里有个直接的问题假设工作站W2上的用户想要获取 / 目录下的文件列表我们希望这个用户可以看到新创建的文件。这是一个用户期望的行为否则用户会感到非常困惑。比如我在大厅里喊了一嘴说我把所有有意思的信息都放到了这个新创建的文件_/A_中你们快去看一看啊。但是当你从W2上尝试读取这个文件却找不相应的文件。所以这里我们想要非常强的一致性这样当有人在大厅里说自己在文件系统里面做了修改其他人应该能看到这个修改。另一个场景是如果我在一个工作站修改了文件之后在另一个计算机上编译它我期望编译器能看到我刚刚做的修改。这意味着文件系统必须要做一些事情来确保客户端可以读到最新的写入文件。我们之前讨论过这个话题我们称之为强一致或者线性一致在这里我们也想要这种特性。但是在一个缓存的环境中现在说的一致性的问题不是指存储服务器的一致性而是指工作站上的一些修改需要被其他工作站看到。因为历史的原因这通常被称为缓存一致性Cache Coherence。这是缓存系统的一个属性。它表明如果我缓存了一个数据并且其他人在他的缓存中修改了这个数据那么我的缓存需要自动的应用那个修改。所以我们想要有这种缓存一致性的属性。

另一个问题是因为所有的文件和目录都是共享的非常容易会有两个工作站在同一个时间修改同一个目录。假设用户U1在他的工作站W1上想要创建文件_/A_这是一个在 / 目录下的新文件同时用户U2在他的工作站W2上想要创建文件 /B

这里他们在同一个目录下创建了不同名字的两个文件A和B但是他们都需要修改根目录为根目录增加一个新的文件名。所以这里的问题是当他们同时操作时系统能识别这些修改了相同目录的操作并得到一些有意义的结果吗这里的有意义的结果是指A和B最后都要创建成功我们不想只创建一个文件因为第二个文件的创建有可能会覆盖并取代第一个文件。这里期望的行为有很多种叫法但是这里我们称之为原子性Atomicity。我们希望类似于创建文件删除文件这样的操作表现的就像即时生效的一样同时不会与相同时间其他工作站的操作相互干扰。每一个操作就像在一个时间点发生而不是一个时间段发生。即使对于复杂的操作涉及到修改很多状态我们也希望这些操作表现的好像就是即时生效的。

最后一个问题是假设我的工作站修改了大量的内容由于Write-Back缓存可能会在本地的缓存中堆积了大量的修改。如果我的工作站崩溃了但是这时这些修改只有部分同步到了Petal还有部分仍然只存在于本地。同时其他的工作站还在使用文件系统。那么我的工作站在执行操作的过程中的崩溃最好不要损坏其他人同样会使用的文件系统。这意味着我们需要的是单个服务器的故障恢复我希望我的工作站的崩溃不会影响其他使用同一个共享系统的工作站。哪怕说这些工作站正在查看我的目录我的文件它们应该看到一些合理的现象。它们可以漏掉我最后几个操作但是它们应该看到一个一致的文件系统而不是一个损坏了的文件系统数据。所以这里我们希望有故障恢复。一如既往的在分布式系统中这增加了更多的复杂度我们可以很容易陷入到这样一个场景一个工作站崩溃了但是其他的工作站还在运行。

对于所有的这些内容所有的3个挑战在我们接下来的讨论中我们会关注Frangipani是如何应对这些挑战。对于Petal虚拟磁盘它也会有许多类似的关联问题但是它不是今天关注的重点。Petal有完全不同的可靠的容错机制。实际上它与我们之前讨论过的Chain-Replication非常相似。