文件分为 data 和 index
public DLedgerMmapFileStore(DLedgerConfig dLedgerConfig, MemberState memberState) {
this.dLedgerConfig = dLedgerConfig;
this.memberState = memberState;
// 对应 data
this.dataFileList = new MmapFileList(dLedgerConfig.getDataStorePath(), dLedgerConfig.getMappedFileSizeForEntryData());
// 对应 file
this.indexFileList = new MmapFileList(dLedgerConfig.getIndexStorePath(), dLedgerConfig.getMappedFileSizeForEntryIndex());
localEntryBuffer = ThreadLocal.withInitial(() -> ByteBuffer.allocate(4 * 1024 * 1024));
localIndexBuffer = ThreadLocal.withInitial(() -> ByteBuffer.allocate(INDEX_UNIT_SIZE * 2));
flushDataService = new FlushDataService("DLedgerFlushDataService", logger);
cleanSpaceService = new CleanSpaceService("DLedgerCleanSpaceService", logger);
}
data 存储单纯的数据
index 每一个 entry 有固定的格式和大小,存储 data 的位置,任期和 index
// io.openmessaging.storage.dledger.store.file.DLedgerMmapFileStore#INDEX_UNIT_SIZE public static final int INDEX_UNIT_SIZE = 32;
/** * dataPos 数据的起始位置 * entrySize 数据大小 * magic 魔数 * nextIndex 当前下标 * currTerm 当前任期 * indexBuffer 装 index 的 byte 容器 */ DLedgerEntryCoder.encodeIndex(dataPos, entrySize, CURRENT_MAGIC, nextIndex, memberState.currTerm(), indexBuffer);
只有 leader 接收写数据 (append 请求),leader 把数据和 index 写入本地后,push 数据给 follower
关于数据的 push 和接收在 io.openmessaging.storage.dledger.DLedgerEntryPusher 类中
// io.openmessaging.storage.dledger.DLedgerEntryPusher#startup
public void startup() {
// 如果当前节点为 follower 角色,处理 leader 推送过来的消息
entryHandler.start();
// 如果当前节点为 leader 角色,处理 follower 节点对 push 数据的响应
quorumAckChecker.start();
// 如果当前节点为 leader 角色,在 3 节点集群中,则创建 2 个 EntryDispatcher,对应 2 个 follower,push 数据给 follower
for (EntryDispatcher dispatcher : dispatcherMap.values()) {
dispatcher.start();
}
}
dledger 接收请求并处理的数据流
io.openmessaging.storage.dledger.DLedgerRpcNettyService#processRequest io.openmessaging.storage.dledger.DLedgerRpcNettyService#handleAppend io.openmessaging.storage.dledger.DLedgerServer#handleAppend // 写入本地存储 io.openmessaging.storage.dledger.store.DLedgerStore#appendAsLeader // leader 推送给 followers io.openmessaging.storage.dledger.DLedgerEntryPusher#waitAck
来源:https://www.cnblogs.com/allenwas3/p/12448487.html