当创建一个新的znode时,你必须指定一个模式。不同的模式决定了znode不同的行为。
持久化的和临时的
一个znode节点要么是持久化的要么是临时的。一个持久化的znode节点只能通过调用delete方法来删除。相对的,一个临时的znode节点会在创建它的客户端奔溃或者断掉与zookeeper的连接时自动删除。
当应用需要在znode节点存储一些数据,同时这些数据在它们的创建者不再是系统的一部分时也需要得到保留时,持久化的znode节点就很有用了。比如,在master-worker的例子中,即使分配任务的master奔溃,我们也要维护分配给worker的任务指派关系。
临时zode节点的心智是只有当会话的创建者工作正常时,应用的某些部分必须存在。比如,master-worker例子中的master节点就是临时的。它的存在暗示着现在有一个master,并且它在运行中。如果master没有了而master节点还存在的话,那么系统就探测不到master奔溃了。这样会阻止系统继续运行,所以master节点必须和master一起消失。我们也可以用临时节点代表worker。如果一个worker不可用了,它的会话就会超时,同时它在\/workers下面的节点也会自动消失。
一个临时节点会在以下两种情况下被删除:
- 当客户端创建者的会话终结时,要么超时,要么被显示的关闭了。
- 当一个客户端删除它,不一样要是创建者。
因为临时节点在创建者会话超时时会删除,因此不允许临时节点有子节点。关于临时节点是否可以拥有临时子节点这个问题在社区里面有过很多讨论。这个特性在将来可能会成为现实,但是现在还不可用。
顺序化节点
一个znode节点可以被设置为顺序化的。一个顺序化节点可以被设置为唯一的、单调递增的int值。顺序号被追加在创建znode节点的路径后面。例如,如果一个客户端创建了一个以\/tasks\/task-开通的顺序节点,zookeeper会为它指派一个顺序号,比如说1,并把它追加到路径的后面。那么这个节点的路径就变为了\/tasks\/task-1.顺序节点提供了一种创建拥有独一无二名字节点的方式,同时,也很容易看得出来创建的顺序。
总之,一个znode节点有四种模式:持久化、临时的、持久顺序化和临时顺序化。