1年前写的一篇旧文,文中的分析,以及探讨的问题和观点,至今仍有意义。

从2016年起,笔者在腾讯公司负责QQ后台的海量服务分布式组件的架构设计和研发工作,例如微服务开发框架SPP、名字路由CMLB、名字服务、配置中心、NoSQL存储等,在分布式架构、高性能架构、海量服务、过载保护、柔性可用、负载均衡、容灾、水平扩展等方面做了大量的工作,以公共组件的形式,支撑了来自QQ后台和其他BG海量服务的海量流量。后来在2018年底,笔者负责监控大数据平台的研发工作,目标是解决现有监控后台成本高昂的痛点,和支撑内部和外部的海量监控数据的需求,打造千亿级监控大数据平台。 笔者发现当前在监控技术领域缺乏优秀的监控系统,尤其是在海量监控数据场景,很多团队常用的一种做法是堆机器和堆开源软件,比如采用大量高配置的机器,单机百CPU核数、TB内存、数十TB的SSD存储,堆了一堆开源软件,例如Elasticsearch、Druid、Storm、Kafka、Hbase、Flink、OpenTSDB、Atlas、MangoDB等。

但从实际效果看,效果并不好,众多开源软件的组合只是以非常高昂的成本,在增加了系统的运营成本和数据的处理延迟的情况下解决了接入计算,但在海量标签和时间序列线情况下,查询的痛点突出,常出现的一种情况是查询超时、数据拉不出来的问题。 笔者认为,海量或千亿级,是整体的量,是个笼统的概念,可通过分而治之解决,通过分集群的方法来解决,海量监控数据的真正挑战在于以下几点:

  • 能否做到实时,实时是种质变的能力,将一个离线监控平台,提升为一个实时决策系统。难点在于能否设计实现足够高性能的架构,能否实现水平扩展等。
  • 分集群后,单个业务的流量大小、标签集多少是关键。流量大,相对容易解决,主要涉及到系统性能和水平扩展等。标签集多,海量标签,海量时间序列线,如何做查询优化,是挑战,如笔者遇到一些业务上报的监控数据,几十维度的标签,并将QQ号和URL作为标签值,非常海量的时间序列线。
  • 针对监控数据多写少读、成本敏感的特点,如何设计高效的存储引擎?充分发挥硬件性能,并在高效压缩存储的同时保障查询效率。

为了更好的打造有竞争力的监控系统,我们将技术理念定位为“技术降成本,坚决反对开源软件堆砌”。

之所以定下这个理念是有原因的,技术降成本,是因为我们认为云计算是一种非常有突破性的技术形态,它将技术服务化,决定它能否成功的关键在于能否在基础技术上突破,打造出相比开源软件更有成本优势的云原生软件。

坚决反对开源软件堆砌,是因为现在开源软件非常繁荣,基于开源软件,我们很容易搭建一个基础系统,将功能跑起来,但绝大部分开源软件侧重的是功能,不是针对海量监控数据场景而设计的,或多或少都有各种痛点或限制,再堆砌更多的开源能力,即使弱化了痛点,但成本也是非常高昂的,这时,我们需要借助强大的技术和工程能力,直面问题,在架构和源码层面,解决它,而不是引入和堆砌更多的开源软件。

基于工程效率的考虑,我们选择了基于开源软件进行二次开发,使用开源软件的部分代码,按照我们的想法进行架构设计和功能开发,提升开发效率。在调研了众多的开源软件后,最终选择了以InfluxDB源码为基础进行二次开发。

选择InfluxDB源码,主要是因为我们对InfluxDB源码背后的技术和工程实力是认可的,InfluxDB研发团队是能真正的解决场景的痛点的,也是在认真的打造一款优秀的监控产品,而不是仅仅营销,比如基于读写性能和可用性的考虑,InfluxDB研发团队3次重构存储引擎。

在笔者着手以InfluxDB源码为基础开发集群等功能时,在业界中仍没有团队实现真正可用的InfluxDB集群能力。

一些团队只是通过Proxy实现了负载均衡,无法突破单机接入计算和存储的限制,缺乏一致性能力,并增加了查询和仪表盘的数据显示不一致性。

有些团队在学习研究了多年的InfluxDB后,最终考虑到基于时序分片的复杂度,直接放弃基于InfluxDB开发集群能力,而选择基于Rocksdb、Zookeeper等开源软件,自己搭建一套。在这里,我想说的是,一个缺乏大系统工程化能力的团队,又如何能用已经证明不合适的开源软件,再“堆砌”出比InfluxDB性能和成本优秀的软件呢?

再如,某云厂商,推出了InfluxDB集群版,选择Raft协议实现DATA节点的一致性,但性能低,集群的接入性能不如单机。

笔者在三个月内快速的开发出CP和AP架构分离、基于时序分片、水平扩展等基本集群能力,根据业务的特点和场景痛点,我们在索引引擎、冷热分离、查询实现、第三方协议、高可用性、运营性、连续查询、备份还原等方面也做了大量的工作。

最终的效果,也是符合预期的,例如从替换现有监控系统的后台的实施对比看,我们用了不到10%的机器成本,就支撑了原来Flink、Druid等在支撑的海量监控数据,降低了90%+的成本,成本优势突出,最重要的是,解决了查询超时、数据拉不出来的问题。

InfluxDB是DB-Engines上时序数据库排名第一的时序数据库,是一款非常优秀的软件,直接推动了监控技术进入实时、纳秒级的新时代,除了类SQL查询语言、RESTful API等现代特性,读写性能高、存储压缩率高,生态丰富、强大。

为了更好的推动监控技术的发展,和帮助更多的读者掌握构建实时监控系统的方法、分布式时序型数据库的架构设计和开发技巧,笔者规划了2本书和1个开源软件:

  • 第一本书,也就是本书,侧重InfluxDB的原理和实战,帮助读者吃透InfluxDB的功能原理和掌握实战技巧;
  • 第二本书,在筹划中,侧重InfluxDB的设计实现剖析、分布式技术、InfluxDB集群能力开发实战等,关于第二本书的更多信息和进展,敬请关注机械工业出版社的微信订阅号“华章电子书”上的鲜读;
  • 开源软件,就是FreeTSDB(https://github.com/freetsdb/freetsdb),FreeTSDB的v0.x版本定位为InfluxDB企业版的开源替代,完全对标InfluxDB企业版。

最后,笔者衷心希望《InfluxDB原理与实战》和FreeTSDB能帮助读者更快地掌握InfluxDB的核心特性、功能原理和实战技巧,打造更有竞争力的监控产品,赋能业务。

欢迎交流讨论:

微信公众号:influxdb-dev

FreeTSDB技术交流群(QQ):663274123

为什么是InfluxDB | 写在《InfluxDB原理和实战》出版之际的更多相关文章

  1. InfluxDB从原理到实战 - 什么是InfluxDB

    0x00 什么是InfluxDB InfluxDB是一个由InfluxData开发的开源时序型数据库,专注于海量时序数据的高性能读.高性能写.高效存储与实时分析等,在DB-Engines Rankin ...

  2. InfluxDB学习之InfluxDB的安装和简介

    最近用到了 InfluxDB,在此记录下学习过程,同时也希望能够帮助到其他学习的同学. 本文主要介绍InfluxDB的功能特点以及influxDB的安装过程.更多InfluxDB详细教程请看:Infl ...

  3. InfluxDB学习之InfluxDB的基本操作| Linux大学

    来源地址:https://www.linuxdaxue.com/influxdb-study-series-manual.html 本文属于<InfluxDB系列教程>文章系列,该系列共包 ...

  4. Using InfluxDB in Grafana,influxDB在grafana中使用

    grafana带有功能丰富的数据源插件influxDB.支持丰富的查询编辑器.注释和templating(模版)查询. 增加数据源(Adding the data source) 点击顶部Grafan ...

  5. python写红包的原理流程包含random,lambda其中的使用和见简单介绍

    Python写红包的原理流程 首先来说说要用到的知识点,第一个要说的是扩展包random,random模块一般用来生成一个随机数 今天要用到ramdom中unifrom的方法用于生成一个指定范围的随机 ...

  6. InfluxDB学习之InfluxDB的HTTP API查询操作

    在 InfluxDB学习 的上一篇文章:InfluxDB学习之InfluxDB的HTTP API写入操作 中,我们介绍了使用InfluxDB的HTTP API进行数据写入操作的过程,本文我们再来介绍下 ...

  7. InfluxDB学习之InfluxDB连续查询(Continuous Queries)

    在上一篇:InfluxDB学习之InfluxDB数据保留策略(Retention Policies) 中,我们介绍了 InfluxDB的数据保留策略,数据超过保存策略里指定的时间之后,就会被删除. 但 ...

  8. InfluxDB学习之InfluxDB的HTTP API写入操作

    HTTP API也有两种操作:写入和查询,本文就先给大家介绍一下 InfluxDB的HTTP API的写入操作方式.     在InfluxDB学习的上一篇文章:InfluxDB学习之InfluxDB ...

  9. 手写webpack核心原理,再也不怕面试官问我webpack原理

    手写webpack核心原理 目录 手写webpack核心原理 一.核心打包原理 1.1 打包的主要流程如下 1.2 具体细节 二.基本准备工作 三.获取模块内容 四.分析模块 五.收集依赖 六.ES6 ...

随机推荐

  1. Leetcode(884)-索引处的解码字符串

    给定一个编码字符串 S.为了找出解码字符串并将其写入磁带,从编码字符串中每次读取一个字符,并采取以下步骤: 如果所读的字符是字母,则将该字母写在磁带上. 如果所读的字符是数字(例如 d),则整个当前磁 ...

  2. codeforces 869A

    A. The Artful Expedient time limit per test 1 second memory limit per test 256 megabytes input stand ...

  3. 记一次FreeRTOS错误配置导致无法进入临界区

    最近项目用到FreeRTOS,在实际调试中发现我自己的一段代码本来好用的(在无RTOS的情况下),但是当我在带RTOS的情况下把代码放到一个单独的任务中运行时我发现本来好用的代码莫名其妙的出现问题,有 ...

  4. 机器学习入门实战——基于knn的airbnb房租预测

    数据读取 import pandas as pd features=['accommodates','bathrooms','bedrooms','beds','price','minimum_nig ...

  5. 读写 LED 作业 台灯的 频闪研究1

    读写 LED 作业 台灯的 频闪研究: 核心提示: 随着科技的持续发展,目前已经商业化的照明产品从第一代的白炽灯: 第二代的荧光灯.卤灯: 第三代的高强度气体放电灯; 以及当下主流的, 第四代的发光二 ...

  6. CSS 水平滚动条 bug & width auto increase bug

    CSS 水平滚动条 bug css overflow & width auto increase bug 问题排查方式 删除可疑的模块,一步步找到问题的原因,定位问题所在 寻找可能会导致 wi ...

  7. popstate 事件 & history API

    popstate 事件 & history API URL change 当用户浏览会话历史记录时,活动历史记录条目发生更改时,将触发 Window 界面的 popstate 事件. 它将当前 ...

  8. .NET 面试题: C# override && overloading (C# 覆写 && 重载)

    1 1 1 .NET 面试题, C# ,override , overloading, 覆写, 重载,.NET,ASP.NET, override (覆写/重写): 方法名相同,参数的个数和类型相同, ...

  9. HTML 5.3

    HTML 5.3 W3C Working Draft, 18 October 2018 https://www.w3.org/TR/html53/ refs https://www.w3.org/TR ...

  10. mobile css & rem & em & px

    mobile css & rem & em & px 1 rem === 16px 任意浏览器的默认字体高都是 16px, 所有未经调整的浏览器都符合: 1em=16px, 那 ...