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. Rails框架学习

    Don't Repeat Yourself! Convention Over Configuration. REST. Rails框架总览. Rails框架基本使用. Rails框架数据交互. Rai ...

  2. 【哈希表】leetcode454——四数相加II

    编号454:四数相加II 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0. 为 ...

  3. javascript questions & code review

    javascript questions & code review refs https://github.com/learning-js-by-reading-source-codes/j ...

  4. ACM-ICPC国际大学生程序设计竞赛北京赛区(2015)网络赛

    #1235 : New Teaching Buildings 时间限制:2000ms 单点时限:2000ms 内存限制:256MB 描述 Thanks to the generous finance ...

  5. SVG path d Attribute

    Scalable Vector Graphics (SVG) 1.1 (Second Edition) W3C Recommendation 16 August 2011 http://www.w3. ...

  6. nodemon all in one

    nodemon all in one https://nodemon.io/ https://github.com/remy/nodemon#nodemon https://www.npmjs.com ...

  7. 旅游玩乐 业务组件 UI 交互

    旅游玩乐 业务组件 UI 交互 旅游业务组件 ctrip PC web https://piao.ctrip.com/dest/t4651499.html M web https://m.ctrip. ...

  8. tslint 忽略对某行代码的检测

    tslint rules class Ajanuw { constructor() { console.log("hello ajanuw"); } } // @ts-ignore ...

  9. HANNAH WHITE:不拖延的人生是什么样子的?

    不拖延的人生,究竟是什么样子呢?近日,星盟投资总经理HANNAH在一档人物采访栏目中表示,不拖延的人生,真的是太爽了! HANNAH在栏目中讲了一个曾经公司同事的故事.她说,那位同事总是喜欢拖延.每次 ...

  10. Java并发包源码学习系列:同步组件Semaphore源码解析

    目录 Semaphore概述及案例学习 类图结构及重要字段 void acquire() 非公平 公平策略 void acquire(int permits) void acquireUninterr ...