前面聊了如何使用一致性算法保证集群的可用性,接下来我们聊聊基于这类算法构建的基础服务案例:Zookeeper。
之前我们聊到复制状态机,相同序列 log 可让机器到达相同结果状态。类似于 Raft 这种一致性算法只是保证了多台机器的可用性,并没有规定 log 的内容,类似于计算机网络分层模型,传输层保证了数据的可好传输,而我们在此之上构建何种应用则属于应用层的事情。
Zookeeper 可以看做提供了一个分布式且保证了操作一致性的文件系统,其设计目标不是像 GFS 一样管理大量大文件,而是以文件系统的目录和文件作为基本数据结构,提供一系列 API,方便用户构建自己的分布式服务。
相对于普通的目录,Zookeeper 提供四种类型:
PERSISTENT:持久化目录节点,这个目录节点存储的数据不会丢失;
PERSISTENT_SEQUENTIAL:顺序自动编号的目录节点,这种目录节点会根据当前已经存在的节点数自动加 1,然后返回给客户端已经成功创建的目录节点名;
EPHEMERAL:临时目录节点,一旦创建这个节点的客户端与服务器端连接超时,这种节点会被自动删除;
EPHEMERAL_SEQUENTIAL:临时自动编号节点。
这些特性显然是为方便分布式系统开发而设计的,比如 SEQUENTIAL
将 select 和 自增 合二为一个原子操作;EPHEMERAL
则用目录的存在与否代表创建改目录的机器的连接状态。
举个例子,全局锁。
首先在在创建 /Lock/ 创建一个 EPHEMERAL_SEQUENTIAL
类型的目录,会得到新创建的目录序列号 Index,然后在查看 /Lock/ 下面最小的目录序列号是不是 Index,若是则代表获得锁,操作结束后,删除 Index 目录,即可释放锁。若有比 Index 小的目录,则监听这些目录的变化,直到 Index 是做小的目录。
本文旨在为分布式系统知识架构中以 Zookeeper 为例解释复制一致性模型的应用,没有面面俱到,深入了解可参考论文,其详细描述了这个系统的目标,设计思路,实践经验,性能分析。