数据库“啃”不动?CnosDB带你轻松阅读十万行源码!

news2024/11/20 14:29:46
最近一直有社区的小伙伴问,我们很感兴趣CnosDB,但从何开始阅读CnosDB的代码呢,其实这个问题在之前的CnosDB HiTea直播时就有聊到,今天我们就再来回顾一下。

CnosDB的源代码主要分为Query Engine和Storage Engine。Query Engine在query_sever下,里面是query相关的代码。Storage Engine在tskv目录下,主要是时序存储相关的代码。

Query Engine的源码阅读

CnosDB查询步骤大致如下:

1.解析SQL语句成Statement

2.根据Statement生成逻辑计划

3.基于规则优化查询逻辑计划

4.根据逻辑计划生成物理计划

5.基于代价优化物理计划

6.执行计划

其中DDL语句没有3、4、5步骤

CnosDB查询请求的入口代码在 main/src/http/http_service.rs 中的query函数下。一次http的query请求中,参数携带用户和DB名, 根据此进行用户认证,并生成执行SQL的上下文。在 query_server/query/src/dispatcher/manager.r 的execute_query函数下开始处理SQL。

1.解析SQL。解析成ExtStatement这个结构体,该结构体代表SQL的语法树。ExtStatement 结构体可以在query_server/spi/src/query/ast.rs 看到。大致分为两类,一类是DQL和DML,其中包括SELECT、 INSERT语句,另一类是DDL,包括CREATE、 DROP语句。

2.生成逻辑计划。是根据Statement生成逻辑计划,转换的这部分代码在 query_server/query/src/sql/planner.rs。在生成逻辑计划时,会对元数据进行访问,来判断Statement的语义是否正确。

3.优化逻辑计划。这部分的入口代码在 query_server/query/src/execution/query.rs 和 query_server/query/src/sql/optimizer.rs中。逻辑计划的优化是基于规则的,包括谓词下推、简化表达式等规则。其中DDL语句,不需要优化逻辑计划,跳过3、4、5步。

4.逻辑计划转物理计划。比如连接就有排序连接,哈希连接等不同实现

5.优化物理计划。物理计划的优化是基于代价的,比如根据表的数据量优化连接的主表,这步的入口代码在 query_server/query/src/sql/optimizer.rs 处。

6.执行计划。DDL的执行大多是访问元数据并修改,这部分代码在 query_server/query/src/execution/ddl 中。而DQL往往是扫描表,并用谓词过滤,中间可能有连接操作,投影操作,聚合操作。其中最基础的步骤就是扫描表(TableScan),TableScan会生成一个表数据的迭代器,迭代器的操作元素是RecordBatch(是一种DataFrame结构)。之后在迭代器返回的RecordBatch上执行操作。这些操作包括过滤,连接,聚合,并且往往是向量化执行的。

数据流程图

Storage Engine的源码阅读

关于TSKV提供的接口,可以查看 tskv/src/engine.rs 。我们可以从Storage Engine的写入接口开始了解TSKV的工作原理,接口的实现在 tskv/src/kvcore.rs。写入接口接受一个write_batch作为写入的数据,write_batch为flatbuffers生成的代码,原始的fbs文件以及一些grpc定义可以在 common/protos/proto 中找到。从write_batch中可以获取db、table以及真正写入的数据。在写入之前,会根据write_batch生成write_group,具体的实现可以看 tskv/src/database.rs,在写入内存之前,会先写WAL,保证数据恢复,WAL会写入经过压缩后的point以及生成seq,代码实现在 tskv/src/wal.rs。

写完WAL后,开始写入内存,首先会根据write接口传入的参数获取具体的tsfamily,tsfamily为真正的存储单元,具体实现的逻辑位于 tskv/src/tseries_family.rs。数据写入内存后会根据配置项检查是否应该开始进行flush,将数据写入磁盘,满足flush条件的话会开始进行flush,flush代码的实现可以看 tskv/src/compaction/flush.rs。flush过后,首先会发送summmary edit请求,summmary edit主要用来标记哪些数据以及被flush,恢复重启时可以不用写入这些数据,summary有关的逻辑可以查看 tskv/src/summary.rs。compaction会对磁盘中的数据文件进行合并,具体的compaction逻辑可以在 tskv/src/compaction/compact.rs 中看到。

关于分布式

我们还想讲一讲CnosDB的分布式功能。CnosDB分布式由两类节点组成:Meta节点与Data节点。Meta节点用于存储集群相关的元信息,像数据位置分布、Data节点信息、用户权限、DB、Table等相关信息;Meta是基于Raft实现的一套CP存储系统,保证元信息存储高可用强一致性。Data节点用于数据的存储与查询,当前存储与查询相关功能都在Data节点实现;后期可能会做计算、存储分离,存储功能单独一个进程,无状态的计算节点单独进程。

CnosDB的数据分片规则是根据时序数据特有的特点采取基于time-range方式分片。每隔一段时间创建一个bucket(是一个虚拟的逻辑单元),每个Bucket又根据Data节点个数以及副本数创建多个Vnode,每个Vnode是一个单独的LSM Tree ,对应 TSFamily 结构体,是一个独立的运行单元,分布到Data节点上存储数据。为了确保数据容灾的有效性,Meta节点在创建Bucket分配Vnode的时候,可能需要根据机架、电源、控制器和物理位置等信息进行权衡。

CnosDB的数据读写流程是数据写入时根据数据的时间戳确定写入哪个Bucket,然后再根据Hash算法确定写入哪个Vnode以及对应的副本当中。数据读取时,查询引擎解析完SQL后根据过滤条件确定读取的Vnode进行读取,然后汇总结果返回。

CnosDB支持 Hinted Handoff。当跨节点的数据副本写入失败时,会写本地磁盘文件,待网络恢复后再写入目的节点。Hinted Handoff提高写的高可用性。在公有云环境下,网络抖动和Region之间的网络不稳定的情况,具有较大的收益。

小结

本篇文章主要介绍了CnosDB 中 查询、存储和分布式三大 模块的代码结构。更多的代码阅读内容会在后面的章节中逐步展开,敬请期待。

CnosDB简介

CnosDB是一款高性能、高易用性的开源分布式时序数据库,现已正式发布及全部开源。

欢迎关注我们的社区网站:https://www.cnosdb.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/388041.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JOSN数据转换和解析

文章目录JOSN数据转换和解析内容回顾Map 集合转成 JSON 字符串List 集合转换成 JSON 字符串Ajax 异步和同步异步概念同步概念异步和同步区别异步请求案例同步请求时间格式化旧时间 api 格式化格式化和解析的工具类JSTL 时间格式化JSTL 使用JOSN数据转换和解析 内容回顾 ajax …

指针的进阶续(笔试题强化练习)

写在前面:在上次我们学习了指针的相关类型的知识,对指针家族的成员基本有了了解,这次让我们跟着一些题目来练习和补充一些知识,这有助于我们强化理解这些知识。 话不多说,我们马上开始: 1.指针和数组的笔…

Vue基础学习 第一个Vue程序 el挂载点 v-指令(1)

Vue简介 Vue是一个Javascript框架Vue框架可以简化Dom操作响应式数据驱动 : 页面是由数据生成的,当数据出现改动,页面也会即时改变 第一个Vue程序 Vue中文文档官网:https://v2.cn.vuejs.org/v2/guide/ 根据官方文档的说法&#…

缓存与数据库的双写一致性

背景 在高并发的业务场景下,系统的性能瓶颈往往是出现在数据库上,用户并发访问过大,压力都打到数据库上。所以一般都会用redis做缓存层,起到一个缓冲作用,让请求先访问到缓存层,而不是直接去访问数据库&am…

Web3D发展趋势以及Web3D应用场景

1,Web3D发展趋势随着互联网的快速发展,Web3D技术也日渐成熟,未来发展趋势也值得关注。以下是Web3D未来发展趋势的七个方面:可视化和可交互性的增强:Web3D可以为三维数据提供可视化和可交互性的增强,将极大地…

CCNP350-401学习笔记(补充题目101-186)

101、 enable the https service 102、fabric edge node 103、 104、 105、 16113 106、filter access-group 10 107、 108、VETP 109、 110、 111、the server and the database can inititate communication 112、 113、 114、 115、 116、WAN edge&#xf…

【教程】去水印开源工具Lama Cleaner在Windows的安装和使用

一、Lama Cleaner是什么? Lama Cleaner是一款开源且免费的人工学习图片去水印程序(个人主要学习用途),没有图片分辨率限制(个人使用暂未发现),并且保存的图片质量很高(个人觉得跟原…

MSTP多进程讲解与实验配置

目录 MSTP多进程 专业术语 MSTP多进程配置 在MSTP域配置 MSTP多进程 多进程的作用 将设备上的端口绑定到不同的进程中,以进程为单位进行MSTP计算,不在同一进程内的端口不参与此进程中的MSTP协议计算,实现各个进程之间的生成树计算相互独立…

【算法】DFS与BFS

作者:指针不指南吗 专栏:算法篇 🐾题目的模拟很重要!!🐾 文章目录1.区别2.DFS2.1 排列数字2.2 n-皇后问题3.BFS3.1走迷宫1.区别 搜索类型数据结构空间用途过程DFSstackO( n )不能用于最短路搜索到最深处&a…

leetcode打卡-深度优先遍历和广度优先遍历

200.岛屿数量 leetcode题目链接:https://leetcode.cn/problems/number-of-islands leetcode AC记录: 思路:深度优先遍历,从0,0开始遍历数组,使用boolean类型数组used记录是否被访问过,进行一…

28个案例问题分析---014课程推送页面逻辑整理--vue

一&#xff1a;背景介绍 项目开发过程中&#xff0c;前端出现以下几类问题&#xff1a; 代码结构混乱代码逻辑不清晰页面细节问题 二&#xff1a;问题分析 代码结构混乱问题 <template><top/><div style"position: absolute;top: 10px"><C…

SpringBoot监听机制-以及使用

11-SpringBoot事件监听 Java中的事件监听机制定义了以下几个角色&#xff1a; ①事件&#xff1a;Event&#xff0c;继承 java.util.EventObject 类的对象 ②事件源&#xff1a;Source &#xff0c;任意对象Object ③监听器&#xff1a;Listener&#xff0c;实现 java.util…

奇思妙想:超链接唤起本地应用

文章目录分析实现参考很多人的博客都有这样的小玩意&#xff0c;点击之后就可以直接与博主进行对话&#xff0c;而且无需添加好友。 先研究一下网页源代码&#xff1a; <a href"tencent://message/?uin88888888&Siteqq&Menuyes">联系我</a>很明…

Decoupled Knowledge Distillation(CVPR 2022)原理与代码解析

paper&#xff1a;Decoupled Knowledge Distillationcode&#xff1a;https://github.com/megvii-research/mdistiller/blob/master/mdistiller/distillers/DKD.py背景与基于响应logits-based的蒸馏方法相比&#xff0c;基于特征feature-based的蒸馏方法在各种任务上的表现更好…

【教学典型案例】14.课程推送页面整理-增加定时功能

目录一&#xff1a;背景介绍1、代码可读性差&#xff0c;结构混乱2、逻辑边界不清晰&#xff0c;封装意识缺乏![在这里插入图片描述](https://img-blog.csdnimg.cn/bbfc5f04902541db993944ced6b62793.png)3、展示效果不美观二&#xff1a;案例问题分析以及解决过程1、代码可读性…

现代操作系统——Linux架构与学习

小白的疑惑 在我决定从事嵌入式&#xff08;应用层&#xff09;方面的工作时&#xff0c;我查询了大量资料该如何学习&#xff0c;几乎所有观点不约而同的都指向了学习好Linux&#xff0c;大部分工作都是在Linux环境下来进行工作的。于是我雄心勃勃的去下载Linux&#xff0c;可…

GEE开发之降雨(CHIRPS)数据获取和分析

GEE开发之降雨CHIRPS数据获取和分析1.数据介绍2.初识CHIRPS2.1 代码一2.2 代码二3.逐日数据分析和获取4.逐月数据分析和获取4.1 代码一4.2 代码二(简洁)5.逐年数据分析和获取5.1 代码一5.2 代码二(简洁)前言&#xff1a;主要获取和分析UCSB-CHG/CHIRPS/DAILY的日数据、月数据和…

一文带你入门,领略angular风采(上)!!!

话不多说&#xff0c;上代码&#xff01;&#xff01;&#xff01; 一、脚手架创建项目 1.安装脚手架指令 npm install -g angular/cli 2.创建项目 ng new my-app(ng new 项目名) 3.功能选择 4.切换到创建好的项目上 cd my-app 5.安装依赖 npm install 6.运行项目 npm start或…

32 openEuler使用LVM管理硬盘-管理卷组

文章目录32 openEuler使用LVM管理硬盘-管理卷组32.1 创建卷组32.2 查看卷组32.3 修改卷组属性32.4 扩展卷组32.5 收缩卷组32.6 删除卷组32 openEuler使用LVM管理硬盘-管理卷组 32.1 创建卷组 可在root权限下通过vgcreate命令创建卷组。 vgcreate [option] vgname pvname ...…

曹云金郭德纲关系迎曙光,新剧《猎黑行动》被德云社弟子齐点赞

话说天下大势&#xff0c;分久必合&#xff0c;合久必分。这句话经过了历史的证明&#xff0c;如今依然感觉非常实用。 就拿郭德纲和曹云金来说&#xff0c;曾经后者是前者的得门生&#xff0c;两个人不但情同父子&#xff0c;曹云金还是郭德纲默认接班人。然而随着时间的流逝&…