首页 > 数据库 >聊聊分布式 SQL 数据库Doris(二)

聊聊分布式 SQL 数据库Doris(二)

时间:2023-11-21 09:03:00浏览次数:35  
标签:image leader bdbje SQL 日志 数据 节点 Doris 分布式

Doris中,Leader节点与非Leader节点和Observer节点之间的元数据高可用和一致性,是通过bdbje(全称:Oracle Berkeley DB Java Edition)的一致性和高可用实现的。

元数据与同步流程

元数据主要存储四类数据:

  1. 用户数据信息. 包括数据库, 表的schema, 分片信息等
  2. 各类作业信息. 如导入作业, clone作业, schemaChange作业等。
  3. 用户及权限信息.
  4. 集群及节点信息.

元数据同步图:

1.png

元数据流转如下:

  1. leader写入元数据

    写操作在修改leader的内存后,序列化为log,按照key-value格式写入到bdbje. 其中 key 为连续的整型数字,全局唯一、递增,作为 log id;value 即为序列化后的操作日志,由2部分组成。OperationType为操作类型,如建库操作、建表操作等。Writable Entity为序列化后的操作具体内容,通过反序列化该值,可以从镜像上回放元数据操作。

    2.png

  2. 集群节点同步元数据

    日志写入bdbje后,bdbje会根据策略(写多数/全写), 将日志复制到FE其他的follower节点。FE节点通过对bdbje中元数据日志的reply, 修改自身的元数据内存镜像,完成与leader节点的元数据同步。

  3. 元数据checkpoint持久化

    leader 节点的日志条数达到阈值(默认 10w 条)并且满足checkpoint线程执行周期(默认六十秒)。checkpoint 会读取已有的 image 文件,和其之后的日志,重新在内存中回放出一份新的元数据镜像副本。然后将该副本写入到磁盘,形成一个新的 image。之所以是重新生成一份镜像副本,而不是将已有镜像写成 image,主要是考虑写 image 加读锁期间,会阻塞写操作。所以每次 checkpoint 会占用双倍内存空间。

  4. image 文件生成后,leader 节点会通知其他 non-leader 节点新的 image 已生成。non-leader 主动通过 http 拉取最新的 image 文件,来更换本地的旧文件.

  5. bdbje 中的日志,在 image 做完后,会定期删除旧的日志

  6. 删除旧的磁盘元数据镜像

总结

Leader节点修改内存元数据后,元数据日志首先写入bdbje,达到阈值后,bdbje形成一个新的DB,然后将新的DB内的日志,在旧的image上回放,生成一个新的image,然后删除bdbje中已经被集群节点全部同步的旧的元数据日志。这样周而复始。保证bdbje中的数据不会无限制得增长,也保证了image中始终保存着较新的元数据。同时,其他非leader节点,也访问bdbje,将bdbje中的新写入的元数据日志,在自己内存中的元数据上回放。

Doris的元数据存储是 memory -> bdbje -> checkpoint(image)。

为什么同时需要 bdbje 和 image 镜像呢?

  • 高性能和实时查询: bdbje 作为嵌入式数据库提供了高性能的元数据访问,适用于实时的查询和操作。它通常保存在内存中,可以快速地提供元数据信息。

  • 数据恢复和持久性: image 镜像则用于实现元数据的持久化,以便在系统重启或发生故障时,能够使用镜像还原元数据。这有助于确保系统的可靠性。

参考:

Apache Doris元数据管理

元数据设计文档

元数据运维

标签:image,leader,bdbje,SQL,日志,数据,节点,Doris,分布式
From: https://www.cnblogs.com/zhiyong-ITNote/p/17845431.html

相关文章

  • 分布式事务 Seata 集群搭建
    Seata是蚂蚁金服和阿里巴巴共同开源的一款分布式事务项目,致力于在微服务架构下提供高性能和简单易用的分布式事务解决方案。自诞生以来就备受国内开发人员推崇,在实际工作中使用者甚多。Seata提供了四种不同的分布式事务解决方案:XA模式:强一致性分阶段事务模式,牺牲了一定的可用......
  • MySQL
    MySQL下载方法下载路径https://www.mysql.com/MD5校验下载的软件包[root@localhost~]#md5summysql-5.7.38-1.el7.x86_64.rpm-bundle.tar826ce05d0379574a03935b62ae02db88mysql-5.7.38-1.el7.x86_64.rpm-bundle.tar解压下载的软件包[root@localhost~]#tar-xvfmy......
  • SQL 中的 NULL 值:定义、测试和处理空数据,以及 SQL UPDATE 语句的使用
    SQLNULL值什么是NULL值?NULL值是指字段没有值的情况。如果表中的字段是可选的,那么可以插入新记录或更新记录而不向该字段添加值。此时,该字段将保存为NULL值。需要注意的是,NULL值与零值或包含空格的字段不同。具有NULL值的字段是在记录创建期间留空的字段。如何测试NUL......
  • JavaWeb--SqlSessionFactory工具类抽取
    代码优化 Stringresource="mybatis-config.xml";InputStreaminputStream=Resources.getResourceAsStream(resource);SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);//2.2获取SqlSession对象SqlSessionsqlSession=......
  • SQL 中的 NULL 值:定义、测试和处理空数据,以及 SQL UPDATE 语句的使用
    SQLNULL值什么是NULL值?NULL值是指字段没有值的情况。如果表中的字段是可选的,那么可以插入新记录或更新记录而不向该字段添加值。此时,该字段将保存为NULL值。需要注意的是,NULL值与零值或包含空格的字段不同。具有NULL值的字段是在记录创建期间留空的字段。如何测试NU......
  • pycharm链接数据库 django链接MySQL
    #找到pycharmdatabase选项(三个地方查找)#选取对应的数据库下载对应的驱动"""明明链接上了数据库但是看不到表无法操作这个时候你只需要将刚刚创建的链接删除重新链接一次即可"""  #1.配置文件中配置DATABASES={'default':{'ENGINE':'django.db.back......
  • Redis:Key-Value的NoSQL数据库
    Redis:Key-Value的NoSQL数据库(基础)主要内容:数据库分类Redis入门客户端连接RedisRedis数据类型及操作Springboot整合RedisSpringCache学习目标:知识点要求数据库分类熟悉Redis使用场景熟悉Redis下载与安装了解Redis启动关闭掌握客户端连接Redis......
  • 常见面试题-MySQL软删除以及索引结构
    为什么mysql删了行记录,反而磁盘空间没有减少?答:在mysql中,当使用delete删除数据时,mysql会将删除的数据标记为已删除,但是并不去磁盘上真正进行删除,而是在需要使用这片存储空间时,再将其从磁盘上清理掉,这是MySQL使用延迟清理的方式。延迟清理的优点:如果mysql立即删除数据,会导......
  • PostgreSQL - Transaction Isolation Level
     zzh@ZZHPC:~$dockerrun--namepostgres16-p5432:5432-ePOSTGRES_USER=root-ePOSTGRES_PASSWORD=aaa-dpostgres:alpine8e36b7bdc47572723a416c319b83f20b2eac7ef25adb3ac1a875e909f45ebdb6zzh@ZZHPC:~$dockerexec-itpostgres16createdb--username=root-......
  • MySQL - Transaction Isolation Level
     zzh@ZZHPC:~$dockerrun--namemysql8-p3306:3306-eMYSQL_ROOT_PASSWORD=aaa-eMYSQL_DATABASE=simple_bank-dmysqlac3cce2a639d2379500723acbd9149aa4f92d1d76c8c7b0c3abcc0b382b311afzzh@ZZHPC:~$dockerexec-itmysql8mysql-uroot-paaasimple_bankmys......