Chubby系统本质上就是一个分布式的和存储大量小文件的文件系统,它所有操作都是在文件的基础上完成的。例如,在Chubby中最常用的锁服务中,每一个文件就代表了一个锁,用户通过打开、关闭和读取文件,获取共享(Shared)锁或独占(Exclusive)锁。选举主服务器的过程中,符合条件的服务器都同时申请打开某个文件并请求锁住该文件。成功获得锁的服务器自动成为主服务器并将其地址写入这个文件夹,以便其他服务器和用户可以获知主服务器的地址信息。

    Chubby 的文件系统和UNIX类似。例如,在文件名“/Is/foo/wombat/pouch”中,ls 代表lock service,这是所有 Chubby文件系统的共有前缀;foo是某个单元的名称;/wombat/pouch则是 foo 这个单元上的文件目录或者文件名。由于Chubby自身的特殊服务要求,Google对Chubby 做了一些与UNIX 不同的改变。例如:Chubby不支持内部文件的移动;不记录文件的最后访问时间;另外在Chubby中并没有符号连接(Symbolic Link,又叫软连接,类似于Windows系统中的快捷方式)和硬连接(Hard Link,类似于别名)的概念。在具体实现时,文件系统由许多节点组成,分为永久型临时型,每个节点就是一个文件或目录。节点中保存着包括ACL (Access Control List,访问控制列表)在内的多种系统元数据。为了用户能够及时了解元数据的变动,系统规定每个节点的元数据都应当包含以下四种单调递增的64位编号:
    (1)实例号(Instance Number):新节点实例号必定大于旧节点的实例号。
    (2)内容生成号(Content Generation Number):文件内容修改时该号增加。
    (3)锁生成号(Lock Generation Number):锁被用户持有时该号增加。
    (4)ACL生成号(ACL Generation Number):ACL名被覆写时该号增加。
    用户在打开某个节点时就会获取一个类似于UNIX中文件描述符(File Descriptor)的句柄(Handles),这个句柄由以下三部分组成:
    (1)校验数位(Check Digit):防止其他用户创建或猜测这个句柄。
    (2)序号(Sequence Number):用来确定句柄是由当前还是以前的主服务器创建的。
    (3)模式信息(Mode Information):用于新的主服务器重新创建一个旧的句柄。

    在实际的执行中,为了避免所有的通信都使用序号带来的系统开销增长,Chubby引入了sequencer的概念。sequencer实际上就是一个序号,只不过这个序号只能由锁的持有者在获取锁时向系统发出请求来获得。这样一来Chubby系统中只涉及锁的操作才需要序号,其他一概不用。在文件操作中,用户可以将句柄看作一个指向文件系统的指针。这个指针支持一系列的操作,常用的句柄操作函数如表所示:

    6709FB31D4B284CD4755B80E12B8EF5D.jpg
    98CE63D840AA87C36957A3DF7972E8F1.jpg