您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“分布式系統(tǒng)設(shè)計(jì)模式的分割日志原理是什么”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
將大文件切分為更容易處理的多個(gè)更小的文件。
單一的日志文件可能會增長到很大,并且在程序啟動時(shí)讀取從而成為性能瓶頸。老的日志需要定時(shí)清理,但是對于一個(gè)大文件進(jìn)行清理操作很費(fèi)勁。
將單一日志切分為多個(gè),日志在達(dá)到一定大小時(shí),會切換到新文件繼續(xù)寫。
//寫入日志 public Long writeEntry(WALEntry entry) { //判斷是否需要另起新文件 maybeRoll(); //寫入文件 return openSegment.writeEntry(entry); } private void maybeRoll() { //如果當(dāng)前文件大小超過最大日志文件大小 if (openSegment. size() >= config.getMaxLogSize()) { //強(qiáng)制刷盤 openSegment.flush(); //存入保存好的排序好的老日志文件列表 sortedSavedSegments.add(openSegment); //獲取文件最后一個(gè)日志id long lastId = openSegment.getLastLogEntryId(); //根據(jù)日志id,另起一個(gè)新文件,打開 openSegment = WALSegment.open(lastId, config.getWalDir()); } }
如果日志做了切分,那么需要快速以某個(gè)日志位置(或者日志序列號)定位到某個(gè)文件的機(jī)制??梢酝ㄟ^兩種方式實(shí)現(xiàn):
每一個(gè)日志切分文件的名稱都是包含特定開頭以及日志位置偏移量(或者日志序列號)
每一個(gè)日志序列號包含文件名稱以及 transaction 偏移。
//創(chuàng)建文件名稱 public static String createFileName(Long startIndex) { //特定日志前綴_起始位置_日志后綴 return logPrefix + "_" + startIndex + "_" + logSuffix; } //從文件名稱中提取日志偏移量 public static Long getBaseOffsetFromFileName(String fileName) { String[] nameAndSuffix = fileName.split(logSuffix); String[] prefixAndOffset = nameAndSuffix[0].split("_"); if (prefixAndOffset[0].equals(logPrefix)) return Long.parseLong(prefixAndOffset[1]); return -1l; }
在文件名包含這種信息之后,讀操作就分為兩步:
給定一個(gè)偏移(或者 transaction id),獲取到大于這個(gè)偏移日志所在文件
從文件中讀取所有大于這個(gè)偏移的日志
//給定偏移量,讀取所有日志 public List<WALEntry> readFrom(Long startIndex) { List<WALSegment> segments = getAllSegmentsContainingLogGreaterThan(startIndex); return readWalEntriesFrom(startIndex, segments); } //給定偏移量,獲取所有包含大于這個(gè)偏移量的日志文件 private List<WALSegment> getAllSegmentsContainingLogGreaterThan(Long startIndex) { List<WALSegment> segments = new ArrayList<>(); //Start from the last segment to the first segment with starting offset less than startIndex //This will get all the segments which have log entries more than the startIndex for (int i = sortedSavedSegments.size() - 1; i >= 0; i--) { WALSegment walSegment = sortedSavedSegments.get(i); segments.add(walSegment); if (walSegment.getBaseOffset() <= startIndex) { break; // break for the first segment with baseoffset less than startIndex } } if (openSegment.getBaseOffset() <= startIndex) { segments.add(openSegment); } return segments; }
“分布式系統(tǒng)設(shè)計(jì)模式的分割日志原理是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。