首页 > 编程语言 >【源码阅读】5. 元数据

【源码阅读】5. 元数据

时间:2023-06-25 19:12:20浏览次数:36  
标签:DB txId checkpoint BDBJE 源码 FE 阅读 日志 数据

 

通常操作元数据时,会首先更新一条内存数据,然后写入一条元数据更新日志。

这样在重启时,通过顺序回放元数据更新日志,即可在内存中重构完整的元数据。

Doris一般使用BDBJE存放元数据的更新日志。在记录到达一定数量会在BDBJE中生成新的DB(本质是checkpoint分割点)

...

...

DB2

Log 19999

...

Log 10001

Log 10000

DB1

Log 9999

...

Log 2

Log 1

 

初始化

FE在使用BDBJE做元数据更新日志时,首先会在FE启动阶段初始化BEBJE的相关事宜:

● 构建ReplicatedEnvironment环境(BDBJE本身)

● 在BDBJE中查找数据库,并打开最后的那个数据库以供写入

● 设置写入的nextJournalId,以便下次写入时能得到正确的序列号

 

单机版BDBJE

元数据写入

EditLog.logEdit是元数据写入的方法,在其中

● 使用BDBJEJournal.write写入日志

● 自增txId

● 如果txId达到阈值则rollEditLog,在BDBJE中新建一个DB

 

 

EditLog.logEdit

    private synchronized void logEdit(short op, Writable writable) {
        journal.write(op, writable);

        // get a new transactionId
        txId++;

        if (txId >= Config.edit_log_roll_num) {
            LOG.info("txId {} is equal to or larger than edit_log_roll_num {}, will roll edit.", txId,
                    Config.edit_log_roll_num);
            rollEditLog();
            txId = 0;
        }
    }
 

BDBJEJournal.write

    public synchronized void write(short op, Writable writable) throws IOException {
        JournalEntity entity = new JournalEntity();
        entity.setOpCode(op);
        entity.setData(writable);

        // id is the key
        long id = nextJournalId.getAndIncrement();
        Long idLong = id;
        DatabaseEntry theKey = new DatabaseEntry();
        TupleBinding<Long> idBinding = TupleBinding.getPrimitiveBinding(Long.class);
        idBinding.objectToEntry(idLong, theKey);

        // entity is the value
        DataOutputBuffer buffer = new DataOutputBuffer(OUTPUT_BUFFER_INIT_SIZE);
        entity.write(buffer);

        DatabaseEntry theData = new DatabaseEntry(buffer.getData());
        if (currentJournalDB.put(null, theKey, theData) == OperationStatus.SUCCESS) {
            ...
        }
    }
 

Replay

以上实现了Doris元数据的持久化,FE节点宕机以后元数据不会丢失。遗留的问题还有:

● 日志越多,回放越慢

● 单节点故障如何保障高可用

 

Checkpoint

背景

如何保障FE的启动速度是通过checkpoint机制。定期将BDBJE中的日志合并成一个image,在启动时先加载image文件,从image后面那一条日志开始回放新的日志。

 

如何做

当BDBJE中新生成一个DB时,它会承接新的日志记录任务,前一个DB中的内容不会再发生变更,此时我们checkpoint到前一个DB结束即可,checkpoint文件的名字就是它记录的日志的位置。

Master FE会有一个定期任务,定期比较最新的checkpoint文件名与BDBJE前一个DB的最后一个日志位置,如果发现BDBJE前一个DB的最后一个日志位置更大,则说明可以做checkpoint。

● 先加载最新的checkpoint文件

● 回放到前DB的最后

● 将内存中的文件保存为checkpoint

● 其他FE拉取image

● 删除过期Database

● 删除过期image

和镜像相关的类为MetaPersistMethod

 

 

 

 

 

 

标签:DB,txId,checkpoint,BDBJE,源码,FE,阅读,日志,数据
From: https://www.cnblogs.com/xutaoustc/p/17503728.html

相关文章

  • 【源码阅读】90. 插件
     系统相关类PluginLoader:插件的加载类,封装了插件信息、配置加载、安装过程。包含如下组件:● PluginInfo:含有插件的基本信息● Plugin接口:插件初始化接口● AuditPlugin接口:包含审计类型插件关联的操作 初始化PluginMgr.init初始化时将构建内置插件AuditLogBuilde......
  • 【源码阅读】3. 建表
    |KW_CREATEopt_external:isExternalKW_TABLEopt_if_not_exists:ifNotExiststable_name:nameLPARENcolumn_definition_list:columnsCOMMAindex_definition_list:indexesRPARENopt_engine:engineNameopt_keys:keysopt_comment......
  • 【源码阅读】4. Stream Load 导入任务的执行流程
     FE起手路由在访问curl--location-trusted-uroot:-Ttest.csv-H"column_separator:,"http://127.0.0.1:8030/api/demo/example_tbl/_stream_load时,FE如下操作:● 检查用户名密码● 检查权限● 随机选择一个BE,Redirect到这个BE上 BE_stream_load的handler......
  • Bert Pytorch 源码分析:二、注意力层
    #注意力机制的具体模块#兼容单头和多头classAttention(nn.Module):"""Compute'ScaledDotProductAttention""" #QKV尺寸都是BS*ML*ES #(或者多头情况下是BS*HC*ML*HS,最后两维之外的维度不重要) #从输入计算QKV的过程可以统一处理,不必......
  • 【源码阅读】2. Catalog和Database
     Catalog创建|KW_CREATEKW_CATALOGopt_if_not_exists:ifNotExistsident:catalogNameopt_properties:properties{:RESULT=newCreateCatalogStmt(ifNotExists,catalogName,null,properties);:}|KW_CREATEKW_CATALOGopt_if_not_......
  • 智慧垃圾分类大数据可视化监管系统
    前言随着城市化进程的不断加快和居民生活水平的日益提高,城市生活垃圾产生量亦在与日剧增。建设背景随着城镇化进程加速、人民生活水平持续提升,城市生活垃圾产生量也在逐年增长。生活垃圾是“放错地方的资源”,能否处理好这些“放错地方的资源”,关系着城乡人居生态环境,综合处理、......
  • 智慧垃圾分类大数据可视化监管系统
    前言随着城市化进程的不断加快和居民生活水平的日益提高,城市生活垃圾产生量亦在与日剧增。建设背景随着城镇化进程加速、人民生活水平持续提升,城市生活垃圾产生量也在逐年增长。生活垃圾是“放错地方的资源”,能否处理好这些“放错地方的资源”,关系着城乡人居生态环境,综合处......
  • 【源码阅读】1. 配置、VARIABLE与用户PROPERTY
     配置初始化在FE启动时:● Config类ConfField注解标记的静态属性反射出Field存储到内存confFields,作为一个可读取和修改的属性列表(真正的值存储在Config类的静态属性中,反射出Field并存储到confFields只是一个读取和修改指针而已)● 读取配置文件,根据配置文件内容,设置Confi......
  • 2023年6月25日 汇川H5UPLC突发生异常,无报警,无警告。数据丢失!
    2023年6月25日多线切割机问题描述:在人工绕线过程中,设备突发跳电,控制电源正常,动力电源接触器跳开。发现PLC报警异常。链接PLC后,发现数据全部丢失(归零)。重新上电后,输入数据,设备恢复正常运行。疑点方向:能引起数据清理的错误,首先怀疑寄存器溢出导致运算错误。还有设备本身线的长......
  • SMBIOS(System Management BIOS)是一种在计算机系统中提供硬件信息的规范,定义了一组结构
    SMBIOS(SystemManagementBIOS)是一种在计算机系统中提供硬件信息的规范,定义了一组结构化的数据格式,用于描述计算机系统的硬件配置。SMBIOS版本即指SMBIOS规范的版本号。SMBIOS规范由DMI(DesktopManagementInterface)工作组制定,旨在通过标准化的方式获取和展示系统硬件信息,以便操......