基于TiKV理解InfluxDB Cluster方案

简介: 基于InfluxDB Cluster v0.11的实现,并结合目前正火的开源HTAP数据库TiDB,通过对比理解InfluxDB Cluster的解决方案

InfluxDB应该是目前最专业的时序数据库,但是InfluxDB Cluster的代码在0.11版本之后就宣布闭源,作为商业软件。InfluxDB越来越受欢迎,目前很多公司都是基于其搭建自己的时序数据集群。最近阿里云推出InfluxDB®,是一个基于开源版InfluxDB的商业化时序数据库,还在研发分布式高可用版本 :5分钟了解阿里时序时空数据库

这里我们基于InfluxDB Cluster v0.11的实现,并结合目前正火的开源HTAP数据库TiDB,通过对比理解InfluxDB Cluster的解决方案。因为TiDB的分布式方案社区很成熟,很容易获得专业资料,但是InfluxDB Cluster在其闭源后社区相关资料几乎没有更新。

TiKV分布式存储

TiKV

TiKV的数据存储原理细节建议参考PingCAP的官方博文。这里做一个总结:

  1. TiKV的sharding策略是range sharding,把不同区间的key分到不同的region,当region的数据量超过阈值时,会发生分裂成为2个region。
  2. region作为数据存储的单位,会在集群中做3副本,3个副本通过raft保证数据复制的一致性。底层数据存储使用的是RocksDB,单个TiKV node里面会起2个RocksDB实例,一个用于存储数据,它会包含多个region,通过在key中加入region ID作为前缀来区分,另一个存储raft log。
  3. Placement driver在raft的上层,存储region的路由表,作为索引加速数据定位。
  4. 再上一层基于MVCC实现单个TiKV node内部的事务。
  5. 然后就是基于2PC算法实现TiKV 集群上的分布式事务。

InfluxDB Cluster

在0.11版本中,InfluxDB Cluster架构已经基本完善,其将整体分为2个集群,一个是真正存储数据的data cluster,另一个是存储数据集群元信息的meta server。以下涉及的基础概念和逻辑,可参考本人前面的博文InfluxDB的存储引擎演化过程用TiKV存储时序数据与InfluxDB对比。InfluxDB Cluster实现原理参考:

下面是基于我的理解,画的InfluxDB Cluster架构图:

data_cluster

上图中上层是InfluxDB中数据逻辑层次结构,下层是真正的物理集群,存储数据。

  1. Retention policy就是前面博文多次提到的InfluxDB的数据过期管理策略,它与database关联。为database创建retention policy:

    CREATE RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> [SHARD DURATION <duration>] [DEFAULT]
    

    DURATION: 数据保存期限。比如30d,24h。

    REPLICATION: 见下文。

    SHARD DURATION: 见下文。

  2. 同一retention policy的数据会根据time range进行sharding,把数据分到不同的shard group,每个shard group所包含的时间区间由第1条中的SHARD DURATION指定,默认是每24h就会创建一个shard group。在同一个shard group中的数据,对应相同的过期周期,同时在同一个时间范围内,所以它们将接近同时过期,这非常有方便于数据清除。

  3. 前面的博文提到,根据time range进行sharding会把最新的的数据写到同一个shard group,造成写入热点。InfluxDB通过hash sharding来解决这个问题,每个shard group会包含多个shard,数据通过对SeriesKey进行hash取模被分发到不同的shard。在开源的单机版本中,这一层会被设定为1个hash槽,所以不会起作用。

  4. Shard是InfluxDB中数据的基本组织形式,每个shard是一个完整的TSM存储引擎,包含独立的WAL和数据存储文件。每一个shard会被放在多个数据节点上,以保证数据的安全和可用。这里的副本数可以通过1中的REPLICATION指定。默认在单机环境中为1,在集群环境中为3。

    同一个shard在不同节点中的多个副本基于Gossip协议实现数据一致性,这是一个去中心化的一致性协议。

meta_cluster

上图是meta cluster架构图。InfluxDB的元数据节点存储了所有的数据库信息,包括数据集群中的逻辑层次,所有retention policy,shard group时间区间分配以及shard的hash设置。也就是说元数据集群的作用就是根据数据信息定位到该数据会存储在哪个shard。然后再到shard中读/写数据。

与TiKV对比

InfluxDB Cluster整体框架与TiKV的存储相比,meta cluster类似于TiKV的placement driver,用作集群元信息的存储。meta cluster存储的信息更全面,其实是数据库的管理信息都在里面。

上层的分布式思想都是一样的,都是使用range sharding的思想。TiKV直接通过数据条目的key的区间来做sharding,对于数据更新很友好。而InfluxDB则是基于point的时间区间段进行sharding,这便于过期数据清除。InfluxDB还通过SeriesKey进行第二次sharding,解决数据写入热点问题。

InfluxDB中的shard与TiKV中的region是等价的,都是数据存储的单元。存在以下不同点:

  1. 每个TiKV节点只起一个RocketsDB实例用作数据存储,其包含了节点中所有region。而InfluxDB中,每个shard是一个独立的TSM,等价于一个独立的RocketsDB实例。
  2. TiKV中每个region的多个副本之间是使用raft协议,达到强一致性。InfluxBD的shard副本之间则是使用gossip协议达到最终一致。
  3. TiKV的region会在条目太多的时候进行分裂,这跟InfluxDB的hash sharding到不同的shard类似,目的都是为了防止出现热点。

所以,从数据存储角度来说,对于分布式CAP理论,TiKV更偏向于CP系统,因为它完全兼容传统RDBMS,支持事务是必备的。而InfluxDB Cluster主要目标是提供高可用,是一个偏向于AP系统。这是因为面向前面的博文中所说的时序数据的特征,让高频率数据能够及时写入,而不支持事务。但是,meta cluster则是一个CP系统,保证数据库信息的完全一致,这也是为下层数据存储服务的。

目录
相关文章
|
网络协议 API 数据库
InfluxDB集群
InfluxDB集群
1039 0
|
11月前
|
IDE API 开发工具
鸿蒙开发:DevEcoStudio中那些实用的小功能
本篇文章就暂时给大家盘点四个,在后续的文章中,关于DevEco Studio中能够提升我们开发效率的功能,也会不间断的进行总结。
277 12
鸿蒙开发:DevEcoStudio中那些实用的小功能
|
存储 关系型数据库 MySQL
【赵渝强老师】TiDB的体系架构
TiDB是由PingCAP公司自主研发的开源分布式关系型数据库,支持HTAP(混合事务分析处理),具备弹性扩缩容、金融级高可用、实时分析等特性,兼容MySQL协议。其架构分为存储集群(行存TiKV与列存TiFlash)、调度集群(PD实例)和计算集群(TiDB实例)。相比传统单机数据库,TiDB优势显著:纯分布式设计、高扩展性、自动故障恢复、ACID事务支持及丰富的工具生态,适用于高可用与强一致要求的场景。
442 10
|
运维 Kubernetes 调度
【kubernetes】关于k8s集群的污点、容忍、驱逐以及k8s集群故障排查思路
【kubernetes】关于k8s集群的污点、容忍、驱逐以及k8s集群故障排查思路
1877 156
|
人工智能 自然语言处理 搜索推荐
云上玩转DeepSeek系列之三:PAI-RAG集成联网搜索,构建企业级智能助手
本文将为您带来“基于 PAI-RAG 构建 DeepSeek 联网搜索+企业级知识库助手服务”解决方案,PAI-RAG 提供全面的生态能力,支持一键部署至企业微信、微信公众号、钉钉群聊机器人等,助力打造多场景的AI助理,全面提升业务效率与用户体验。
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
356 25
|
Docker Windows 容器
手把手教您在 Windows Server 2019 上使用 Docker
现在,您可以直接用 Windows Server 来运行“纯”Docker 容器,其中所有的容器进程都可以直接在主机操作系统上运行。
27397 1
|
网络协议 Ubuntu 前端开发
好好的容器突然起不来,经定位是容器内无法访问外网了?测试又说没改网络配置,该如何定位网络问题
本文记录了一次解决前端应用集成到主应用后出现502错误的问题。通过与测试人员的沟通,最终发现是DNS配置问题导致的。文章详细描述了问题的背景、沟通过程、解决方案,并总结了相关知识点和经验教训,帮助读者学习如何分析和定位网络问题。
829 1
|
存储 负载均衡 物联网
InfluxDB集群与扩展性解析
【4月更文挑战第30天】InfluxDB集群利用分片和复制技术实现水平扩展,提升性能和可靠性。集群包含元数据、数据和(可选)代理节点,其中元数据节点管理集群信息,数据节点存储时间序列数据,代理节点转发查询请求。扩展性策略包括:水平扩展增加数据节点,负载均衡优化资源使用,数据分片实现并行处理,以及通过多副本保证容错和高可用性。这些特性使InfluxDB能有效处理大量时间序列数据。
1028 0
|
Java 数据处理 Spring
Spring Cloud OpenFeign 超时与重试
今天给大家分享的是 `feign` 的超时与重试配置。
1247 0
Spring Cloud OpenFeign 超时与重试
下一篇
开通oss服务