前言

之前的文章中我们部署了基于Prometheus和Grafana的监控系统,但是还是有一个不足的地方,监控数据有失效时间,

为了能保留较长时间的历史数据,这里需要引入远程存储

在Prometheus的集成文档中列出了不少可以作为存储的组件,从文档数量和安装简易度考虑,这里选择的是influxDB

InfluxDB 安装配置

以下配置流程适用于centos7

1
2
3
4
5
6
7
8
$ cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL \$releasever
baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF

如果你使用的是其他环境可以参考官方文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ sudo yum install influxdb
$ sudo systemctl start influxdb

# RFC3339 format (YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ).
$ influx -precision rfc3339
Connected to http://localhost:8086 version 1.7.7
InfluxDB shell version: 1.7.7
> CREATE DATABASE "prometheus"
> SHOW DATABASES
name: databases
name
----
_internal
prometheus

修改prometheus.yml配置文件,添加如下配置
这里没有给influxDB开启认证机制

1
2
3
4
5
6
$ vim prometheus.yml
remote_write:
- url: "http://localhost:8086/api/v1/prom/write?db=prometheus"

remote_read:
- url: "http://localhost:8086/api/v1/prom/read?db=prometheus"

修改配置后重启prometheus服务

之后再influxDB里就能查看到监控指标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
> show measurements
go_gc_duration_seconds
go_gc_duration_seconds_count
go_gc_duration_seconds_sum
go_goroutines
go_info
go_memstats_alloc_bytes
go_memstats_alloc_bytes_total
go_memstats_buck_hash_sys_bytes
go_memstats_frees_total
go_memstats_gc_cpu_fraction
...
prometheus_tsdb_head_truncations_total
prometheus_tsdb_lowest_timestamp
prometheus_tsdb_lowest_timestamp_seconds
prometheus_tsdb_reloads_failures_total
prometheus_tsdb_reloads_total
...

> select * from go_info
# 输出从略

目前只能从最新的监控数据导入,历史数据无法导入。

1
2
3
4
5
6
#当前存储的监控指标有12706个
> select * from _internal.."database" where "database"=~/prometheus/ order by time desc limit 1
name: database
time database hostname numMeasurements numSeries
---- -------- -------- --------------- ---------
1564985100000000000 prometheus localhost.localdomain 455 12706

Database names, measurements, tag keys, field keys, and tag values are stored only once and always as strings. Only field values and timestamps are stored per-point.
Non-string values require approximately three bytes. String values require variable space as determined by string compression

以上文字来自InfluxDB官网,据此估算每个月需要保存约20亿个点的数据。不负责任地估算约要6G的空间

当前最新的稳定开源版本不支持集群功能(可以付费使用商业版或者云版开启集群特性)

这里配置的单机存储就会带来两个问题

  • 数据存储的横向扩展
  • 集群的可用性

数据存储按之前的计算(20亿个数据6GB/月),用个大点的SSD,存个几年的数据应该是绰绰有余的

集群的可用性问题可以通过定时备份来解决

生产环境的优化

influxDB需要频繁地读写硬盘,因而最好将其运行在1000 IOPS的SSD上。

如果从停机状态恢复,IOPS建议大于2000,否则可能需要较长时间恢复。

默认情况下,表的数据存储在/var/lib/influxdb/data目录,wal日志存储在/var/lib/influxdb/wal目录下

当磁盘写入负载过高时,将这两个目录挂载到不同的存储设备下,这样可以有效减少磁盘资源的竞用问题。

备份和导入

可以参照此官方文档

1
2
3
# 一个简单的示例
$ influxd backup -portable -database <database-name> <path-to-backup>
$ influxd restore -portable -db <database-name> <path-to-backup>

参考链接

  1. Prometheus endpoints support in InfluxDB
  2. Howto: Add a new yum repository to install software under CentOS / Redhat Linux
  3. Hardware sizing guidelines
  4. InfluxDB FAQ