基于 InfluxDB 的服务器性能监控系统实战(二)
3. 数据采集
3.1 选择采集工具
在服务器性能监控系统中,数据采集是获取服务器各项性能指标数据的关键环节。为了实现高效、稳定的数据采集,我们推荐使用 Telegraf 作为数据采集工具。Telegraf 是 InfluxData 公司开发的一款开源的轻量级数据采集代理,它专为时序数据设计,在服务器性能监控场景中展现出了诸多优势。
Telegraf 具有轻量级的特性,这使得它在运行时对服务器资源的占用极低。它采用单进程运行模式,默认内存占用小于 100MB ,即便是在资源有限的嵌入式设备或对资源利用率要求极高的云服务器上,也能稳定运行,不会对服务器的正常业务造成明显的性能影响。例如,在一些小型企业的服务器集群中,服务器配置相对较低,使用 Telegraf 进行数据采集,能够在不影响业务系统运行的前提下,实现对服务器性能指标的全面收集。
Telegraf 支持多插件架构,拥有丰富的插件生态系统。目前官方提供了超过 200 个插件,涵盖了 17 类数据源,包括系统指标(如 CPU、内存、磁盘、网络等)、数据库(如 MySQL、Redis 等)、API 服务(如 Nginx、Apache 等) 。这些插件可以轻松地与各种数据源和目标进行无缝集成,满足不同场景下的多样化数据采集需求。在服务器性能监控中,通过启用 CPU 插件,可以实时采集服务器的 CPU 使用率、负载等指标;启用磁盘插件,可以获取磁盘的读写速率、I/O 等待时间等信息。而且,Telegraf 的插件还支持自定义开发,用户可以根据自身的特殊业务需求,开发专属的采集插件,进一步扩展其功能。
Telegraf 具备跨平台支持能力,能够在 Linux、Windows、macOS、Docker、Kubernetes 等多种环境中部署运行 。这使得它可以适应不同类型的服务器环境,无论是传统的物理服务器,还是基于容器化技术的云服务器,都可以方便地安装和配置 Telegraf 进行数据采集。例如,在一个混合云架构的企业中,部分服务器运行在公有云的 Kubernetes 集群上,部分运行在本地数据中心的物理服务器上,通过 Telegraf 的跨平台特性,可以统一对这些服务器进行性能数据采集,实现对整个服务器架构的全面监控。
Telegraf 的配置非常简易,它使用 TOML 格式的配置文件,用户可以直观、清晰地定义输入、输出和处理器插件 。通过简单的配置修改,就可以灵活地调整数据采集的来源、处理方式和输出目标。例如,通过telegraf --input-filter cpu:mem --output-filter influxdb config > minimal.conf命令,就可以生成一个最小配置文件,用户在此基础上进行简单的参数修改,即可快速实现对 CPU 和内存数据的采集,并将数据输出到 InfluxDB 中。而且,Telegraf 拥有活跃的社区支持,超过 1200 名贡献者持续更新插件和修复问题 。当用户在使用过程中遇到问题时,可以方便地在社区论坛上寻求帮助,获取解决方案,这也为 Telegraf 的广泛应用提供了有力的保障。
3.2 Telegraf 配置
在选择 Telegraf 作为数据采集工具后,接下来需要对其进行详细配置,以实现对服务器各项性能指标的精准采集。以下将以采集服务器的 CPU、内存、磁盘 I/O 等关键性能指标为例,介绍 Telegraf 的配置方法。
- 安装 Telegraf:首先,需要在服务器上安装 Telegraf。以 Linux 系统(CentOS 7 为例) 为例,安装步骤如下:
-
- 下载安装包:从 InfluxData 官方网站(https://dl.influxdata.com/telegraf/releases/)下载适用于 CentOS 7 的 Telegraf 安装包。例如,使用wget命令下载 Telegraf 的 RPM 安装包:
wget https://dl.influxdata.com/telegraf/releases/telegraf-1.31.0-1.x86_64.rpm
- 安装 Telegraf:下载完成后,使用yum命令进行安装:
sudo yum localinstall -y telegraf-1.31.0-1.x86_64.rpm
安装完成后,可以使用telegraf -version命令查看 Telegraf 的版本,确认是否安装成功。
- 配置 Telegraf:Telegraf 的配置文件位于/etc/telegraf/telegraf.conf ,使用文本编辑器(如vi或nano)打开该文件进行配置。
-
- 配置输入插件:输入插件用于定义数据采集的来源。在telegraf.conf文件中,找到[INPUT PLUGINS]部分,进行如下配置:
# 采集CPU性能指标
[[inputs.cpu]]
percpu = true
totalcpu = true
collect_cpu_time = false
report_active = false
core_tags = false
# 采集内存性能指标
[[inputs.mem]]
# 采集磁盘I/O性能指标
[[inputs.disk]]
ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]
在上述配置中:
- [[inputs.cpu]]部分用于配置 CPU 指标采集。percpu = true表示采集每个 CPU 核心的使用率数据;totalcpu = true表示同时采集总的 CPU 使用率数据;collect_cpu_time = false表示不采集 CPU 时间数据;report_active = false表示不计算和报告所有非空闲 CPU 状态的总和;core_tags = false表示不添加 CPU 核心 ID 和物理 ID 标签。
- [[inputs.mem]]部分用于配置内存指标采集,使用默认配置即可采集内存的已使用量、空闲量、总量等指标。
- [[inputs.disk]]部分用于配置磁盘 I/O 指标采集。ignore_fs参数用于指定忽略某些文件系统类型,如tmpfs、devtmpfs等,这些文件系统通常是临时的或虚拟的,不包含实际的磁盘设备,忽略它们可以避免采集到不必要的数据。
- 配置输出插件:输出插件用于定义数据的输出目标,这里我们将采集到的数据输出到 InfluxDB 中。在telegraf.conf文件中,找到[OUTPUT PLUGINS]部分,进行如下配置:
# 输出到InfluxDB
[[outputs.influxdb_v2]]
urls = ["http://your-influxdb-ip:8086"]
token = "your-token"
organization = "your-org"
bucket = "your-bucket"
在上述配置中:
- urls参数指定 InfluxDB 的地址,将your-influxdb-ip替换为实际的 InfluxDB 服务器 IP 地址。
- token参数指定访问 InfluxDB 的 API 令牌,your-token替换为实际的令牌。
- organization参数指定 InfluxDB 中的组织名称,your-org替换为实际的组织名。
- bucket参数指定 InfluxDB 中的桶名称,your-bucket替换为实际的桶名。
- 启动 Telegraf 服务:配置完成后,使用systemctl命令启动 Telegraf 服务,并设置开机自启:
sudo systemctl start telegraf
sudo systemctl enable telegraf
可以使用sudo systemctl status telegraf命令检查 Telegraf 服务是否正常运行。如果服务正常运行,会显示类似如下信息:
● telegraf.service - The plugin-driven server agent for collecting & reporting metrics.
Loaded: loaded (/usr/lib/systemd/system/telegraf.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2024-10-15 11:00:00 CST; 10s ago
Main PID: 5678 (telegraf)
Tasks: 11 (limit: 4915)
Memory: 15.0M
CGroup: /system.slice/telegraf.service
└─5678 /usr/bin/telegraf --config /etc/telegraf/telegraf.conf
至此,Telegraf 的基本配置已完成,它将按照配置定时采集服务器的 CPU、内存、磁盘 I/O 等性能指标数据,并将这些数据发送到 InfluxDB 中进行存储,为后续的数据分析和可视化展示提供数据基础。在实际应用中,还可以根据需要进一步扩展 Telegraf 的配置,添加更多的输入插件以采集其他性能指标,或者对输出插件进行优化,以适应不同的 InfluxDB 部署环境。
4. 数据存储与管理
4.1 数据写入 InfluxDB
在完成 Telegraf 的数据采集配置后,它会按照设定的规则,将采集到的服务器性能指标数据源源不断地写入 InfluxDB 中,这一过程是整个服务器性能监控系统的数据存储基础,确保了监控数据的持续积累和保存。
Telegraf 通过配置好的输出插件outputs.influxdb_v2与 InfluxDB 建立连接 。当 Telegraf 启动后,它会根据配置文件中指定的 InfluxDB 地址(urls)、认证令牌(token)、组织名称(organization)和桶名称(bucket),尝试与 InfluxDB 服务器进行通信。如果连接成功,Telegraf 就可以开始向 InfluxDB 发送数据。
Telegraf 将采集到的数据组织成 InfluxDB 所要求的格式,即数据点(Data Point)格式 。每个数据点包含测量名称(Measurement)、标签集合(Tags)、字段集合(Fields)和时间戳(Timestamp)。以 CPU 使用率数据为例,Telegraf 采集到的数据可能会被组织成如下数据点:
cpu,server_name=server1,region=us-west usage_user=50.0,usage_system=20.0,usage_idle=30.0 1634293800000000000
其中,cpu是测量名称,表示这是 CPU 相关的性能数据;server_name=server1,region=us-west是标签集合,用于标识数据所属的服务器和地区;usage_user=50.0,usage_system=20.0,usage_idle=30.0是字段集合,包含了用户态 CPU 使用率、系统态 CPU 使用率和空闲 CPU 使用率的具体数值;1634293800000000000是时间戳,表示数据采集的时间点。
Telegraf 会按照配置的时间间隔(interval)定期采集数据,并将采集到的数据批量发送到 InfluxDB 中 。这种批量发送的方式可以减少网络传输开销,提高数据写入效率。默认情况下,Telegraf 会将数据缓存到内存中,当缓存的数据量达到一定阈值(metric_batch_size)或者达到指定的刷新时间间隔(flush_interval)时,就会将缓存中的数据发送到 InfluxDB。例如,如果设置interval = "10s",metric_batch_size = 1000,flush_interval = "30s",那么 Telegraf 会每 10 秒采集一次数据,将数据缓存到内存中,当缓存的数据量达到 1000 个或者距离上次发送数据的时间达到 30 秒时,就会将缓存中的数据发送到 InfluxDB。
InfluxDB 接收到 Telegraf 发送的数据后,会对数据进行处理和存储 。它会根据数据点中的测量名称、标签和时间戳,将数据存储到相应的 shard 分组中。InfluxDB 采用了时间结构合并树(TSM,Time-Structured Merge Tree)存储引擎 ,这种引擎将数据先写入内存中的 MemTable,当 MemTable 达到一定大小后,会将其转换为 Immutable MemTable 并持久化到磁盘上的 TSM 文件中。通过这种方式,InfluxDB 实现了高效的数据写入和存储,能够快速处理大量的服务器性能数据。
在数据写入过程中,可能会遇到一些问题,如网络故障、InfluxDB 服务器负载过高导致写入失败等 。为了应对这些情况,Telegraf 提供了一些重试机制和错误处理策略。当数据写入失败时,Telegraf 会根据配置的重试次数(max_retries)和重试间隔(retry_interval)进行重试 。如果经过多次重试后仍然无法写入数据,Telegraf 会将错误信息记录到日志文件中,以便运维人员进行排查和处理。例如,如果设置max_retries = 5,retry_interval = "5s",当数据写入失败时,Telegraf 会每隔 5 秒重试一次,最多重试 5 次。
4.2 数据查询与分析
InfluxDB 提供了强大的查询语言 InfluxQL,通过它可以方便地对存储在 InfluxDB 中的服务器性能数据进行查询和分析,挖掘数据背后的价值,为服务器的性能优化和故障排查提供有力支持。
InfluxQL 的基本语法类似于 SQL,对于熟悉 SQL 的开发者来说,上手难度较低 。其基本的查询语句结构如下:
SELECT <field_key>[,<field_key>,<tag_key>]
FROM <measurement_name>[,<measurement_name>]
WHERE <condition>
GROUP BY <field_key>
ORDER BY <time>
其中:
- SELECT子句用于指定要查询的字段或标签,field_key表示字段名,tag_key表示标签名。
- FROM子句用于指定要查询的数据所属的测量,measurement_name表示测量名称。
- WHERE子句用于添加查询条件,可以对时间戳、标签和字段进行条件匹配。
- GROUP BY子句用于对查询结果进行分组,可以按照字段或时间间隔进行分组。
- ORDER BY子句用于对查询结果进行排序,通常按照时间戳进行排序。
下面通过一些具体的实例来展示 InfluxQL 在服务器性能数据查询和分析中的应用。
查询某台服务器的 CPU 使用率:
SELECT "usage_user", "usage_system", "usage_idle"
FROM "cpu"
WHERE "server_name" ='server1' AND time > now() - 1h
上述查询语句从cpu测量中选择usage_user(用户态 CPU 使用率)、usage_system(系统态 CPU 使用率)和usage_idle(空闲 CPU 使用率)字段,条件是server_name标签为server1且时间在过去一小时内的数据。通过这条查询语句,可以获取server1服务器在过去一小时内的 CPU 使用情况。
查询所有服务器的平均内存使用率:
SELECT MEAN("used") / MEAN("total") * 100 AS "avg_memory_usage"
FROM "memory"
这条查询语句从memory测量中计算所有服务器的平均内存使用率。MEAN("used")表示计算已使用内存的平均值,MEAN("total")表示计算总内存的平均值,两者相除再乘以 100 得到平均内存使用率,并将结果命名为avg_memory_usage。通过这条查询语句,可以了解所有服务器的整体内存使用情况。
按时间间隔统计服务器的磁盘 I/O 读写速率:
SELECT MEAN("read_bytes"), MEAN("write_bytes")
FROM "diskio"
WHERE "server_name" ='server2'
GROUP BY time(5m)
上述查询语句从diskio测量中选择server2服务器的磁盘读取字节数(read_bytes)和写入字节数(write_bytes)的平均值,并按照 5 分钟的时间间隔进行分组。通过这条查询语句,可以查看server2服务器在不同时间段内的磁盘 I/O 读写速率变化情况。
查询服务器性能指标的最大值、最小值和平均值:
SELECT MAX("usage_user"), MIN("usage_user"), MEAN("usage_user")
FROM "cpu"
WHERE "server_name" ='server3' AND time > now() - 1d
这条查询语句从cpu测量中获取server3服务器在过去一天内的 CPU 使用率的最大值、最小值和平均值。通过这些统计数据,可以对服务器的 CPU 性能波动情况有一个全面的了解,判断服务器是否存在性能瓶颈。
InfluxQL 还支持使用正则表达式进行标签过滤 ,例如:
SELECT "value"
FROM "disk_free"
WHERE "host" =~ /server[1-3]/
GROUP BY "host"
上述查询语句从disk_free测量中选择字段value,条件是host标签匹配正则表达式/server[1-3]/的数据,即host标签为server1、server2或server3的数据,并按照host标签进行分组。这种方式可以方便地对一组具有相似特征的服务器进行数据查询和分析。
在实际的服务器性能监控和分析中,还可以结合多个查询条件和聚合函数,进行更复杂的数据分析 。例如,同时查询服务器的 CPU 使用率和内存使用率,并按照时间间隔进行分组,计算每个时间段内的平均值和最大值:
SELECT
MEAN("usage_user") AS "avg_cpu_usage",
MAX("usage_user") AS "max_cpu_usage",
MEAN("used") / MEAN("total") * 100 AS "avg_memory_usage",
MAX("used") / MAX("total") * 100 AS "max_memory_usage"
FROM "cpu", "memory"
WHERE "server_name" ='server4' AND time > now() - 1h
GROUP BY time(10m)
通过这样的查询语句,可以全面了解server4服务器在过去一小时内的 CPU 和内存使用情况,以及它们随时间的变化趋势,为服务器的性能评估和优化提供详细的数据依据。