Uber开发了指标平台M3和分布式时间序列数据库M3DB。来解决Uber在发展过程当中遇到的问题:使用开源软件后,因为可靠性,成本等问题,在操做密集型方面没法大规模使用这些开源软件。因此Uber逐步构建了本身的指标平台。咱们利用经验来帮助咱们构建本地分布式时间序列数据库,高度动态和高性能的聚合服务,查询引擎以及其余支持基础架构。

架构

M3包括了以下的组件:

  • M3DB – M3db是一个使用TSDB(时间数据库),保存全部Prometheus指标,M3db是分布式,高可用性和复制的数据库,它使用Etcd做为共识算法。
  • M3Coordinator – 是Prometheus实例与M3db之间的适配器,它公开了Prometheus用来从数据库中推送和提取数据的读/写端点。
  • M3Query – 众所周知,Prometheus努力处理显示大量数据的查询,而不是从Prometheus提取数据,M3Query实现了相同的PromQL并能够响应此类请求。
  • M3Aggregator – 可选但很重要,此服务将下降指标的采样率,为长期存储作好准备。

总体架构图以下:

关于M3,咱们目前积累了一些生产实践。目前的问题是,社区不够活跃,文档也不够丰富。不少时候遇到问题,只能去研究代码。M3query对PromSql支持的不够,因此M3query并不能生产环境使用。

调研

首先,我们想把大量的数据存储到m3中,给prometheus进行查询告警。但是数据量很大,m3db数据插入性能是有必要进行保证的。

之前写过一个adapter,将数据转化为json调用json api将数据已经插入了m3db中,当时对数据性能没有要求,这次使用json api进行压测的时候,发现性能很差,而且在数据并发达到100个goroutine,一个goroutine发送100条数据,m3db就崩溃了,不接受连接。然后简单的测试了一下得到以下的数据

这个远远达不到要求啊,于是看看有没有批量操作的接口,官方文档说明,有两种方式插入数据

Test RPC
To test out some of the functionality of M3DB there are some user friendly HTTP JSON APIs that you can use. These use the DB node cluster service endpoints.

Note: performance sensitive users are expected to use the more performant endpoints via either the Go src/dbnode/client/Session API, or the GRPC endpoints exposed via src/coordinator.
  1. go api(src/dbnode/client/Session),session看代码使用的是apache的thrift rpc。

  2. GRPC(src/coordinator)

    官方提供了benchmark(src/query/benchmark),于是去编译进行测试,但是m3开源的太差了,很多第三方库都是使用的老版本,兼容性很差,各种api对不上,也不把自己的vendor包一同开源,踩了许多坑:

    1. github.com/thrift —0.10.0

    2. github.com/uber-go/tally—3.3.7

    3. client_golang—0.8.0

    4. github.com/coreos/etcd—–3.2.0,还是缺少参数,坑

    5. google.golang.org/grpc–laster

    6. golang.org/x/text——laster

    7. github.com/satori/go.uuid—-1.2.0

    8. github.com/couchbase/vellum—–master

    9. github.com/pilosa/pilosa-最新班都缺少参数

还是没有编译完成,后续持续跟进,看看官方有没有继续开源和改进。

目前得到以下结论

m3db目前没有发现批量处理的方式

  1. Coordinator的方式最后还是一条一条的发送(通过查看代码,未能运行)

  2. session方式,其中一个包github.com/pilosa/pilosa/roaring目前最新版本都没有m3中使用的参数,最终无法编译使用。网上使用session运行成功的,我未能找到他使用了什么版本的github.com/pilosa/pilosa/roaring包。但是通过他运行的结果来看(结合代码api),也是一条一条发送的。

  3. m3中很多都是老版本的库,兼容性很差,api很多不兼容,官方也未推出他使用了什么库,如果继续,应该需要大量的时间去校验和编译