关系经济人类预测化学自然
自然科学
知识物理
化学生物
地理解释
预测理解
本质社会
人类现象
行为研究
经济政治
心理结构
关系指导
人文遗产

Zookeeper事务日志预分配空间解读

5月1日 楚倾云投稿
  前言
  Zookeeper的通过快照日志和事务日志将内存信息保存下来,记录下来每次请求的具体信息。
  尤其是其事务日志,每次处理事务请求时都需要将其记录下来。
  Zookeeper事务日志的默认存储方式是磁盘文件,那么Zookeeper的总体性能就受限与磁盘文件的写入速度。
  针对这个瓶颈,Zookeeper做了什么优化操作呢,本文我们就一起来了解下。1。事务日志的预分配
  事务日志的添加,我们需要从FileTxnLog。append()方法看起publicclassFileTxnLogimplementsTxnLog{volatileBufferedOutputStreamlogSvolatileOutputAvolatileFileOutputS
  追加事务日志publicsynchronizedbooleanappend(TxnHeaderhdr,Recordtxn)throwsIOException{if(hdrnull){}
  if(hdr。getZxid()lastZxidSeen){LOG。warn(Currentzxidhdr。getZxid()islastZxidSeenforhdr。getType());}else{lastZxidSeenhdr。getZxid();}
  默认logStream为空if(logStreamnull){if(LOG。isInfoEnabled()){LOG。info(Creatingnewlogfile:Util。makeLogName(hdr。getZxid()));}
  以下代码为创建事务日志文件根据当前事务ID来创建具体文件名,并写入文件头信息logFileWritenewFile(logDir,Util。makeLogName(hdr。getZxid()));fosnewFileOutputStream(logFileWrite);logStreamnewBufferedOutputStream(fos);oaBinaryOutputArchive。getArchive(logStream);FileHeaderfhdrnewFileHeader(TXNLOGMAGIC,VERSION,dbId);fhdr。serialize(oa,fileheader);Makesurethatthemagicnumberiswrittenbeforepadding。logStream。flush();filePadding。setCurrentSize(fos。getChannel()。position());streamsToFlush。add(fos);}预分配代码在这里filePadding。padFile(fos。getChannel());byte〔〕bufUtil。marshallTxnEntry(hdr,txn);if(bufnullbuf。length0){thrownewIOException(Faultyserializationforheaderandtxn);}ChecksumcrcmakeChecksumAlgorithm();crc。update(buf,0,buf。length);oa。writeLong(crc。getValue(),txnEntryCRC);Util。writeTxnBytes(oa,buf);
  }}
  创建FileTxnLog对象时,其logStream属性为null,所以当第一次处理事务请求时,会先根据当前事务ID来创建一个文件。1。1事务日志预分配publicclassFilePadding{longpadFile(FileChannelfileChannel)throwsIOException{针对新文件而言,newFileSize64MlongnewFileSizecalculateFileSizeWithPadding(fileChannel。position(),currentSize,preAllocSize);if(currentSize!newFileSize){将文件扩充到64M,全部用0来填充fileChannel。write((ByteBuffer)fill。position(0),newFileSizefill。remaining());currentSizenewFileS}returncurrentS}
  size计算publicstaticlongcalculateFileSizeWithPadding(longposition,longfileSize,longpreAllocSize){IfpreAllocSizeispositiveandwearewithin4KBoftheknownendofthefilecalculateanewfilesize初始时候position0,fileSize为0,preAllocSize为系统参数执行,默认为64Mif(preAllocSize0position4096fileSize){IfwehavewrittenmorethanwehavepreviouslypreallocatedweneedtomakesurethenewfilesizeislargerthanwhatwealreadyhaveQ:这里确实没看懂。。。if(positionfileSize){fileSizepositionpreAllocSfileSizefileSizepreAllocS}else{fileSizepreAllocS}}
  returnfileS}}
  预分配的过程比较简单,就是看下当前文件的剩余空间是否4096,如果是,则扩容。
  Q:
  这里有一个不太明白的问题,positionfileSize的场景是怎样的呢?2。创建新的事务日志文件时机
  通过上述代码分析我们知道,当logStreamnull时,就会创建一个新的事务日志文件,那么logStream对象什么时候为空呢?
  搜索代码,只看到FileTxnLog。rollLog()方法会主动将logStream设置为nullpublicclassFileTxnLogimplementsTxnLog{publicsynchronizedvoidrollLog()throwsIOException{if(logStream!null){this。logStream。flush();this。logS}}}
  那么根据这个线索,我们来搜索下rollLog的调用链
  SyncRequestProcessor。run()ZKDatabase。rollLog()FileTxnSnapLog。rollLog()FileTxnLog。rollLog()
  最终看到是在SyncRequestProcessor。run()方法中发起调用的,而且只有这一条调用链,我们来分析下2。1SyncRequestProcessor。run()publicclassSyncRequestProcessorextendsZooKeeperCriticalThreadimplementsRequestProcessor{publicvoidrun(){try{intlogCount0;
  setRandRoll(r。nextInt(snapCount2));while(true){。。。if(si!null){追加事务日志if(zks。getZKDatabase()。append(si)){logCif(logCount(snapCount2randRoll)){setRandRoll(r。nextInt(snapCount2));注意:在这里发起了rollLogzks。getZKDatabase()。rollLog();。。。}}elseif(toFlush。isEmpty()){。。。}toFlush。add(si);if(toFlush。size()1000){flush(toFlush);}}}}catch(Throwablet){handleException(this。getName(),t);}LOG。info(SyncRequestProcessorexited!);}}
  需要注意下rollLog()方法执行的条件,就是logCount(snapCount2randRoll)
  snapCount是一个系统参数,System。getProperty(zookeeper。snapCount),默认值为100000
  randRoll是一个随机值
  那么该条件触发的时机为:处理的事务请求数至少要大于50000。
  这时就出现了一个笔者无法理解的情况:
  通过对事务日志的观察可以看到其都是64M,而至少处理50000次事务请求后,Zookeeper才会分配一个新的事务日志文件,那么这个snapCount是一个经验值嘛?
  如果事务请求的value信息都很大,那么可能到不了50000次,就会超过64M,理论上应该要创建一个新的文件了,但是貌似并没有,这个该怎么处理呢?
  如果事务请求value信息都很小,那么即使到了50000次,也不会超过64M,那么之前预分配的文件大小就浪费了一部分。总结
  以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
搜索 投诉 评论 转载

Zookeeper事务日志预分配空间解读前言Zookeeper的通过快照日志和事务日志将内存信息保存下来,记录下来每次请求的具体信息。尤其是其事务日志,每次处理事务请求时都需要将其记录下来。Zook……暖春一抹黄,黄花风铃木又开了陈捍南春光明媚,春花烂漫。热烈艳红的桃花还在枝头上招展,同样热烈的黄花风铃也仿佛在一夜间开放了,争相向人们报送春的消息。通向大亭花园、道周公园支路两侧黄花风铃木,鲜黄的花朵挂满黄花风……金鸡奖半个娱乐圈都参加,热闹非凡,金马奖却无人问津沦为自嗨奖11月10日一大早,各大社交平台的头条都被半个娱乐圈的明星齐聚厦门刷屏。而这些明星之所以聚集在厦门的根本原因,就是来参加即将举办的金鸡奖颁奖典礼。对于大荧幕电影演员来说,……春季养肝正当时,建议多吃这6道菜,简单又营养,越吃越健康春季肝气足、肝火旺,中医里春季在五行中属木,人体的五脏中肝也属木,所以春天最适合养肝。春季养肝应该多吃凉性食材,养肝要找准3个大方向:1、以脏养肝:中医讲究以形补形,因此……宝宝第一次上幼儿园,做好这些准备,孩子不哭不闹情绪好我是一个全职妈妈,一个不断实现自我价值的全职妈妈。拒绝焦虑,拒绝内卷,轻松育儿,理性对待婚姻生活,宽容应对婆媳关系,希望我的一些观点能够让你豁然开朗,能够带给你正能量,解决你的……NBA75周年,751巨星,啥呀最近几天喜欢篮球的哥们最开心的事情,可能就是吐槽NBA75周年,75大巨星的评选,还有网上爆的各种落选球员互相调侃的视频和笑话了。唉!哥说实话看球也有二十多年了,突然发现现在的……无法全力防守!盘点NBA造犯规最强的十大球星前三名实至名归在NBA最轻松的得分方式就是罚球了,因为在罚球时,没人会干扰你,只需要克服自己的问题,就能够将球罚进,但在NBA获得罚球的机会并不容易,因为NBA球员的防守都很好,并不会随意犯……女乒最新世界排名,刘诗雯跌出前十,孙颖莎逼近陈梦有望登顶第一休斯顿世乒赛和WTT世界杯赛结束后,国际乒联又一次更新了世界排名,这一次,受益于世乒赛和WTT世界杯赛积分的变化,球员们的排名又有了新的变化。男乒且不谈,只说女乒!……打了3场球了!状元王岚嵚的表现如何?西热啊,赶紧扶正他吧场均登场24。3分钟,能拿到13。7分4。7篮板3。3助攻2。7抢断,三项命中率分别为55。2、50、80。这是CBA新科状元王岚嵚,CBA生涯前3场比赛的表现。具……暴雪正式关闭,十多年的青春导出电子骨灰盒也仅有区区几十Kb罢大年初三。0点时分,暴雪国服游戏正式关闭了。包括《魔兽世界》《炉石传说》《守望先锋》《暗黑破坏神III》《魔兽争霸III:重制版》《风暴英雄》《星际争霸》在内的一系……哈登缺阵热火大胜75人恩比德空砍2215热火替补打爆75人76人:马克西、塞布尔、科克马兹、哈里斯、恩比德热火:文森特、邓罗、巴特勒、塔克、阿德巴约前情回顾:76人暂列东部第二战绩是39胜23负,热火暂列东部第一战绩……那些年横行江湖的中场组合,典礼三中场领衔随着皇马中场卡塞米罗以总价7000万欧元的转会费加盟曼联,曾为皇马赢得4座欧冠冠军奖杯的典礼三中场就此消失于江湖。本文来盘点一下近20年来有哪些中场组合曾经横行江湖,有你熟悉的……
中国宝武的弯弓搭箭布局痛风中医的五种证型,治疗方药和日常护理大全南昆山十字水奢华度假村推出5星特惠,超值两间房,终于住得起到底选什么样的打印机,这是现在很多上网课的家长头疼的问题动力电池企业扎堆上市2021年接近尾声,这十句话,送给正在奋斗的你炉石传说冷饭两年一次,为什么巨龙年这么成功,狮鹫年却拉了?47岁孩子只有想象力,不会画一定要试试这个办法顺产宝宝后三个月了,现在可以用束腹带吗,每天可以用几个小时?气候投融资通州试点区长上阵答辩,绿色金融开启加速度向死而生的追寻郭艾伦2313张镇麟28分辽宁17分逆转山西20进四强将战广
哈利波特顺序(哈利波特系列电影正确顺序)热传聚热点网 当女生有四个小动作的时候,一追就到手,你可要抓紧喽携手合作保卫蓝天幼儿园班务工作总结结婚二十六周年是什么婚还我沂蒙青山绿水宝宝的长相智商都遗传谁?备孕前夫妻俩就要知道这些事寒性体质如何调理其实很简单只需生姜和蜂蜜两件物品糖尿病准妈妈什么时候安度孕期如何看待父母普遍讨厌孩子玩游戏?金沙造句用金沙造句大全开发商从这5个方面看待得房率

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找菏泽德阳山西湖州宝鸡上海茂名内江三亚信阳长春北海西安安徽黄石烟台沧州湛江肇庆鹤壁六安韶关成都钦州