Zookeeper之FileTxnLog原始碼分析

2021-10-06 02:19:14 字數 2632 閱讀 7065

if (hdr == null)

if (hdr.getzxid() <= lastzxidseen) is <= {} for {}",

hdr.getzxid(),

lastzxidseen,

hdr.gettype());

} else

if (logstream == null) ", util.makelogname(hdr.getzxid()));

logfilewrite = new file(logdir, util.makelogname(hdr.getzxid()));

fos = new fileoutputstream(logfilewrite);

logstream = new bufferedoutputstream(fos);

oa = binaryoutputarchive.getarchive(logstream);

fileheader fhdr = new fileheader(txnlog_magic, version, dbid);

fhdr.serialize(oa, "fileheader");

// make sure that the magic number is written before padding.

logstream.flush();

filepadding.setcurrentsize(fos.getchannel().position());

streamstoflush.add(fos);

} filepadding.padfile(fos.getchannel());

byte buf = util.marshalltxnentry(hdr, txn, digest);

if (buf == null || buf.length == 0)

checksum crc = makechecksumalgorithm();

crc.update(buf, 0, buf.length);

oa.writelong(crc.getvalue(), "txnentrycrc");

util.writetxnbytes(oa, buf);

return true;

}**中filepadding.padfile(fos.getchannel());可以看到呼叫了該方法,**如下:

long padfile(filechannel filechannel) throws ioexception 

return currentsize;

}

其主要作用是當檔案大小不滿64mb時,向檔案填充0以達到64mb大小。

public static file getlogfiles(file logdirlist, long snapshotzxid) 

// the files

// are sorted with zxid's

if (fzxid > logzxid)

} listv = new arraylist(5);

for (file f : files)

v.add(f);

} return v.toarray(new file[0]);

}

說明:該函式的作用是找出剛剛小於或者等於snapshot的所有log檔案。其步驟大致如下。

public long getlastloggedzxid() 

txnheader hdr = itr.getheader();

zxid = hdr.getzxid();

} } catch (ioexception e) finally

return zxid;

}

說明:該函式主要用於獲取記錄在記憶體log中的最後乙個zxid。其步驟大致如下

public synchronized void commit() throws ioexception 

for (fileoutputstream log : streamstoflush)

log.warn(

"fsync-ing the write ahead log in {} took {}ms which will adversely effect operation latency."

+ "file size is {} bytes. see the zookeeper troubleshooting guide",

thread.currentthread().getname(),

syncelapsedms,

channel.size());

}servermetrics.getmetrics().fsync_time.add(syncelapsedms);

} }while (streamstoflush.size() > 1)

// roll the log file if we exceed the size limit

if (txnlogsizelimit > 0) ", logsize);

rolllog();

} }}

說明:該函式主要用於提交事務日誌至磁碟,其大致步驟如下

Zookeeper之工作原理

zookeeper是乙個分布式的,開放原始碼的分布式應用程式協調服務,它包含乙個簡單的原語集,分布式應用程式可以基於它實現同步服務,配置維護和命名服務等。zookeeper是hadoop的乙個子專案,其發展歷程無需贅述。在分布式應用中,由於工程師不能很好地使用鎖機制,以及基於訊息的協調機制不適合在某...

zookeeper學習之簡述

概況 zookeeper是乙個分布式的,開放原始碼的分布式應用程式協調服務,是google的chubby乙個開源實現,是hadoop和hbase的重要元件。它是乙個為分布式應用提供一致性服務的軟體,提供的功能包括 配置維護 網域名稱服務 分布式同步 組服務等。用途 常用來管理資料,例如作為dubbo...

zookeeper之選舉機制

所謂zookeeper選舉機制是指在zookeeper集群中,有leader角色,有fellower角色,是如何進行角色分配的 zookeeper預設的演算法是fastleaderelection 採用投票數大於半數則勝出 1.比如有三颱伺服器,編號分別為1,2 3 2.編號越大在選擇演算法中的權重...