Learn Influxdb the hard way (1) - Overview of the architecture

简介:

前言

Influxdb是目前最流行的时序性数据库之一,由Go语言编写,无需特殊的环境依赖,简单方便,非常适合作为监控系统的后端存储。在容器相关领域的场景中,经常和telegraf、grafana、prometheus等开源系统相集成。从这篇文章开始,我们会从源码深入探讨Influxdb的设计思路。本系列文章基于Influxdbv1.5的源码,需要读者具备influxdb的基本使用经验。

Influxdb架构总览

首先我们先从上帝视角鸟瞰一下Influxdb的整体结构,在后续的文章中我们会深入到每一个组件进行解析。
overview.png
从整体的架构分层上来讲可以分为数据持久层、内部组件层、对外服务层,我们先从最下层向上层进行分析。在存储上,Influxdb分为两种储存,一种是META存储,一种是数据存储,首先我们先从磁盘上的目录结构进行查看。

├── data
│   ├── _internal
│   │   └── monitor
│   │       ├── 100
│   │           └── 000000006-000000003.tsm
│   └── k8s
│       └── default
│           ├── 10
│               └── 000000030-000000003.tsm
├── meta
│   └── meta.db
└── wal
    ├── _internal
    │   └── monitor
    │       ├── 100
    │           └── _00024.wal
    └── k8s
        └── default
            ├── 10
                └── _00208.wal

META存储会在数据目录下生成meta.db的文件,主要存储Influxdb的meta信息,例如创建的database的名字、database的retention policy等等。数据存储主要分为两种,一种是持久化数据一种是预写的日志,对于存储系统比较熟悉的同学对于这种同步预写异步刷盘的方式并不陌生,这种方式可以很好的解决分布式数据存储同步以及写入可靠性的问题。data与wal目录下的数据都是通过TSM Engine存储而来的,二级目录的名称是数据库的名称,三级目录的名称是retention policy的名字,四级目录是Shard的id,再下一级则是实际存储的数据文件。此外细心的同学会发现wal的目录结构和data的目录结构是一模一样的,包括文件的名称,这是因为在TSM Engine最小的逻辑存储单元实体是Shard,而Shard会根据自身的配置来构建data和wal,因此他们具备相同的目录结构。

内部组件层是Influxdb中对于底层组件的封装,例如所有需要操作meta信息的场景会引用MetaClient,需要写入数据的场景会默认引用PointsWritter,需要进行数据查询的场景会引用QueryExecutor等等,这些内部组件会被上层的Service引用,因此我们不会过多的赘述这些内部组件。

对外服务层是Influxdb对外的包装,可以分为三种,一种是内部服务,通常是一些定时任务,例如PrecreatorService是一个定时创建Shard的服务,会根据时间戳进行计算,动态创建Shard所需的目录结构。RetetionPolicyService会定时的清理不同的数据库的retention policy对应的数据是否需要清理,如果需要清理则会异步进行清理。一种是外部数据服务,通常是配置数据来源的方式,可以配置为定期拉取的方式,也可以配置为UDP等等不同的方式,支持Graphite、OpenTSDB、Collectd等等。还有一种是API Service,Influxdb将自身的能力通过多种不同的API Service进行暴露,其中ContinuousQueryService是将连续查询这种特殊的数据压缩查询方式独立暴露为API;HTTPDService将平时常用的Influxdb数据库的管理、数据的查询等操作通过HTTP的方式进行暴露;SnapshotterService将Influxdb关于数据的在线备份恢复等操作暴露为API;StorageService将TSM Engine的能力通过grpc协议暴露为服务。

最后

从整体来看Influxdb的设计还是很简单的,主要就是通过各种方式将TSM Engine的能力进行封装,并在上层进行逻辑操作的封装,在下一篇文章中会从代码的角度帮大家将整体的结构进行梳理,并逐渐深入到每个模块中进行进一步的分析。

目录
相关文章
|
存储 监控 Linux
深入理解epoll:高效I/O多路复用的核心技术(上)
深入理解epoll:高效I/O多路复用的核心技术
|
10月前
|
存储 缓存 调度
阿里云Tair KVCache仿真分析:高精度的计算和缓存模拟设计与实现
在大模型推理迈向“智能体时代”的今天,KVCache 已从性能优化手段升级为系统级基础设施,“显存内缓存”模式在长上下文、多轮交互等场景下难以为继,而“以存代算”的多级 KVCache 架构虽突破了容量瓶颈,却引入了一个由模型结构、硬件平台、推理引擎与缓存策略等因素交织而成的高维配置空间。如何在满足 SLO(如延迟、吞吐等服务等级目标)的前提下,找到“时延–吞吐–成本”的最优平衡点,成为规模化部署的核心挑战。
2221 40
阿里云Tair KVCache仿真分析:高精度的计算和缓存模拟设计与实现
|
人工智能 算法 搜索推荐
电商API的“AI革命”:全球万亿市场如何被算法重新定义?
AI+电商API正引领智能商业变革,通过智能推荐、动态定价与自动化运营三大核心场景,大幅提升转化率、利润率与用户体验。2025年,75%电商API将具备个性化能力,90%业务实现智能决策,AI与API的深度融合将成为未来电商竞争的关键基石。
|
11月前
|
关系型数据库 Unix Linux
Rocky Linux下用meson编译安装PostgreSQL
本文记录在Rocky Linux 9.7上使用Meson编译PostgreSQL 18.1的完整流程,涵盖环境准备、依赖安装、快速部署命令及详细配置说明,重点介绍Meson构建系统的核心用法与常用参数,助力高效完成源码编译与定制化安装。
|
存储 固态存储 算法
固态硬盘损坏后还能做数据恢复吗?完整指南
固态硬盘(SSD)因速度快、抗震动、低噪音被广泛使用,但一旦损坏,用户常因慌乱导致二次损失。本文解析SSD损坏后的数据恢复可行性,介绍逻辑损坏、固件异常、物理损坏三种常见情况,并提供对应的恢复方法与预防措施,帮助用户科学应对数据丢失风险,提升恢复成功率。
|
JSON 资源调度 监控
拼多多API实时价格监控,抢占低价流量红利!
在电商竞争激烈的当下,实时监控商品价格成为抢占低价机会的关键。本文详解如何利用拼多多API实现自动化价格监控,捕捉价格波动,制定科学策略,助力商家与消费者抢占流量红利,提升竞争力。
2858 0
|
SQL 关系型数据库 数据库
在 Postgres 中使用 Between
【8月更文挑战第12天】
1530 4
ThreeJs给物体添加贴图
这篇文章详细说明了在Three.js中如何给3D物体添加贴图,并展示了实现局部贴图的技术和方法。
1036 1
ThreeJs给物体添加贴图
|
缓存 移动开发 Linux
Pacman
Pacman
803 3
|
Unix iOS开发 Ruby
解决CocoaPods installed but it is not working
解决CocoaPods installed but it is not working
1053 5