本章开始讲解Zookeeper重要的技术实现,前面两篇Zookeeper的原理(3)和Zookeeper的原理(4)分别讲解了客户端和服务端的设计原理,这一篇我们来聊聊Zookeeper的内存与存储以及运维的问题。
内存与存储
ZKDatabase是ZooKeeper的内存数据库,负责管理ZooKeeper的所有会话、DataTree存储和事务日志。ZKDatabase会定时向磁盘dump快照数据,同时在ZooKeeper服务器启动的时候,会通过磁盘上的事务日志(在dataLogDir配置路径下的version-2的子目录中)和快照数据文件恢复成一个完整的内存数据库。
ZooKeeper的数据模型是一棵树,DataTree是ZooKeeper内存数据存储的核心,是一个“树”的数据结构,代表了内存中的一份完整的数据。DataTree不包含任何与网络、客户端连接以及请求处理等相关的业务逻辑,是一个非常独立的ZooKeeper组件。
DataNode是数据存储的最小单元,除了保存了节点的数据内容(data[])、ACL列表(acl)和节点状态(stat)之外,还记录了父节点(parent)的引用和子节点列表(children)两个属性。同时,DataNode还提供了对子节点列表操作的各个接口。
下图是数据初始化的流程:
运维
四字命令
四字命令的使用方式非常简单,通常有两种方式:第一种是通过Telnet方式,第二种则是使用nc方式。
conf:输出 ZooKeeper服务器运行时使用的基本配置信息。
|
|
cons:输出当前这台服务器上所有客户端连接的详细信息。
|
|
crst:重置所有的客户端连接统计消息。
|
|
dump:输出当前集群的所有会话信息
|
|