百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

活用时序数据库,玩转自动化监控

bigegpt 2024-08-06 12:03 3 浏览

InfluxDB是一款用Go语言编写的开源分布式时序、事件和指标数据库,无需外部依赖。该数据库现在主要用于存储涉及大量的时间戳数据,如DevOps监控数据,APP metrics, loT传感器数据和实时分析数据。

InfluxDB特征

? 无结构(无模式):可以是任意数量的列(tags)。

? 可以设置metric的保存时间。

? 支持与时间有关的相关函数(如min、max、sum、count、mean、median等),方便统计。

? 支持存储策略:可以用于数据的删改(influxDB没有提供数据的删除与修改方法)。

? 支持连续查询:是数据库中自动定时启动的一组语句,和存储策略搭配可以降低InfluxDB的系统占用量。

? 支持类似SQL语法。

? 支持设置数据在集群中的副本数。

? 支持定期采样数据,写入另外的measurement,方便分粒度存储数据。

? 自带web管理界面,方便使用(登入方式:http://< InfluxDB-IP >:8083)。

? 最关键的一点,也是我采用的原因,支持Grafana画图展示。

有了InfluxDB+Grafana后,你就可以用python写一些简单的程序了,可以只负责写后端逻辑部分,数据都可以存入InfluxDB,然后通过Grafana展示出来,然后做一系列的监控工作,后面会进行详细介绍

influxdb安装


二进制安装,这里以centos6.5为例进行安装。

wget https://dl.influxdata.com/influxdb/releases/influxdb-1.1.0.x86_64.rpm

yum localinstall influxdb-1.1.0.x86_64.rpm

安装后,在/usr/bin下面有如下文件。



influxd influxdb服务器
influx influxdb命令行客户端
influx_inspect 查看工具
influx_stress 压力测试工具
influx_tsm 数据库转换工具(将数据库从b1或bz1格式转换为tsm1格式)
在/var/lib/influxdb/下面会有如下文件夹data 存放最终存储的数据,文件以.tsm结尾
meta 存放数据库元数据
wal 存放预写日志文件
InfluxDB基本概念


在具体的讲解influxdb的相关操作之前先说说influxdb的一些专有名词,这些名词代表什么。先看下面一段Influxdb中的表信息。

> select * from disk;

name: disk

time count device free hostname used used_percent

---- ----- ------ ---- -------- ---- ------------

1502089306183159978 1 /data 80 server01 100 60.33

1502089342879496791 1 /data 90 server02 110 68.33

InfluxDB是时序数据库,所以怎么都绕不开时间,第一纵列time存储着时间戳,而时间戳是与数据进行关联,这样才能将时间和数据进行展示。

influxDB中的名词

database 数据库名,在InfluxDB中可以创建多个数据库,不同数据库中的数据文件是隔离存放的,存放在磁盘上的不同目录
measurement 测量指标名,相当于传统数据库表名
tag 标签,在InfluxDB中,tag是一个非常重要的部分,表名+tag一起作为数据库的索引,是”key-value”的形式
tag key 各种索引的key
tag value 各种索引的value
tag set 由一系列的tag组成。tags 在 InfluxDB 中会按照字典序排序,不管是 tagk 还是 tagv,只要不一致就分别属于两个 key,例如 host=server01,region=us-west 和 host=server02,region=us-west 就是两个不同的 tag set
field 数据,field主要是用来存放数据的部分,也是”key-value”的形式
field key 各种记录key
field value field对应的value就是fieldName,InfluxDB中支持一条数据中插入多个fieldName,这其实是一个语法上的优化,在实际的底层存储中,是当作多条数据来存储
field set 由一系列的key=value组成key set
timestamp 时间戳,作为时序型数据库,时间戳是InfluxDB中最重要的部分,在插入数据时可以自己指定也可留空让系统指定,在插入新数据时,tag、field和timestamp之间用空格分隔。在 TSM 存储引擎中会特殊对待,为了优化后续的查询操作
series 序列,所有在数据库中的数据,都需要通过图表来展示,而这个series表示这个表里面的数据,可以在图表上画成几条线,通过tags排列组合算出来
Retention policy 数据保留策略,可以定义数据保留的时长,每个数据库可以有多个数据保留策略,但只能有一个默认策略,InfluxDB 会定期清除过期的数据


InfluxDB基本操作



#创建数据库create database "db_name"
#显示所有的数据库show databases
#删除数据库drop database "db_name"
#使用数据库;use db_name
#显示该数据库中所有的表;show measurements
#创建表,直接在插入数据的时候指定表名(key-value)insert disk,hostname=server02,device=/data free=90,used=110,used_percent=98.33,count=1
#删除表;drop measurement "measurement_name"
python操作influxdb数据库


安装influxdb-python


pip install influxdb

使用python操作influxdb,数据库操作完整示例如下

#! /usr/bin/env python
#-*- coding:utf-8 -*-
from influxdb import InfluxDBClient
client = InfluxDBClient(‘localhost‘, 8086, ‘root‘, ‘‘, ‘‘) # 初始化
print client.get_list_database() # 显示所有数据库名称
client.create_database(‘testdb‘) # 创建数据库
print client.get_list_database() # 显示所有数据库名称
client.drop_database(‘testdb‘) # 删除数据库
print client.get_list_database() # 显示所有数据库名称

创建新表并添加数据


InfluxDB没有提供单独的建表语句,可以通过并添加数据的方式建表,示例如下

json_body = [

{

"measurement": "students",

"tags": {

"stuid": "s123"

},

#"time": "2017-03-12T22:00:00Z",

"fields": {

"score": 89

}

}

]

client = InfluxDBClient(‘localhost‘, 8086, ‘root‘, ‘‘, ‘testdb‘) # 初始化(指定要操作的数据库)

client.write_points(json_body) # 写入数据,同时创建表

利用时序数据库进行自动化监控


以上讲解了influxdb的基本使用,后面谈一下influxdb在监控中的应用,使用python脚本将监控数据存入influnxdb,然后使用grafana进行图表显示。下面案例是监控图片上传到七牛云存储的上传和下载时间,以及ping七牛域名的响应时间,在工作中我们经常上传云存储比较慢的现象,我们将采集到的数据存入到influnx


##
脚本放到linux的crontab脚本中,1分钟执行一次,每次执行会将数据打印到influnxdb进行存储# -*- coding: utf-8 -*-
import os,sys,commands
import datetime
from influxdb import InfluxDBClient
import sys, time, subprocess,os
logFile = os.getcwd()+"/vrping.log"
#打印日志函数
def logger(logContent,logFile):
 with open(logFile,'a') as f:
 f.write(logContent+'\n')
#获取时期函数
def get_today_date():
 now_time = datetime.datetime.now()
 yes_time = now_time + datetime.timedelta(days=0)
 yes_time_nyr = yes_time.strftime('%Y-%m-%d')
 result = str(yes_time_nyr)
 return result
def annotate(time_loss,time_delay,server_name,Average_Speed,Average_Time,used_time):
 """Send the data across to InfluxDB as an annotation"""
# client = InfluxDBClient("10.99.69.40", 8086, 'testdb')
#连接influnxdb
 client = InfluxDBClient('10.99.69.40', 8086, 'root', '', 'testdb')
#构造数据
 data = [
 {
 # The 'table'
 "measurement": "vr_ping",
 # Metadata
 "tags": {
 "stuid": "sdds"
 },
 # Data
 "fields": {
 "time_loss": time_loss,
 "time_delay": time_delay,
 "server_name":server_name,
 "Average_Speed":Average_Speed,
 "Average_Time":Average_Time,
 "used_time":used_time
 }
 }
 ]
 try:
 client.write_points(data)
 except Exception as e:
 logger("写入数据失败",logFile)
 print e
#定义函数,制作数据写入influnxdb
def vr_ping(server_name):
 file = '/tmp/zabbix-vr.jpg'
 command = 'wget --timeout=3 http://oe9anrc75.bkt.clouddn.com/zabbix-vr.jpg?attname= -O %s' % file
 cmd1="ping -W 0.5 -i 0.05 -c 1 {0} -w 1|grep -oP '(?<=time\=)[0-9.]+'||echo 1000.1".format(server_name)
 cmd2="ping -W 0.5 -i 0.05 -c200" +" " + server_name +" "+ " -w 15|grep loss|awk '{print (200-$4)/200*100}'"
 cmd3 = "/root/qshell fput panop2 zabbix-vr.jpg /root/zabbix-vr.jpg true|grep 'Average Speed:'|awk '{print $(NF-1)}'"
 cmd4 = "/root/qshell fput panop2 zabbix-vr.jpg /root/zabbix-vr.jpg true|grep 'Average Speed:'|awk '{print $3}'"
 (status, output) = commands.getstatusoutput(cmd1)
 if status == 0:
 time_delay=output
 else:
 logger("time_delay 执行失败",logFile)
 (status, output) = commands.getstatusoutput(cmd2)
 if status == 0:
 time_loss=output
 else:
 logger("time_loss 执行失败", logFile)
 (status, output) = commands.getstatusoutput(cmd3)
 Average_Speed = output
 (status, output) = commands.getstatusoutput(cmd4)
 Average_Time = output
 # command = 'wget --timeout=3 http://oanphm9zg.bkt.clouddn.com/0cf863.m3u8?attname= -O %s' % file
 #print command
 start_time = time.time()
 # print start_time
 sp = subprocess.Popen(command, bufsize=1024, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
 close_fds=True)
 out, err = sp.communicate()
 end_time = time.time()
 # print end_time
 if err:
 if '200 OK' not in err:
 used_time = 5
 print used_time
 sys.exit(1)
 used_time = (end_time - start_time).seconds
 used_time = round(used_time,2)
 os.remove(file)
 annotate(time_loss, time_delay, server_name,Average_Speed,Average_Time,used_time)
vr_ping('up.qiniu.com')

结合grafana使用


grafana 是一款界面美观、强大的可视化监控指标展示工具,采用 go 语言编写的开源应用,主要用于大规模指标数据的可视化展现,基于商业友好的 Apache License 2.0 开源协议。

grafana安装



$ wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.2.0-1.x86_64.rpm
$ sudo yum localinstall grafana-4.2.0-1.x86_64.rpm
grafana启动service grafana-server start
grafana后台页面访问http://IP:3000

Grafana添加IfluxDB为数据源


利用grafana进行画图


总结


在我们平时工作中,会遇到各式各样的监控,使用python +influnxdb+grafana进行数据改造、数据入库、数据图形化显示是一种比较灵活常见的方式,在工作中会遇到很多,不管是业务数据还是机器基础监控数据,都可以将数据打点,最后展示出比较友好的图形化界面。

相关推荐

Linux 系统启动完整流程

一、启动系统流程简介如上图,简述系统启动的大概流程:1:硬件引导UEFi或BIOS初始化,运行POST开机自检2:grub2引导阶段系统固件会从MBR中读取启动加载器,然后将控制权交给启动加载器GRU...

超专业解析!10分钟带你搞懂Linux中直接I/O原理

我们先看一张图:这张图大体上描述了Linux系统上,应用程序对磁盘上的文件进行读写时,从上到下经历了哪些事情。这篇文章就以这张图为基础,介绍Linux在I/O上做了哪些事情。文件系统什么是...

linux入门系列12--磁盘管理之分区、格式化与挂载

前面系列文章讲解了VI编辑器、常用命令、防火墙及网络服务管理,本篇将讲解磁盘管理相关知识。本文将会介绍大量的Linux命令,其中有一部分在“linux入门系列5--新手必会的linux命令”一文中已经...

Linux环境下如何设置多个交叉编译工具链?

常见的Linux操作系统都可以通过包管理器安装交叉编译工具链,比如Ubuntu环境下使用如下命令安装gcc交叉编译器:sudoapt-getinstallgcc-arm-linux-gnueab...

可算是有文章,把Linux零拷贝技术讲透彻了

阅读本文大概需要6.0分钟。作者:卡巴拉的树链接:https://dwz.cn/BaQWWtmh本文探讨Linux中主要的几种零拷贝技术以及零拷贝技术适用的场景。为了迅速建立起零拷贝的概念...

linux软链接的创建、删除和更新

大家都知道,有的时候,我们为了省下空间,都会使用链接的方式来进行引用操作。同样的,在系统级别也有。在Windows系列中,我们称其为快捷方式,在Linux中我们称其为链接(基本上都差不多了,其中可能...

Linux 中最容易被黑客动手脚的关键目录

在Linux系统中,黑客攻击后常会针对关键目录和文件进行修改以实现持久化、提权或隐藏恶意活动。本文介绍下黑客最常修改的目录及其手法。一、/etc目录关键文件有:/etc/passwd和/et...

linux之间传文件命令之Rsync傻瓜式教程

1.前言linux之间传文件命令用什么命令?本文介绍一种最常用,也是功能强大的文件同步和传输工具Rsync,本文提供详细傻瓜式教程。在本教程中,我们将通过实际使用案例和最常见的rsync选项的详细说...

Linux下删除目录符号链接的方法

技术背景在Linux系统中,符号链接(symlink)是一种特殊的文件,它指向另一个文件或目录。有时候,我们可能需要删除符号链接,但保留其指向的目标目录。然而,在删除符号链接时可能会遇到一些问题,例如...

阿里云国际站注册教程:aa云服务器怎么远程链接?

在全球化的今天,互联网带给我们无以计数的便利,而云服务器则是其中的重要基础设施之一。这篇文章将围绕阿里云国际站注册、aa云服务器如何远程链接,以及服务器安全防护如Ddos防火墙、网站应用防护waf防火...

Linux 5.16 网络子系统大范围升级 多个新适配器驱动加入

Linux在数据中心中占主导地位,因此每个内核升级周期的网络子系统变化仍然相当活跃。Linux5.16也不例外,周一最新与网络相关的更新加入了大量的驱动和新规范的支持。一个较新硬件的驱动是Realt...

搭建局域网文件共享服务(Samba),手机电脑都能看喜欢的影视剧

作为一名影视爱好者,为了方便地观看自己喜欢的影视作品,在家里搞一个专门用来存放电影的服务器是有必要的。蚁哥选则用一台Ubuntu系统的电脑做为服务器,共享影音文件,其他同一个局域网内的电脑或手机可以...

分享一个实用脚本—centos7系统巡检

概述这周闲得慌,就根据需求写了差不多20个脚本(部分是之前分享过的做了一些改进),今天主要分享一个给平时运维人员用的centos7系统巡检的脚本,或者排查问题检查系统情况也可以用..实用脚本#!/bi...

Linux 中创建符号链接的方法

技术背景在Linux系统里,符号链接(SymbolicLink),也被叫做软链接(SoftLink),是一种特殊的文件,它指向另一个文件或者目录。符号链接为文件和目录的管理带来了极大的便利,比...

一文掌握 Linux 符号链接

符号链接(SymbolicLink),通常被称为“软链接”,是Linux文件系统中一种强大而灵活的工具。它允许用户创建指向文件或目录的“快捷方式”,不仅简化了文件管理,还在系统配置、软件开发和日...