Zookeeper请求处理原理分析

数据在磁盘中的表示

假设我们现在在Zookeeper中有一个数据节点,节点名为 /datanode ,内容为 125 ,该节点是持久化节点,所以该节点信息会保存在文件中。

可能大家都会认为是类似下面这样方式保存在磁盘文件中的,方法一:

节点名 节点内容
/datanode 125

但是除开这种表示方法,还有另外一种表示方法, 快照+事务日志 ,比如方法二:

当前快照:

节点名 节点内容
/datanode 120

当前事务日志:

事务ID 操作 节点名 节点内容修改前 节点内容修改后
1000010 update /datanode 120 121
1000011 update /datanode 121 125

乍一看方法二比方法一要更复杂,并且占用的磁盘更多。但是我们上文提到过,Zookeeper集群中的节点在处理事务性请求时,需要将 事务操作 同步给其他节点,所以这里的事务操作是一定要进行持久化的,以便在同步给其他节点时出现异常进行补偿。所以就出现了 事务日志 。实际上事务日志还运行数据进行 回滚 ,这个在两阶段提交中也是非常重要的。

那么 快照 又有什么用呢?事务日志一定要有,但是随着时间的推移,日志肯定会越来越多,所以肯定不能持久化历史上所有的日志,所以Zookeeper会定时的进行 快照 ,并删除之前的日志。

那么如果按方法二这么存储数据,在对数据进行查询时就不太方便了。上文说到,Zookeeper为了提高数据的查询速度,会在内存中也存储一份数据,那么内存中的这份数据又该怎么存呢?