CODA是一个大型UNIX工作站组成的分布式计算环境的文件系统。它通过使用两个不同但互补的机制提供弹性的服务器和网络故障。一种机制,服务器上的复制,包括在多个服务器上存储的文件的副本。另一种机制是,断开操作,是一个执行模式,在其中一个缓存网站暂时假定复制站点的作用。断开操作对支持便携式工作站特别有用。科达针对可用性和性能进行了优化,同时提供了达到这些目标最高的一致性。从原型的测量显示,在科达提供高可用性的性能成本是合理的。
使用一个位置透明的分布式文件系统在工作站之间共享数据,在今天是常见的做法。这样的文件系统主要担心的是存储的数据的可用性。CODA是一个分布式文件系统,通常发生在工作站环境的故障具有弹性特征。它通过使用服务器拷贝和断链操作这两个不同但互补的机制来提供高可用性。我们建设科达的目标是提供最佳的性能,最高的可用性,并提供这些约束内达到的一致性程度最高。本文主要针对其架构特点简要概述CODA。
科达许多方面都继承自安德鲁文件系统(AFS)——一个自1984年一再卡内基梅隆大学使用的大规模分布式文件系统。类似AFS,CODA使服务器的数量相对较少,而客户端数量却要多很多。服务器是物理安全,运行受信任的系统软件并且受业务人员监控。客户可在任意方式修改用户,是物理分散的,而且可能长时间单独留在家中或已关闭。虽然客户端和服务器都运行Unix1,然而用户程序只能在客户端上执行。客户端和服务器通信使用远程过程调用机制,支持加密和执行相互身份验证。
每个客户端都运行一个叫"venus"的进程,将本地磁盘当作文件cache使用,以处理远程文件系统的请求。客户端将文件和目录全量缓存。一旦来至服务器的文件或目录被缓冲,该cache将获得一个毁掉函数。回调函数是服务器对客户端的一个承诺,允许在其他客户端对对象修改之前通知该客户端。回调函数允许报此缓存的一致性,并减少客户端与服务器之间的交互。
科达一致性模型接近于AFS,同事也与Unix提供的模型相近。Unix允许多个进程读取和写入文件的同时,一个进程引起的修改操作可立即被其他进程课件。AFS提供了接近Unix兼容大多数应用的一致性模型,同时具有高度的可扩展性。进程,共享文件,在一个单一的网站看到的确切UNIX语义。不同进程看到的修改操作是文件粒度的打开关闭操作。
在出现故障的情况下,科达的一致性模型,类似于AFS。Coda在故障情况下,力求最大限度地提高可用性。只有当可以确定副本不一致时,才会拒绝访问数据副本,并保持这个策略,即使在网络分区情况下也是如此。虽然这种策略可能导致冲突的更新,在Unix环境下的次数并不频繁的写共享,使得这种冲突不可能。我们已采取的观点,首先是Locus的建议,如果他们是罕见的,那更新冲突是可以接受的,即使发现,往往很容易修复。一个版本向量的机制被用于检测不一致。科达的高可用性机制,可以抑制文件在任何时候都必须保持一致。
科达复制单位是一个卷。卷是一台服务器上存储的文件,并形成一个共享文件的名称空间的部分子树的集合。包含卷副本的一组服务器是它的卷存储组(VSG)。没有高度可用的数据可以存储在非复制的卷。科达还支持只读的复制卷,从AFS继承而来的一种功能。
对于缓存数据的卷,"Venus"保持目前访问的VSG的子集的追中。该子集被称为访问存储组(AVSG),在出现故障的情况下VSG是相同的。当它的操作超时,服务器将从AVSG删除。当Venus追中到他能与服务器重新建立连接通信时,将被重新加入AVSG。系统在故障模式下,根据客户的位置,不同的客户可能有不同AVSGs卷。
我们使用的复制策略是变种的一读,写的所有方法。当一个文件被修改后关闭后,将被转移到AVSG的所有成员。这种方法实现起来很简单,且每个复制站点在任何时候拥有当前数据的概率最大化。因为数据传播的负担在客户端,而不是服务器,服务器的CPU负载降到最低。这反过来又提高可扩展性,因为在多数分布式文件系统中CPU是瓶颈。这种方法要解决的主要缺点是同步传播延迟,在科达使用一个平行的远程过程调用机制。
服务缓存未命中时,客户端将从一个AVSG称为首选服务器成员获得数据。首选服务器可随意选择或基于性能标准,如物理接近,服务器的负载,或服务器CPU电源。虽然只能从一台服务器传输数据,也要与其他服务器联系,以验证首选的服务器确实有最新的数据副本。如果并非如此,AVSG成员将根据最新副本作出的首选网站,并通知AVSG的其他成员已经过时的副本。一旦数据被缓存在客户端,与首选服务器之间的回调将建立。
断链操作成为可能依赖服务器和客户端自主权的相互协调,开始时,没有一个VSG成员访问。与服务器上的复制不同,它提供多个副本的存储开销或复制协议的性能损失没有弹性。但断链时,仅提供客户端缓存数据的访问。当断链操作结束,断链卷的修改过的文件和目录将被提交至AVSG。
科达客户端视断链为一种临时的状态,并尽早恢复正常运作。正常和断开操作之间的过渡通常对用户是透明的。在正常操作中缓存未命中用户是透明的,只是在性能上有所损失。但断链将妨碍运算直到恢复正常运行或直到用户中止相应的文件系统调用。因此重要的是离线操作,以避免在高速缓存未命中。
在短暂的故障中,Venus通过LRU缓存策略避免断连缓存不命中可能就足够了。这是很可能发生的,如果一个用户正在编辑,且持续足够长的时间填充相关文件缓存。但客户端无法在断链时操作不在缓存中的文件。
当客户端主动与网络断开时,断连操作也可以是自愿的。这是可能发生的,例如,如果客户端是一台便携式个人计算机并且他的主任希望带它出行。有了一个大的磁盘高速缓存,用户可以从Coda服务器断开较长时间。他认为该文件的名称空间是不变的,但也要小心,对缓存的文件和目录的引用受到限制。不时地,客户端可能重新连接到网络,从而将修改操作传播至Coda服务器。
Coda通过提供正常和断连操作直接的无缝切换能力,因此分布式文件系统在无线领域的技术门槛可以得到简化。例如移动电话、无线分组、红外通信,无线媒体等。它们通常有距离限制,收到建筑物和视线的约束。
在1989年初,写作本文时,许多功能已经体现在Coda的原型中了。已经实现了服务器上的复制和断开操作的基本要素。一个可以落地的Coda客户端,并可执行Unix应用程序,无需重新编译和链接。当服务器崩溃或网络故障失去联系时,继续执行透明。在出现故障的情况下,使用Coda客户端与AFS客户端无异。
Andrew基准的初步测量表明,由于副本拷贝带来的性能下降是很小的。科达一个副本,与非复制卷相比下降5%。两三个副本,性能降低9%到11%。当三个副本时,Coda性能比执行一个本地Unix文件系统差28以上。应该强调,这些测量是来自原型,我们预期将会显著改善,以完善Coda。
随着用户对分布式文件系统依赖的升温,可用性成为分布式文件系统中关注的交点。Coda通过服务器副本复制和断连操作这两个机制来解决,以降低对系统性能的影响和应对故障的弹性。尽管Coda距离成熟还有一段距离,然后经验告诉我们,其设计好不逊色。