本篇是在学习BDB JE的使用、阅读源码并参读文档后的笔记,涉及到内部实现细节,写的比较零散,也有很多疏漏,仅作为笔记待查。
Berkeley DB JE简介及主要特点
Java版Berkeley DB,嵌入式数据库引擎,K/V存储,可提供高可用性(HA)。
日志结构存储(LFS),采用B+树存储节点,Evictor进行内存回收,Cleaner释放磁盘空间。
树的基本结构
日志文件
public static final String JE_SUFFIX = ".jdb"; // regular log files
public static final String DEL_SUFFIX = ".del"; // cleaned files
public static final String BAD_SUFFIX = ".bad"; // corrupt files
private static final String LOCK_FILE = "je.lck"; // lock file
/*
* The suffix used to denote a file that is in the process of being
* transferred during a network backup. The file may not have been
* completely transferred, or its digest verified.
*/
public static final String TMP_SUFFIX = ".tmp";
/*
* The suffix used to rename files out of the way, if they are being
* retained during a backup. Note that the suffix is used in conjunction
* with a backup number as described in <code>NetworkBackup</code>
*/
public static final String BUP_SUFFIX = ".bup";
非数据日志的文件:EnvironmentImpl.java中定义了INFO文件je.info,LoggerUtils.java将程序日志(区别于dbd中的数据日志)写到这些文件里面:
private static final String INFO_FILES = "je.info";
节点回收部分(Evictor)
Cleaner
几个记录文件利用率的类:
类UtilizationProfile,记录所有log文件的利用率。
类PackedOffsets,记录一组LSN的偏移量,在summary里用来标记废弃的entrys。
类FileSummary,记录每个log文件的利用率信息,在UtilizationProfile里使用。(summary)
类TrackedFileSummary,记录每个tracked的log文件的增量信息,对应一个FileSummary,并存储obsolete的entry的偏移量列表。(detail)
类DbFileSummary,记录每个db的每个文件的利用率信息,在相应的DatabaseImpl里使用。
类DbFileSummaryMap,文件fileNum到DbFileSummary的映射。
类 LNInfo ,记录被挂起或加锁的需要之后做 migrate 的叶节点,在 FileProcessor 里使用。
类FileProcessor执行清理操作,读取文件中所有entry,并决定entry是obsolete还是migration。LN的migration通过设置BIN实现,IN的migration通过标记dirty实现。简化流程如下:
1. 处理挂起的LN。2. 选择文件(类FileSelector,按利用率最低文件最老的规则选择)。3. 处理文件(对LN的处理-启用lazy migration时就标记它为migrate同时标记其bin为dirty,禁用lazy migration时就立即加锁执行migrate,若加锁失败则挂起;对IN的处理,标记为dirty。对每个要处理的LN和IN,都会再做一次obsolete验证)。4. 如果还有待处理的文件,继续步骤1.
小结
磁盘的有效entry比例大