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.編號越大在選擇演算法中的權重...