Zookeeper请求处理原理分析
2015 年 1 月 10 日
数据在磁盘中的表示
假设我们现在在Zookeeper中有一个数据节点,节点名为 /datanode
,内容为 125
,该节点是持久化节点,所以该节点信息会保存在文件中。
可能大家都会认为是类似下面这样方式保存在磁盘文件中的,方法一:
节点名 | 节点内容 |
---|---|
/datanode | 125 |
但是除开这种表示方法,还有另外一种表示方法, 快照+事务日志 ,比如方法二:
当前快照:
节点名 | 节点内容 |
---|---|
/datanode | 120 |
当前事务日志:
事务ID | 操作 | 节点名 | 节点内容修改前 | 节点内容修改后 |
---|---|---|---|---|
1000010 | update | /datanode | 120 | 121 |
1000011 | update | /datanode | 121 | 125 |
乍一看方法二比方法一要更复杂,并且占用的磁盘更多。但是我们上文提到过,Zookeeper集群中的节点在处理事务性请求时,需要将 事务操作 同步给其他节点,所以这里的事务操作是一定要进行持久化的,以便在同步给其他节点时出现异常进行补偿。所以就出现了 事务日志 。实际上事务日志还运行数据进行 回滚 ,这个在两阶段提交中也是非常重要的。
那么 快照 又有什么用呢?事务日志一定要有,但是随着时间的推移,日志肯定会越来越多,所以肯定不能持久化历史上所有的日志,所以Zookeeper会定时的进行 快照 ,并删除之前的日志。
那么如果按方法二这么存储数据,在对数据进行查询时就不太方便了。上文说到,Zookeeper为了提高数据的查询速度,会在内存中也存储一份数据,那么内存中的这份数据又该怎么存呢?