为什么是InfluxDB | 写在《InfluxDB原理和实战》出版之际
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原理和实战》出版之际的更多相关文章
- InfluxDB从原理到实战 - 什么是InfluxDB
		0x00 什么是InfluxDB InfluxDB是一个由InfluxData开发的开源时序型数据库,专注于海量时序数据的高性能读.高性能写.高效存储与实时分析等,在DB-Engines Rankin ... 
- InfluxDB学习之InfluxDB的安装和简介
		最近用到了 InfluxDB,在此记录下学习过程,同时也希望能够帮助到其他学习的同学. 本文主要介绍InfluxDB的功能特点以及influxDB的安装过程.更多InfluxDB详细教程请看:Infl ... 
- InfluxDB学习之InfluxDB的基本操作| Linux大学
		来源地址:https://www.linuxdaxue.com/influxdb-study-series-manual.html 本文属于<InfluxDB系列教程>文章系列,该系列共包 ... 
- Using InfluxDB in Grafana,influxDB在grafana中使用
		grafana带有功能丰富的数据源插件influxDB.支持丰富的查询编辑器.注释和templating(模版)查询. 增加数据源(Adding the data source) 点击顶部Grafan ... 
- python写红包的原理流程包含random,lambda其中的使用和见简单介绍
		Python写红包的原理流程 首先来说说要用到的知识点,第一个要说的是扩展包random,random模块一般用来生成一个随机数 今天要用到ramdom中unifrom的方法用于生成一个指定范围的随机 ... 
- InfluxDB学习之InfluxDB的HTTP API查询操作
		在 InfluxDB学习 的上一篇文章:InfluxDB学习之InfluxDB的HTTP API写入操作 中,我们介绍了使用InfluxDB的HTTP API进行数据写入操作的过程,本文我们再来介绍下 ... 
- InfluxDB学习之InfluxDB连续查询(Continuous Queries)
		在上一篇:InfluxDB学习之InfluxDB数据保留策略(Retention Policies) 中,我们介绍了 InfluxDB的数据保留策略,数据超过保存策略里指定的时间之后,就会被删除. 但 ... 
- InfluxDB学习之InfluxDB的HTTP API写入操作
		HTTP API也有两种操作:写入和查询,本文就先给大家介绍一下 InfluxDB的HTTP API的写入操作方式. 在InfluxDB学习的上一篇文章:InfluxDB学习之InfluxDB ... 
- 手写webpack核心原理,再也不怕面试官问我webpack原理
		手写webpack核心原理 目录 手写webpack核心原理 一.核心打包原理 1.1 打包的主要流程如下 1.2 具体细节 二.基本准备工作 三.获取模块内容 四.分析模块 五.收集依赖 六.ES6 ... 
随机推荐
- python to exe
			使用pyinstaller 打包 文件结构如下 命令行cd 进入 project文件夹 ,然后 命令 pyinstaller -F main.py 即可打包文件为一个完整的exe.(不含DLL等) 
- Leetcode(102)-二叉树的层次遍历
			给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层 ... 
- C# LINQ (2)
			Limiting Data -- Take() and Skip() 前面讲了 筛选 和 排序,现在讲 选取皇帝选妃,层层选拔,最后留几个,让他过目,他选一个或者几个作为妃子,大概是这么个意思Take ... 
- 读js DOM编程艺术总结
			第一章主要介绍一些历史性问题,javascript是Netcape和sun公司合作开发的. 第二章JavaScript语法: 1,数据类型:(弱类型)字符串,数值,布尔值(只有true和false,不 ... 
- ROM、SDRAM、RAM、DRAM、SRAM、FLASH的区别
			ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写.ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是 ... 
- QUIC协议文档翻译——什么是QUIC
			原文地址https://docs.google.com/document/d/1gY9-YNDNAB1eip-RTPbqphgySwSNSDHLq9D5Bty4FSU/edit QUIC是一个谷歌提出 ... 
- IT-ebooks free download website & IT 电子书籍免费下载网站
			free ebooks of programming 1. http://www.it-ebooks.info/ http://www.it-ebooks-api.info/ 2. http://ww ... 
- HTML Custom Elements & valid name
			HTML Custom Elements & valid name valid custom element name https://html.spec.whatwg.org/multipa ... 
- vue render html string
			vue render html string shit element ui render string array relativeShowConvert(data) { // log(`data` ... 
- nodejs ECMAScript 模块
			node 文档 main.mjs import path from 'path'; import logger from './logger.js'; logger.show('hello world ... 
