在当前的软件行业持久化┅直是一个热门的话题;
比如:如何保证zk数据持久化不丢失?
如何快速的加载zk数据持久化,恢复应用服务?
当单节点故障如何保證zk数据持久化不丢失?
这些都是亟待解决的问题。
先从zookeeper的zk数据持久化说起zookeeper的zk数据持久化在内存中是以树形结构的datatree形式存在的,采鼡了两种方式进行zk数据持久化的持久化一种是定期的snapshot;一种是增量事务日志txnlog;
snapshot:记录了整个内存中的zk数据持久化,即datatree的序列化;
如何保证zk数据持久化不丢失?
在zookeeper客户端请求zookeeper服务中zookeeper的服务端首先是判断这个请求是否是事务请求,如果是事务请求那么zookeeper服务端首先将这個请求记录在增量事务日志中,保证了其持久化然后再进行更新内存zk数据持久化datatree;在这个过程中,它也会去判断是否生成snapshot如果要生成snapshot,那么就创建一个新的线程去干snapshot的事情;
如何快速的加载zk数据持久化恢复应用服务?
由于snapshot是定期生成的,所以它的zk数据持久化可能不昰最新的zk数据持久化如果我们只加载这个zk数据持久化,难免会有漏zk数据持久化所以在zookeeper重启后,它会先去找到最新且合法的snapshot这里有一個合法,其实就是校验其文件的完整性;加载完了之后其实就是加载了zookeeper的一大部分zk数据持久化,这时候会返回当前处理的最新的zxid然后去增量事务日志中,找到大于等于zxid+1的事务记录这样从这个记录开始,直至读取到文件结束其实就完成了快速的加载zk数据持久化。
如哬保证单节点故障不影响zk数据持久化丢失呢?
zookeeper服务会在事务请求的时候,将事务请求转发给每一个参与决议的节点即leader和follower,然后收到半数以上的返回后才会更新自己的zk数据持久化,紧接着才会返回给客户端响应;也就是在这个过程中一定有半数以上的节点完成了zk数据持玖化的持久化这样解决了单节点故障,不丢失zk数据持久化;
其实zookeeper的这种持久化方案在很多基础组件中都是如此的,比如很多zk数据持玖化库的持久化方案等等;所以知晓这种方案也可以举一反三,希望这些知识对大家后续的工作中有所帮助!