Zookeeper原理分析之存储结构ZkDatabase
ZKDatabase在内存中维护了zookeeper的sessions, datatree和commit logs集合。 当zookeeper server启动的时候会将txnlogs和snapshots从磁盘读取到内存中。核心逻辑主要在方法ZkDatabase.loadDataBase()中实现,其代码如下:
/*** 将数据从磁盘加载到内存中,并将事物添加到内存中的提交日志中* @return 磁盘上最后一个有效的zxid* @throws IOException*/public long loadDataBase() throws IOException {PlayBackListener listener=new PlayBackListener(){public void onTxnLoaded(TxnHeader hdr,Record txn){Request r = new Request(null, 0, hdr.getCxid(),hdr.getType(),null, null);r.txn = txn;r.hdr = hdr;r.zxid = hdr.getZxid();addCommittedProposal(r);}};long zxid = snapLog.restore(dataTree,sessionsWithTimeouts,listener);initialized = true;return zxid;}
loadDataBase的流程如下:
- 构建一个PlayBackListener对象
- snapshot的反序列,倒叙排目录下的snapshot文件,遍历查找出最新的那个有效snapshot文件进行反序列化到内存。snapshot的反序列后我们会知道snapshot最新的zxid叫做lastProcessedZxid, 这个lastProcessedZxid之前的事务操作,都成功执行并序列到snapshot中可恢复到内存,lastProcessedZxid之后的操作只有事务日志,不能直接通过snapshot恢复。
snapLog.restore实现如下:
public long restore(DataTree dt, Map<Long, Integer> sessions, PlayBackListener listener) throws IOException {//从最近的快照中对数据树进行反序列化snapLog.deserialize(dt, sessions);//lastProcessedZxid+1从事务日志文件txnLog读取事务操作FileTxnLog txnLog = new FileTxnLog(dataDir);TxnIterator itr = txnLog.read(dt.lastProcessedZxid+1);long highestZxid = dt.lastProcessedZxid;TxnHeader hdr;try {while (true) {//遍历TxnIterator,执行processTransaction方法,就是把事务操作在内存中在执行一遍把丢失的操作补回来hdr = itr.getHeader();if (hdr == null) {//empty logs return dt.lastProcessedZxid;}if (hdr.getZxid() < highestZxid && highestZxid != 0) {LOG.error("{}(higestZxid) > {}(next log) for type {}",new Object[] { highestZxid, hdr.getZxid(),hdr.getType() });} else {highestZxid = hdr.getZxid();}try {processTransaction(hdr,dt,sessions, itr.getTxn());} catch(KeeperException.NoNodeException e) {throw new IOException("Failed to process transaction type: " +hdr.getType() + " error: " + e.getMessage(), e);}// 同时将事务操作通过PlayBackListener添加到commitedLog集合,commitedLog的事务操作在服务恢复的时候会同步到其他leaner server, 因为很有可能其他leaner server也没有及时的takesnapshotlistener.onTxnLoaded(hdr, itr.getTxn());if (!itr.next()) break;}} finally {if (itr != null) {itr.close();}}//返回最后的事务日志zxid给database,作为ZKDatabase的最新事物idreturn highestZxid;}
在zookeeperServer成功loadDatabase后,会及时主动的做一次takesnapshot操作来得到一份最新的内存影像。snapshot是内存数据的某个点一份影像,takeSnapshot操作还是很耗时,为了性能根据一下算法操作:
- 创建在同步处理器SyncRequestProcessor
- 100000/2 + random.nextInt(100000/2),这个十万是一个默认值可配置)计算出一个值,如果logCount大于这个值,就进行takeSnapshot操作
上面的算法存在一个问题, 那就是在非正常关机情况下,最新有效的那个snapshot并不是内存中最新的数据,所以需要利用txnLogs来把没有生成snapshot的操作在内存重新执行一边来恢复到非正常关闭服务那一刻内存情况。
转载于:https://www.cnblogs.com/senlinyang/p/8416515.html
Zookeeper原理分析之存储结构ZkDatabase相关推荐
- Java HashMap原理及内部存储结构
本文将通过如下简单的代码来分析HashMap的内部数据结构的变化过程. public static void main(String[] args) {Map<String, String> ...
- 结构体中初始化vector resize_Java-深入HashMap原理及内部存储结构
本文将通过如下简单的代码来分析HashMap的内部数据结构的变化过程. public static void main(String[] args) {Map<String, String> ...
- Apache Iceberg核心原理分析文件存储及数据写入流程
点击上方蓝色字体,选择"设为星标" 回复"面试"获取更多惊喜 全网最全大数据面试提升手册! 第一部分:Iceberg文件存储格式 Apache Iceberg作 ...
- Android面试题--HashMap原理分析
目录 一.序言 二 .HashMap原理分析 二.HashMap和Hashtable区别? 一.序言 作为Android程序员,出去找工作面试,HashMap应该是最常被问到的一种数据类型.那它是怎么 ...
- HashMap原理分析
HashMap 原理分析 文章目录 HashMap 原理分析 1.HashMap结构 2.散列哈希 3.容量table的计算 4.索引映射 5.put流程 6.扩容机制 HashMap 的原理在我们使 ...
- 解析redis存储结构丨 redis与mysql存储对比丨redis存储原理分析
90分钟视频讲解搞懂redis存储原理 1. redis与mysql存储对比 2. redis存储原理分析 3. redis存储与持久化的关系 [后端开发系列]解析redis存储结构丨 redis与m ...
- Hadoop生态圈-Zookeeper的工作原理分析
Hadoop生态圈-Zookeeper的工作原理分析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 无论是是Kafka集群,还是producer和consumer都依赖于Zoo ...
- ClickHouse内核分析-MergeTree的存储结构和查询加速
注:以下分析基于开源 v19.15.2.2-stable 版本进行 引言 ClickHouse是最近比较火的一款开源列式存储分析型数据库,它最核心的特点就是极致存储压缩率和查询性能,本人最近正在学习C ...
- 《MYSQL是怎样运行的》笔记|配置文件|系统变量|字符集|InnoDB存储结构|数据页结构|索引结构与使用|数据目录|表空间|连表原理|查询优化|BufferPool|事务|redo与undo|锁
<MYSQL是怎样运行的>笔记 前记: 历时15天,笔记+看书.完成于2022.2.5. 本书是讲具体的数据库实现,而数据库系统概念见:https://blog.csdn.net/qq_4 ...
最新文章
- 2017 04 04 省选模拟
- 北京大学AI写作机器人来了,会替代记者?
- 对NUnitAddIn做了下修改
- hdu 3879(最小割模型求解最大权闭合图)
- class ts 扩展方法_JUnit 5自定义扩展
- ArcGIS教程:Iso 聚类非监督分类
- 角距离恒星_恒星问卷调查的10倍机器学习生产率
- 一个、说到所有的扩展指标
- C语言?看女程序员是怎么往死里坑师兄的
- Android Studio(3)---Android Studio的配置
- 小白使用ubuntu杂记
- 树莓派之启用root密码
- 通过php jq ajax 提交form表单
- k-近邻算法进行回归拟合
- php图片颤抖,PHP-使用jquery 怎么做出图片的震荡效果
- 浅析百度有啊生活平台未来发展的八大潜力特征
- 浙江大学【面板数据分析与STATA应用】——第二讲长面板数据分析与机制识别方法
- 浏览器中网址访问过程详解
- Hadoop集群搭建(三)
- win2008 磁盘碎片整理
热门文章
- java 字符串优化_Java字符串优化
- 部署系统到linux服务器,若依管理系统部署到linux(上)
- Interpretation of 403 Bounded biharmonic weights
- 输入两个正整数m和n,用java求其最大公约数和最小公倍数
- 集成学习(三)——LightGBM
- 推荐系统思维导图——第一章
- tensorflow使用object detection实现目标检测超详细全流程(视频+图像集检测)
- SSD物体检测模型Keras版
- python again语句_【python笔记 二 】python语句
- recyclerview放不同的布局_RecyclerView系列之(2):为RecyclerView添加分隔线