外链论坛

 找回密码
 立即注册
搜索
查看: 55|回复: 3

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

[复制链接]

2651

主题

412

回帖

9118万

积分

论坛元老

Rank: 8Rank: 8

积分
91180395
发表于 2024-8-18 04:18:01 | 显示全部楼层 |阅读模式

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是时序数据库,因此怎么都绕不开时间,第1纵列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进行数据改造、数据入库、数据图形化表示是一种比较灵活平常的方式,在工作中会遇到非常多,不管是业务数据还是设备基本监控数据,都能够将数据打点,最后展示出比较友好的图形化界面。

回复

使用道具 举报

0

主题

1万

回帖

1

积分

新手上路

Rank: 1

积分
1
发表于 2024-9-3 07:40:25 | 显示全部楼层
真情实感,其含义为认真了、走心了的意思,是如今的饭圈常用语。
回复

使用道具 举报

11

主题

876

回帖

894

积分

高级会员

Rank: 4

积分
894
发表于 2024-9-6 17:27:36 | 显示全部楼层
你的话深深触动了我,仿佛说出了我心里的声音。
回复

使用道具 举报

2671

主题

5680

回帖

9911万

积分

论坛元老

Rank: 8Rank: 8

积分
99110473
发表于 5 天前 | 显示全部楼层
楼主听话,多发外链好处多,快到碗里来!外链论坛 http://www.fok120.com/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|外链论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-10-5 13:20 , Processed in 0.079041 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.