一、M3DB介绍

M3DB是Uber开源的一款分布式时序数据库,已在Uber内部使用多年。M3DB有以下特性:

  • 分布式的时序数据库,可以水平扩展存储。
  • 支持Pormetheus的查询语言PromQL,Prometheus可以使用M3DB做为存储后端。
  • 支持多租户,不同租户(Namespace)提供不同的配置(数据失效时间、Bloack大小等)。
  • 支持数据聚合,可以对监控指标进行采样。

二、M3DB架构

组件:

  • M3Coordinator:协调器,用于协调上游系统(如 Prometheus 和 M3DB )之间的读写操作,相当于M3DB集群的网关。
  • M3Storage Node:存储节点,实际存储时序数据的组件,支持分片、多副本。
  • M3Seed Node(Etcd):种子节点,用于存储元数据,包括集群、Namespace等的配置。

三、M3DB原理

1.基本概念

  • Placement:用于管理M3DB的Topology(拓扑结构),包括IsolationGroup(所在区域)、Node(M3DB节点)、Shard(分片)、Replication(副本)等。
  • Namespace:逻辑上的多租户,每个租户可以设置数据过期时间、Block大小等配置。所有租户共享拓扑结构。
  • Block:M3DB存储数据的基本单位,将时间长短作为存储大小,例如设置Block大小为2h,则Block内存储2小时的数据。

2.存储引擎

2.1.数据压缩

  • M3DB使用M3TSZ算法对Block进行压缩。
  • M3TSZ基于Facebook Gorilla算法实现,是一种专用于压缩时序数据的算法,在Uber的生产使用中,一条时序数据会被压缩到1.45bytes,压缩比非常高。

2.2.内存结构

  • Database:M3DB进程,一个Database拥有多个Namespace。
  • Namespaces:租户,一个Namespace拥有多个Shard。
  • Shards:分片,一个Shard拥有多个Series,M3DB会根据Series id的Hash值分配Series到不同的Shards中。
  • Series:时序数据(Time series datapoints),数据结构包括id、tags、datapoint(timestamp、value)。Series包括Buffer和Cached blocks。
  • Buffer:缓冲区,M3DB会先将时序数据写入Buffer,Flush机制会将Buffer中的数据形成Block,并持久化到磁盘中。
  • Cached blocks:缓存,M3DB会缓存部分Block。

2.3.持久化存储结构

  • Commit log:日志文件,M3DB的所有写入操作会记录Commit log,用于M3DB启动时加载数据以及灾难恢复。M3DB写入Commit log时,会先写入内存中,由M3DB定时(可配置)批量刷新到磁盘中,所以可能会有Commit log丢失的情况。
  • Fileset files:数据文件组,M3DB的Flush机制会将Block写入到Fileset文件中。Fileset包含一组文件,包括Data file(数据文件)、Index file(索引文件)等等。

2.4.读写流程

1)写流程

写入M3DB的时序数据必须指定四个属性:Namespace, Series id, Timestamp, Value。

  • M3DB找到Namespace。
  • M3DB根据Series id计算Hash值,并找到Shard。
  • M3DB将时序数据写入Buffer,并记录Commit log。
  • M3DB的Flush机制会定期读取Buffer,并根据Timestamp将满足Block大小的时序数据形成Block(例如Block大小为2h,M3DB会将2小时的数据形成Block)。
  • Block形成后,M3DB会用M3TSZ算法压缩Block,压缩后将Block持久化到Fileset files。
2)读流程

读取M3DB的时序数据必须指定四个属性:Namespace,Series id,Timestamp范围。

  • M3DB找到Namespace。
  • M3DB根据Series id计算Hash值,并找到Shard。
  • M3DB会合并Timestamp范围内的Buffer、Block(Cached、Fileset)。
  • 合并完成后M3DB返回结果。

3.拓扑结构

3.1.Placement

用于管理M3DB的Topology(拓扑结构),M3DB可以使用Placement扩展移除M3DB节点。基本概念:

  • Replication:副本,M3DB可以保存同一份数据的多个副本,保证数据的高可用。
  • Shard:分片,一个分片包含一个或多个Replication。分片包含3个状态:
    • Initializing:初始化Shatd,此时无法对Shard进行操作。
    • Available:可用状态,此时可以正常操作Shard。
    • Leaving:移除中。
  • Node:M3DB节点,是以IP+Port来区分,一个实例包含一个Replication下的多个Shard。
  • IsolationGroup:Node所在的区域分组,保证同一分组下只保存一个Replication。

3.2.IsolationGroup分组

可以按照M3DB实例所在的区域进行分组,多个Replication可以分布到不同的IsolationGroup中,以此实现区域上的高可用:

  • 按Rack(机柜)分组:

  • 按Zone(机房)分组:

  • 按Region(地域)分组:

4.高可用

4.1.一致性等级(Consistency Levels)

M3DB提供连接集群的一致性等级以及读写一致性等级,当Client连接M3DB集群达不到连接一致性等级,则无法进行读写操作。

1)写一致性等级(Write consistency levels)
  • One:只需要写一个Node成功,就表示此次操作成功。
  • Majority:写大部分Node成功,此次操作才成功。计算Majority的公式为,n代表Node数量,majority=(n+1)/2, 例如n=3,majority=2,表示需要至少有写2个Node成功,此次操作才算成功。

  • All:写所有Node成功,此次操作才成功。

2)读一致性等级(Read consistency levels)
  • One:只需要读一个Node成功,就表示此次操作成功。
  • UnstrictMajority: 首先读大部分Node,如果成功,则此次操作成功,否则会尝试只读一个Node,成功则表示此次操作成功。
  • Majority: 读大部分Node成功,此次操作才成功。
  • All: 读所有Node成功,此次操作才成功。
3)连接一致性等级(Connect consistency levels)
  • Any: M3DB依次尝试按照All、Majority、One三个等级连接,只要有一个成功,则连接成功,否则连接失败。
  • None: M3DB始终认为连接是成功的。
  • One: 只需要连接一个Node成功,就认为连接成功。
  • Majority: 连接大部分Node成功,连接才成功。
  • All: 连接所有Node成功,连接才成功。
4)读写一致性组合
  • 读UnstrictMajority,写Majority,此为默认组合。例如Node数量为3,写必须满足至少有2个Node写成功,保证大部分Node的数据保持一致,读优先满足至少2个Node读成功,如果失败,则降级,满足一个Node读成功即可,保证集群出现大面积故障时,能尽量提供读服务。监控系统一般使用该组合。
  • 读Majority,写Majority。如果对数据一致性要求较高,写成功的数据,必须能读出来,可以使用该组合,当集群出现大面积故障时,M3DB则不提供读写服务。

4.2.灾难恢复

M3DB会在Bootstrap(启动节点)和Repair(后台修复机制)两个阶段恢复数据,并且提供两种恢复数据的方式:

  • 基于Commit log恢复数据。
  • 当Commit log丢失,从其他Replication中恢复,恢复时遵循一致性等级。

9 时序数据库M3DB架构与原理的更多相关文章

  1. 时序数据库技术体系 – 初识InfluxDB(原理)

    原贴地址:http://hbasefly.com/2017/12/08/influxdb-1/?qytefg=c4ft23 在上篇文章<时序数据库体系技术 – 时序数据存储模型设计>中笔者 ...

  2. 时序数据库 Apache-IoTDB 源码解析之系统架构(二)

    上一章聊到时序数据是什么样,物联网行业中的时序数据的特点:存量数据大.新增数据多(采集频率高.设备量多).详情请见: 时序数据库 Apache-IoTDB 源码解析之前言(一) 打一波广告,欢迎大家访 ...

  3. 深度解读MRS IoTDB时序数据库的整体架构设计与实现

    [本期推荐]华为云社区6月刊来了,新鲜出炉的Top10技术干货.重磅技术专题分享:还有毕业季闯关大挑战,华为云专家带你做好职业规划. 摘要:本文将会系统地为大家介绍MRS IoTDB的来龙去脉和功能特 ...

  4. MRS IoTDB时序数据库的总体架构设计与实现

    MRS IoTDB时序数据库的总体架构设计与实现 MRS IoTDB是华为FusionInsight MRS大数据套件最新推出的时序数据库产品,其领先的设计理念在时序数据库领域展现出越来越强大的竞争力 ...

  5. 时序数据库技术体系 – InfluxDB TSM存储引擎之TSMFile

    本文转自 http://hbasefly.com/2018/01/13/timeseries-database-4/ 为了更加系统的对时序数据库技术进行全方位解读,笔者打算再写一个系列专题(嘿嘿,好像 ...

  6. [转帖]时序数据库技术体系(二):初识InfluxDB

    时序数据库技术体系(二):初识InfluxDB https://sq.163yun.com/blog/article/169866295296581632 把生命浪费在美好事物上2018-06-26 ...

  7. Prometheus时序数据库-报警的计算

    Prometheus时序数据库-报警的计算 在前面的文章中,笔者详细的阐述了Prometheus的数据插入存储查询等过程.但作为一个监控神器,报警计算功能是必不可少的.自然的Prometheus也提供 ...

  8. 简析时序数据库 InfluxDB

    时序数据基础 时序数据特点 时序数据TimeSeries是一连串随时间推移而发生变化的相关事件. 以下图的 CPU 监控数据为例,同个 IP 的相关监控数据组成了一条时序数据,不相关数据则分布在不同的 ...

  9. Atitit.数据库存储引擎的原理与attilax 总结

    Atitit.数据库存储引擎的原理与attilax 总结 1. 存储引擎是什么1 2. 其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储2 3. 表的存储有三个文件:结构+数据+索引2 4 ...

  10. Atitit数据库层次架构表与知识点 attilax 总结

    Atitit数据库层次架构表与知识点 attilax 总结 第一阶段,大概理论(三五天 数据库的类型,网状,层次,树形数据库,kv数据库.Oodb Er模型   sql 并发控制与lock  Acid ...

随机推荐

  1. 华企盾DSC防泄密:PTC Creo程序打开加密文件报错

    SolidDesigner.exe(PTC Creo)程序打开加密文件报错,添加的进程不对,任务管理器查看详细信息即可找到进程

  2. 万界星空科技MES系统中的生产调度流程

      MES系统生产调度的目标是达到作业有序.协调.可控和高效的运行效果,作业计划的快速生成以及面向生产扰动事件的快速响应处理是生产调度系统的核心和关键. 为了顺利生成作业计划,需要为调度系统提供完整的 ...

  3. Spring源码学习之Web数据绑定器WebDataBinder

    WebDataBinder 1.描述 特殊的数据绑定器用于从web请求参数到JavaBean对象的数据绑定.专为web环境,但不依赖于Servlet API;作为更具体的DataBinder变体的基类 ...

  4. 大四jsp实训项目技术总结

    crm项目总结 ①静态资源疯狂报错?很有可能是后端的问题,后端出了问题,服务器取不出来资源. 记住:只要服务器取不到某个资源,很有可能导致所有资源都取不出来. 一个经典案例:某个数据库映射文件 ICu ...

  5. 用AI在本地给.NET设计几张壁纸

    AI是当今和未来非常重要的技术领域之一,它在各个行业都有广泛的应用,如医疗保健.金融.教育.制造业等.学习AI可以让你了解和掌握未来技术发展的核心,并为未来的职业发展做好准备.现在有很多开源的Mode ...

  6. 一行代码解决Three.js中只能在一侧看到物体的问题

    项目场景:   因为该项目比较复杂庞大,在此就简单介绍一下:   通过Three.js创建若干个物体进行了组装,从而形成了一个类似眼球模拟模型的项目,用户可以通过拖动鼠标来达到控制视角(摄像机)的目的 ...

  7. Word2Vec模型总结

    1.Huffman树的构造 解析:给定n个权值作为n个叶子节点,构造一棵二叉树,若它的带权路径长度达到最小,则称这样的二叉树为最优二叉树,也称Huffman树.数的带权路径长度规定为所有叶子节点的带权 ...

  8. 让 AI “潜入”物流中心,你的快递很快就到!

    摘要:华为利用数字化.智能化的手段从传统物流运营转升成为专业智慧物流,在那些"看不见的地方"华为正在默默耕耘. 网购已经成为了新时代下的"日常",于是每年的「6 ...

  9. Python 没有函数重载?如何用装饰器实现函数重载?

    摘要:Python 不支持函数重载.当我们定义了多个同名的函数时,后面的函数总是会覆盖前面的函数,因此,在一个命名空间中,每个函数名仅会有一个登记项(entry). 本文分享自华为云社区<为什么 ...

  10. 云小课|MRS基础原理之ClickHouse组件介绍

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:在2016年开源的 ...